例题详解:
- 编写函数实现建立链表:struct student * create( int n), n是学生人数。函数中输入n个学生的信息,同时计算总评成绩,按照总评成绩从高到低的方式形成有序链表。返回链表头指针。
- 结构体类型定义为:
-
struct student { int stunum; //学号 char name[20]; //姓名 float examscore; //考试成绩 float labscore; //实验成绩 float totalmark; //总评成绩 struct student * next; //下一个结点 };
建立有序链表(边建立,边排序)
struct student *create(int n) {
float t;
int i,j;
struct student *head,*p,*q,*qf;//p为新建;q,qf为移动节点,来夹住要插的节点
p=(struct student*)malloc(sizeof (struct student));
scanf("%d %s %f %f",&p->stunum,p->name,&p->examscore,&p->labscore);
p->totalmark=p->examscore*0.6+p->labscore*0.4;
p->next=NULL;//先创建一个节点
head=p;
p->next=NULL;//初始头+尾
for(i=1; i<n; i++) {
p=(struct student*)malloc(sizeof (struct student));
scanf("%d %s %f %f",&p->stunum,p->name,&p->examscore,&p->labscore);
p->totalmark=p->examscore*0.6+p->labscore*0.4;
p->next=NULL;//先创建一个节点
t=p->totalmark;//记录总评成绩
q=head;//记录头指针
if(t>=q->totalmark) { //若最大直接接到前面
head=p;
p->next=q;//头接法
} else {
while(q!=NULL&&t<q->totalmark) {
qf=q;
q=q->next;//小于q同时后移
}
qf->next=p;
p->next=q;//插入到qf与q之间
}
}
return(head);
}
注解·:本题与一般创建链表不同的是:要边建立边排序,因此需要双指针技巧
用p与pf(front)来夹住要插入的位置
要点:pf要在p后移之前承接p的位置,移动是并行的。