相对于静态链表的确定结点个数,动态链表则是没有确定的结点个数,是在程序执行过程中从无到有地建立起一个链表。
【例8.8】建立如图8.12所示有3名学生数据的单向动态链表。
程序内容如下:
1 /*这是一个有关于建立动态链表知识讲解的事例程序*/
2 #include<stdio.h>
3 #include<stdlib.h>
4 #define LEN sizeof(struct Student)
5 struct Student
6 {
7 long num;
8 float score;
9 struct Student*next;
10 };
11 int n;
12 struct Student*creat(void)
13 {
14 struct Student*head,*p1,*p2;n=0;
15 p1=p2=(struct Student*)malloc(LEN);
16 scanf("%ld,%f",&p1->num,&p1->score);
17 head=NULL;
18 while(p1->num!=0)
19 {
20 n=n+1;
21 if(n==1)
22 head=p1;
23 else
24 p2->next=p1;
25 p2=p1;(www.xing528.com)
26 p1=(struct Student*)malloc(LEN);
27 scanf("%ld,%f",&p1->num,&p1->score);
28 }
29 p2->next=NULL;
30 return(head);
31 }
32 int main()
33 {
34 struct Student*pt;
35 pt=creat();
36 while(pt!=NULL)
37 {
38 printf("\nnum:%ld\nscore:%5.1f\n",pt->num,pt->score);
39 pt=pt->next;
40 }
41 return 0;
42 }
程序结果如图8.14所示:
图8.14 例8.8程序结果图
【例题中关键问题说明】
(1)本程序用到第7章介绍的动态内存分配知识和有关函数(malloc、calloc、realloc、free)。
(2)定义了3个指针变量head、p1、p2,用来指向struct Student类型数据。
(3)先用malloc函数开辟第一个结点,并使p1和p2指向它,然后从键盘输入一个学生数据给第一个结点,使head也指向第一个结点.
(4)接着开辟第二个结点,使p1指向它,输入该结点数据,使第一个结点的next成员指向第二个结点,即连接第一个结点与第二个结点,使p2指向第二个结点。
(5)再开辟第三个结点让p1指向它,以此类推。在此设置学号不会为0,如果输入学号为0则表示链表建立结束。
(6)最后建立一个新的指针pt,利用循环遍历动态链表,将全部结点中的数据显示出来。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。