//写出一个结构体,要求是一个单链表,里面装的是学生的学号、姓名、成绩,
//把这个链表按照成绩由低到高排序
//建立单链表,排序
#include<stdio.h>
#include<stdlib.h>
#include "string.h"
#define n 4 //链表长度
typedef struct student {
char id[10];
char name[10];
int grade;
struct Std *next;
} Std;
void createlinklist(Std **s,int len) { //头插法建立单链表
Std *p;
int i;
*s=(Std*)malloc(sizeof(Std));
(*s)->next=NULL;
i=0;
while(i<len) {
p=(Std*)malloc(sizeof(Std));
printf("依次输入学号,姓名,成绩(空格隔开):");//scanf不接收空格键
scanf("%s",&(p->id));
scanf("%s",&(p->name));
scanf("%d",&(p->grade));
p->next=(*s)->next;
(*s)->next=p;
i++;
}
}
void InsertSort(Std **s) { //直接插入排序;按成绩排名
Std *p,*q,*t,*r;
q=(*s)->next;
p=q->next;//q在p前面,q记录有序序列的最后一个结点
while(p!=NULL) {
if(p->grade>=q->grade) { //从低到高排列
p=p->next;
q=q->next;
} else {
t=(*s)->next;
r=*s;//r在t前面
while((p->grade)>(t->grade)) {
r=t;
t=t->next;
}//找到第一个不小于p的结点
q->next=p->next;
p->next=t;
r->next=p;
p=q->next;
}
}
}
int main() {
Std *head,*p;
head=(Std*)malloc(sizeof(Std));
createlinklist(&head,n);
InsertSort(&head);
p=head->next;
while(p!=NULL) {
printf("学号:%s姓名:%s成绩:%3d\n",p->id,p->name,p->grade);//
p=p->next;
}
while(head!=NULL) {
p=head;
head=head->next;
free(p);
}
return 0;
}