顺序输出学生信息(单链表实现)(虽然能顺序输出但最后却释放了所有的节点)
#include <stdio.h>#include <stdlib.h>
struct student
{
char number[20];
char name[10];
float score1;
float score2;
float score3;
float average;
struct student *next;
}node;
typedef struct student jie;
void view(jie *q,int num)
{
printf("%s %s %.2f %.2f %.2f %.2f %d\n",q->number,q->name,q->score1,q->score2,q->score3,q->average,num);
}
void print(jie *p,int n)
{
jie *q1,*q2,*f,*bef;
int k=1;
int num=0;
while(k<n)
{
f=q1=p;
q2=p->next;
while(q2!=NULL)
{
if(q2->average>f->average)
{
bef=q1;
f=q2;
}
q1=q2;
q2=q1->next;
}
if(f==p)
{
view(f,++num);
k++;
p=p->next;
free(f);//释放f而不能释放p,p现在已经指向了新的节头点;
}
else
{
bef->next=f->next;//注意f的释放,让他的前一个节点后驱指针指向他的下一个址
view(f,++num);
k++;
free(f);
}
}
view(p,++num);
}
jie* creat(int n)
{
jie *head,*q1,*q2;
head=q2=q1=NULL;
int i;
for(i=0;i<n;i++)
{
q1=(jie*)malloc(sizeof(jie));
scanf("%s %s %f %f %f",q1->number,q1->name,&q1->score1,&q1->score2,&q1->score3);
q1->average=(q1->score1+q1->score2+q1->score3)/3;
if(head==NULL)
{
head=q2=q1;
}
else
{
q2->next=q1;
q2=q1;
}
}
q1->next=NULL;
return head;
}
int main()
{
jie *p;
int n;
scanf("%d",&n);
p=creat(n);
print(p,n);
return 0;
}