位置:首页 > 软件操作教程 > 编程开发 > C语言 > 问题详情

C语言 建立链表

提问人:刘团圆发布时间:2020-12-02

假设有如下结构包含10个结点(不包括头结点)的链表:

typedef struct list

{

    int data;

    struct list *next;

} SLIST ;

为了建立一个链表,需要经过如下步骤:

①先定义三个指针,head、p、q,这三个指针类型都为SLIST型。这三个指针的作用为,h指向头指针,p为当前结点的指针,q为指向新产生结点的指针。

    利用malloc()函数产生头结点,并将头结点的地址赋给head指针和p指针,头结点中不存放数据,只存放第一个数据结点的地址,如图12-10中第1步所示。

    此步骤所使用的语句为:

    head=p=(SLIST *)malloc(sizeof(SLIST));

②利用mallocO函数产生一个新的结点,并将该结点的地址赋给q,为新结点的数值域赋值,如图中第2步所示。

    此步骤所使用的语句为:

    q=(SLIST *)malloc(sizeof(SLIST)); 

    q->data=a[i];

③将新产生的q结点连接到上一结点,如图中第3步所示。

此步骤所使用的语句为:

    p->next=*q;

④将刚刚产生的结点q的地址赋给p, q准备得到下一新的结点,但注意此时q并没有被释放,它仍指向当前结点,如图中第4步所示。

此步骤所使用的语句为:

    p=q;

用第一个数据结点,并将该结点的地址赋给head和p指针的地址域。

⑤重复2~4步的操作,直到产生链表中所有的结点,为最后一个结点的地址域赋NULL,如图第5步所示。

image.png

建立链表的具体程序代码如下:

#define N 10

typedef struct list    /*定义链表*/

{

    int data;

    struct list *next;

} SLIST; 

main()

{

    SLIST *head,*p,*q;

int i;

    int a[10]={l,3,5,9,10,12.14.17,18,22};

    head=p=(SLIST *)malloc(sizeof(SLIST));    /*产生头结点,head为指向头结点的指针*/

    for(i-0; i<N; i++)                        /*循环产生N个结点*/

    {

        q=(SLIST *)malloc(sizeof(SLIST));     /*产生一个结点*/

        q->dat a=a[i];                        /*为数据域复制*/

        p->next=q;                            /*将刚刚产生的结点链接到上一结点,*/

        p=q;                              /*刚刚产生的结点地址赋给p,q准备产生下一结点*/

    }

    p->next=0;

}

    本程序是在main()函数中实现的,也可以将产生链表的过程定义为一个函数creatlist(),该函数的功能是产生一个链表,并将链表的地址返回,所以函数的类型为SLIST*。具体为:

    SLIST *creatlist(int *a)

    /*形参指针变量a,实参是数组名,该数组在mainO函数中已经被赋值*/ 

    {

        …

        return head; /*将产生的链表的头指针返回*/

    }


继续查找其他问题的答案?

相关视频回答
回复(0)
返回顶部