/********结构体和指针的应用………单链表的建立.输出.删除.插入******************/ /*建立链表///////////////////////////////////////////////////////////*/#include <stdio.h>#include <malloc.h>#define NULL 0#define LEN sizeof(struct student)struct student{ long num; float score; struct student *next;};int n; /*n为全局变量,本文件模块中各函数均可使用它*/struct student *creat(void)/*定义函数.此函数带回一个指向链表头的指针*/{ struct student *head; struct student *p1,*p2; n=0; p1=p2=(struct student *)malloc(LEN); /*开辟一个新单元*/ scanf("%ld,%f",&p1->num,&p1->score); head=NULL; while (p1->num!=0) { n=n+1; if (n==1) head=p1; else p2->next=p1; p2=p1; p1=(struct student *)malloc(LEN); scanf("%ld,%f",&p1->num,&p1->score); } p2->next=NULL; return (head);}注意:(1)第3行为#define命令行,令NULL代表0,用它表示”空地址”.第4行令LEN代表struct student类型数据的长度,sizeof是“求字节数运算符”.(2)第10行定义一个creat函数,它是指针类型,即此函数带回一个指针值,它指向一个struct student类型数据.实际上此creat函数带回一个链表起始地址.(3)malloc(LEN)的作用是开辟一个长度为LEN的内存区,LEN已定义为sizeof(struct student), 即结构体struct student的长度.malloc带回的是不指向任何类型数据的指针(void *).而p1.p2是指向struct student类型数据的指针变量,因此必须用强制类型转换的方法使指针的基类型改变为struct student类型,在malloc(LEN)之前加了“(struct student*)”,它的作用是使malloc返回的指针转换为指向struct student类型数据的指针. 注意”*”号不可省略,否则变成转换成struct student类型了,而不是指针类型了.(4)最后一行return后面的参数是head(head已定义为指针变量,指向struct student类型数据).因此函数返回的是head的值,也就是链表的头地址.(5)n是结点个数.(6)这个算法的思路是让p1指向新开辟的结点,p2指向链表中最后一个结点,把p1所指的结点连接在p2所指的结点后面,用“p2->next=p1”来实现. /*输出链表*//////////////////////////////////////////////////////////////*/首先要知道链表第一个结点的地址,也就是要知道head的值.然后设一个指针变量p,先指向第一个结点,输出p所指向的结点,然后使p后移一个结点,再输出,直到链表的尾结点.Head的值由实参传过来,也就是将已有的链表的头指针传给被调用的函数,在print函数中从head所指的第一个结点出发顺序输出各个结点。void print(struct student *head){ struct student *p; printf("\nNow,These %d records are:\n",n); p=head; if (head!=NULL) do {printf("%ld %5.lf\n",p->num,p->score);p=p->next; } while(p!=NULL);}&