#include <
stdio.h>
#include <malloc.h>
typedef struct student
{
int id;
int score;
struct student *next;
}STU;
int stuIndex;
void inputStuInfo(STU *stuHead);//输入学生信息
void orderStuInfo(STU *stuHead);//按照分数高到低顺序重组
链表void printStuInfo(STU *stuHead,int flag);//打印学生信息。参数flag=0:正常打印链表信息。flag!=0:打印排序后的名次信息
int main()
{
STU *stuHead=(STU *)malloc(sizeof(STU));
stuHead->next=NULL;
stuIndex=1;
inputStuInfo(stuHead);
printf("--打印原始输入的链表!--\n");
printStuInfo(stuHead,0);
printf("--开始按分数降序排列!--\n");
orderStuInfo(stuHead);
printf("--链表按降序重组完成!--\n");
printf("--打印降序排序的链表!--\n");
printStuInfo(stuHead,1);
return 0;
}
void orderStuInfo(STU *stuHead)
{
STU *stuSave1=NULL,*stuSave2=NULL,stuSave3;
stuSave1=stuHead;
while(stuSave1->next!=NULL)//
冒泡排序 {
stuSave2=stuSave1->next;
while(stuSave2->next!=NULL)
{
if(stuSave1->next->score<stuSave2->next->score)//交换成员值,保留原链表指针值
{
stuSave3=*(stuSave1->next);
stuSave1->next->id=stuSave2->next->id;
stuSave1->next->score=stuSave2->next->score;
stuSave2->next->id=stuSave3.id;
stuSave2->next->score=stuSave3.score;
}
stuSave2=stuSave2->next;
}
stuSave1=stuSave1->next;
}
}
void printStuInfo(STU *stuHead,int flag)
{
int i=1;
while(stuHead->next!=NULL)
{
if(flag==0)
printf("学生%d,成绩%d\n",stuHead->next->id,stuHead->next->score);
else
printf("第%d名,学生%d,成绩%d\n",i++,stuHead->next->id,stuHead->next->score);
stuHead=stuHead->next;
}
}
void inputStuInfo(STU *stuHead)
{
int score;
STU *stuNew=NULL,*stuTail=NULL;
while(1)
{
printf("输入学生%d的成绩:(输入负数结束输入)",stuIndex);
scanf("%d",&score);
if(score<0)
break;
stuNew=(STU *)malloc(sizeof(STU));
stuNew->score=score;
stuNew->id=stuIndex;
stuNew->next=NULL;
if(stuHead->next==NULL)
stuHead->next=stuNew;
else
stuTail->next=stuNew;
stuTail=stuNew;
stuIndex++;
}
}