#include<stdio.h>
#include<malloc.h>
#define LEN sizeof(struct Student)
struct Student //结构体声明
{
long num;
int score;
struct Student* next;
};
int n;
struct Student* creat() //创建单向链表
{
struct Student *head=NULL, *p_before, *p_later;
p_before = p_later = (struct Student*) malloc(LEN);
scanf_s("%ld%d", &p_before->num, &p_before->score);
while (p_before->num!=0)
{
n++;
if (n == 1) head = p_before;
else p_later->next = p_before;
p_later = p_before;
p_before = (struct Student*) malloc(LEN);
scanf_s("%ld%d", &p_before->num, &p_before->score);
}
p_later->next = NULL;
free(p_before);
return head;
}
struct Student* sort(struct Student* list) //冒泡排序,当初写的是内容交换而不是指针交换,我知道这不是好的做法,但日子一久,当下没时间和热情改了,大家原谅,
{ //等有时间了一定改
struct Student *p, *q;
int temp1,i;
long temp2;
for (p = list, i =1; i < n;i++,p=p->next)
for (q = p->next;q!= NULL;q=q->next)
if (p->score < q->score)
{
temp1 = p->score;
p->score = q->score;
q->score = temp1;
temp2 = p->num;
p->num = q->num;
q->num = temp2;
}
return list;
}
struct Student* sort1(struct Student* h) //插入排序(下边这堆注释是当初写完代码后又分析时加的,这里必须承认,我参考了网上的一些代码。这里大家要是看不
{ //懂或是不想看,就略过吧。还有,这里“结点”写成“节点”了,纠正一下,不好意思
struct Student *f, *t, *p=NULL, *q;
f = h->next; //f指向旧链的第一个节点,即等待在新链中“安家落户”(插入)的节点
h->next = NULL; //将原链的第一个节点单拿出来作为新