标签:
/***************** * 通过结构体,建立动态链表,并输出链表。 * *******************/ #include<stdio.h> #include<malloc.h> #include<stdlib.h> #define LEN sizeof(struct student) //宏定义 将LEN 替换为student 结构体的大小数值 struct student *create(); //声明创建新链表(节点)(结构体)函数,返回该链表的头地址(指针),(尾部添加节点方法) void print(struct student *head); // 打印链表函数(此处为函数声明, //print函数()内的形参可有可无,有则主要给编程人员看的) struct student //定义结构体类型,即每个创建的节点(结构体)内包含什么类型的数据 { long num; float score; struct student *next; //用来连接下一个结构体的指针 }; int n; //全局变量,用来记录创建了多少个结构体 void main() { struct student *stu; //定义一个指针类型的结构体stu stu = create(); //调用创建新节点(结构体)函数create()并将其创建成的链表头地址(指针)赋给stu指针 print(stu); //用create()返回的指针作实参调用函数print() printf("\n\n"); system("pause"); //此处system函数()内带双引号,中文的任意键退出提示 } struct student *create() //定义创捷指针结构体的函数 { struct student *head; // 定义指针结构体变量*head, *p1,*p2,用于存放新创建的指针结构体 struct student *p1,*p2; p1 = p2 = (struct student *)malloc(LEN); //LEN是student结构体的大小 //用动态内存分配函数malloc()分配内存给指针结构体p1和p2 printf("please enter the num : "); //指针结构体p1先获得数据 scanf("%ld",&p1->num); printf("please enter the score : "); scanf("%f",&p2->score); head = NULL; //定义头指针为空值 n = 0; //初始话计数器 while(p1->num) //判断指针结构体p1成员所获得的数据是否为0,否时(即表示p1获取数据成功)则继续一下执行 { n++; // 节点创建记数器+1 if(1==n) //当创建的为第一节点时, { head = p1; //将指针结构体p1的首地址赋给指针接头体head(即让头指针结构体指向p1) } else //若是第一个之后创建的指针接头体 { p2->next = p1; //将p2指针结构体尾地址指向指针结构体p1首地址 } p2 = p1; //让p2指向p1,为后续p1的从新获取数据步骤作备份 p1 = (struct student *)malloc(LEN); //再次使用动态内存分配函数给p1指针结构体分配特定的内存空间(此时即为再次创建新节点(指针结构体)) printf("\nPlease enter the num :"); //新指针结构体p1获得数据 scanf("%d",&p1->num); printf("\nPlease enter the score :"); scanf("%f",&p1->score); } p2->next = NULL; //当循环不执行(即p1->num,获得0值时) 将p2指针结构体成员 p2->next指向NULL即0,表示链表的结束 return head; //函数struct student *create() 返回链表的头地址。 } void print(struct student *head) //定义print函数,接收链表头地址(实参),执行运行,此处的形参(类型和名称)必须要有 { struct student *p; // 定义一个新的指针结构体变量p printf("\nThere are %d records!\n\n", n); p = head; //所定义的新的p是用于接收函数struct student *create()返回回来的链表头地址,此地址在print函数内用head这个指针来传递 if( p ) //判断链表的头地址是否为空,(即有没有创建一个新的节点(指针结构体)) { do { printf("学号为 %d 的成绩是: %f\n", p->num, p->score);//注意指针结构体的成员引用格式:指针结构体名->成员名; //将头地址(指针接头体struct student *head) 的成员打印出来 p = p->next; //将头地址(指针接头体struct student *head) 指向下一节点头地址。 //尾成员存放的地址(p->next内的地址即为下一个节点(指针结构体)的头地址) }while( p ); //直到p值为NULL,(即0),退出循环。 } }
标签:
原文地址:http://my.oschina.net/u/2379244/blog/424341