数据结构学习录(二)——用链表将学生的成绩进行排队1 C程序 插入排序
输入:
N个学生的两个成绩
输出:
按两个成绩的平均成绩排序后输出
/*学生成绩从小到大排序 链表*/ /*插入排序*/
#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct stu)
typedef struct{
int num;
char name[20];
float score1,score2,av;
}Student;
typedef struct stu{
Student data;
struct stu *next;
}ListNode;
int n;//人数的全局变量
ListNode *creat(void) //输入
{
ListNode *head;
ListNode *p1,*p2;
n = 0;
p1 = p2 = (ListNode *)malloc(LEN);
printf("请输入学生的学号、姓名、成绩1、成绩2\n");
scanf("%d %s %f %f",&p1->data.num,p1->data.name,&p1->data.score1,&p1->data.score2);
p1->data.av = (p1->data.score1+p1->data.score2)/2.0;
head = NULL;
while(p1->data.num)
{
n = n+1;
if(n == 1)
head = p1;
else
p2->next = p1;
p2 = p1;
p1 = (struct stu*)malloc(LEN);
printf("请输入学生的学号、姓名、成绩1、成绩2\n");
scanf("%d %s %f %f",&p1->data.num,p1->data.name,&p1->data.score1,&p1->data.score2);
p1->data.av = (p1->data.score1+p1->data.score2)/2.0;
}
p2->next = NULL;
return (head);
}
ListNode *paixu(ListNode *head)
{
ListNode *p, *pstart, *pend,*temp,*pre;
p = head->next; pend = head; //初始化
pstart =(ListNode *)malloc(LEN); pstart->next = head; //为了操作方便,添加一个头结点
while(p != NULL)
{
temp = pstart->next, pre = pstart; // 保证temp在p的前面 找到temp前一个节点 每次都从第一个节点开始
while(temp != p && p->data.av >= temp->data.av) // 比较数值,当temp不与p指向同一个位置的时候,比较数值大小
{ // 当temp的值小于p的值的时候,让temp指向下一个位置
temp = temp->next;
pre = pre->next;
}
if(temp == p) // 如果temp所遍历的值一直都小于p的值的时候,进入
pend = p;
else // 当有数值大于的时候进入
{
pend->next = p->next; // pend的next域 变成 p的next域
p->next = temp; // 因为temp的值大于p的值,所以将temp放在p的后面
pre->next = p; // p变成了temp的前一个
}
p = pend->next;
}
head = pstart->next;
free(pstart);
return head;
}
void print(ListNode *head) //输出
{
ListNode *p;
printf("%15s %20s %6s %6s %6s\n","学号","姓名","成绩1","成绩2","平均分");
p = head;
if(head != NULL)
{
do
{
printf("%15d %20s %6.2f %6.2f %6.2f\n",p->data.num,p->data.name,p->data.score1,p->data.score2,p->data.av);
p = p->next;
}while(p!=NULL);
}
}
int main()
{
struct stu *head;
head = creat();
head = paixu(head);
print(head);
}