假设有如下结构包含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步所示。
建立链表的具体程序代码如下:
#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; /*将产生的链表的头指针返回*/
}
已有 22658 名学员学习以下课程通过考试
最需教育客户端 软件问题一手掌握
去 App Store 免费下载 iOS 客户端
点击加载更多评论>>