讲究的乔治 发表于 2019-10-8 19:40:00

C语言的单链表问题,求助!

(1)定义单链表link1,用尾插入法创建link1,并输出创建后的link1元素序列。
(2)计算link1的长度,并将结果存放在头结点的数据域中,然后输出单链表的所有元素(包含头结点,头结点作为第一个输出)
单链表的函数已完成,第二题求解,怎么调用函数?

理想小青年 发表于 2019-10-8 20:13:10

从头开始写就太麻烦了,如果你会的话就
https://blog.51cto.com/13352079/2126869
参考上面代码改改吧{:10_256:}

讲究的乔治 发表于 2019-10-8 20:48:33

理想小青年 发表于 2019-10-8 20:13
从头开始写就太麻烦了,如果你会的话就
https://blog.51cto.com/13352079/2126869
参考上面代码改改吧{:1 ...

头文件我已经完成了,只需要写主函数即可,第二问有点不知道怎么调用函数

讲究的乔治 发表于 2019-10-8 20:51:24

#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
//using namespace std;
typedefintelemtype;
typedefstructnode   //结点类型定义
{
elemtypedata;
structnode*next;
} LinkList,node;


LinkList*Init_LinkList()/*初始化空的单链表*/
{        elemtypeix;
        LinkList*head, *p;
        head = (LinkList *) malloc ( sizeof( LinkList ) );
        head->next = NULL;
        return(head);
}

LinkList*Create_LinkListF()/*头插法建立带头结点的单链表函数*/
{        elemtypeix;
        LinkList*head, *p;
        head = (LinkList *) malloc ( sizeof( LinkList ) );
        head->next = NULL;
        printf("请输入数据直到输入0结束:\n");
        scanf("%d", &ix);
        while (ix != 0)
      {    p = (LinkList *) malloc( sizeof( LinkList ) );        //①
             p->data = ix;                                        //②
             p->next = head->next;                                //③
             head->next = p;                                        //④
             scanf("%d", &ix);
        }
        return(head);
}

LinkList *Create_LinkListR( ) /*尾插法建立带头结点的单链表函数*/
{        elemtypeix;
        LinkList*head, *p, *tail;
        head = (LinkList *) malloc ( sizeof( LinkList ) );
        head->next = NULL;                                                 tail = head;
    printf("请输入数据直到输入0结束:\n");
        scanf("%d", &ix);
        while (ix != 0)
      {        p = (LinkList *) malloc( sizeof( LinkList ) );
                p->data = ix;
                tail->next = p;
                tail = p;
                tail->next = NULL;
                scanf("%d", &ix);
        }
        return( head );
}
void Print_LinkList( LinkList*head)//输出
{        LinkList*p = head->next;
        while(p != NULL)
        {        printf("%d ", p->data);
          p = p->next;
        }
}

int LinkList_Length (LinkList*head )//求长度
{        LinkList*p = head; /*p指向头结点*/
        intj = 0;
        while( p->next)
        {        p=p->next;         /*p所指的是第j个结点*/
                j ++;
        }
        returnj;
}

//按序号查找:    从链表的第一个结点起,判断当前结点是否是第i个,
//若是,则返回该结点的指针,否则继续下一个,直到表结束为止。没有第i个结点时返回空。
LinkList *GetData_LinkList(LinkList *head, int i)//返回第i个节点的指针
{        LinkList *p;         intj = 0;
        if (i <= 0)                return NULL;
        p = head;
        while( p->next && j < i )
        {        p = p->next;
                j ++;
        }
        if ( i == j)        returnp;
        else                returnNULL;
}

//按值查找:
//从链表的第一个结点起,判断当前结点是否等于key,若是,则返回该结点的指针,
//否则继续下一个,直到表结束为止。找不到时返回空。
LinkList *Search_LinkList(LinkList*head, elemtypekey)//返回值为key的地址
{        LinkList *p;
        p = head->next;
        while( p)
        if ( p->data != key )
                p = p->next;
        else
                break;
        returnp;
}

//后插运算算法
void InsertAfter_LinkList(LinkList *p, elemtypex)//在结点p后面插入值为x的节点
{ LinkList*s;
s = (LinkList *) malloc ( sizeof( LinkList ) );
                         // ①生成新结点
s->data = x;                //②新结点赋值
s->next = p->next;        //③新结点链入
p->next = s;                //④修改前趋结点的后向链
}


//在指定位置i插入x
int InsertNo_LinkList(LinkList*head,elemtype x,int i)
{
    LinkList*p;
    if(i<=0)p=NULL;
    else if(i==1)p=head;
    else
      p=GetData_LinkList(head,i-1);
    if(p==NULL)
    {
      return 0;
    }
    else
    {
      InsertAfter_LinkList(p,x);
      return 1;
    }
}

//删除后继结点算法
/*删除p的后继结点,成功返回1;否则返回0*/
intDeleteAfter_LinkList(LinkList *p)
{        LinkList *r;
        if ( !p ) {       return 0;}
        r = p->next;
        if ( !r )
        {        return 0;      }
        p->next = r->next;
        free( r );
        return( 1 );
}

//删除单边表head的指定结点p
int DeleteNode_LinkList(LinkList*head,LinkList*p)
{
    LinkList*r;
    if(p->next!=NULL)
    {
      p->data=p->next->data;
      return(DeleteAfter_LinkList(p));
    }
    else
    {
      r=head;
      while(r->next!=p)
            r=r->next;
      return(DeleteAfter_LinkList(r));
    }
}


//删除指定位置的结点:在带头结点的链表中删除第i个结点。删除第i个结点,就必须找到它的前驱结点,
//即第i – 1个结点p,然后再删除p的后继结点。
intDeleteNo_LinkList( LinkList *head, inti ) /*删除成功返回1,否则返回0*/
{        LinkList *p, *r;
        if ( i == 0)p = NULL;
        else if (i == 1 ) p = head;
        elsep = GetData_LinkList(head, i-1);/*搜索第i-1个结点*/
        if ( p == NULL)
        {
                return 0;
        }
        else
        {        r = p->next;        p->next = r->next; /*删除指定结点*/
                free( r );
                return1;
        }
}

//将已存在的单链表的所有结点删除,释放其所占用的存储空间,使其成为带头结点的空链表。
LinkList * SetNull_LinkList(LinkList *head)
{        while (head->next)
                DeleteAfter_LinkList(head);       /*依次删除每个结点*/
        return head;
}

superbe 发表于 2019-10-9 12:31:02

本帖最后由 superbe 于 2019-10-9 12:35 编辑

参考代码如下。我把LinkList_Length 和 Print_LinkList各修改了一行,因为题目说要包括头结点,你自己决定吧。
void Print_LinkList( LinkList*head)//输出
{       //LinkList*p = head->next;
        LinkList*p = head;
      while(p != NULL)
      {       printf("%d ", p->data);
                p = p->next;
      }
}

int LinkList_Length (LinkList*head )//求长度
{      LinkList*p = head; /*p指向头结点*/
      //intj = 0;
        intj = 1;
      while( p->next)
      {       p=p->next;         /*p所指的是第j个结点*/
                j ++;
      }
      returnj;
}

int main()
{
        LinkList *head;
        head=Create_LinkListR();            //尾插法创建链表
        head->data = LinkList_Length(head); //将链表长度存放在头结点的数据域
        Print_LinkList(head);               //输出单链表的所有元素

        return 0;
}
页: [1]
查看完整版本: C语言的单链表问题,求助!