创建简单学生链表 并按照语文成绩排序(挑选最大节点组建新链表)
#include<stdlib.h>
typedef struct stu
{
int id;
char name[32];
int chinese;
int math;
struct stu * next;
}STU,*PSTU;
STU * add(PSTU head) //创建单向链表 尾插法 不带头节点
{
char sel;
PSTU p = NULL;
PSTU temp = NULL;
while(1)
{
printf("do you want to add stu?(y/n):");
sel = getchar();
if(sel == 'n' || sel == 'N')
break;
temp = malloc(sizeof(STU));
printf("stu info(id name chinses math)\n");
printf("\t");
scanf("%d %s %d %d",&temp->id,temp->name,&temp->chinese,&temp->math);
getchar();
temp->next = NULL;
if(head == NULL)
head = temp;
else
p->next = temp;
p = temp;
}
return head;
}
void show(PSTU head) //显示
{
if(head == NULL)
{
printf("the link is empty...\n");
return;
}
PSTU p = head;
printf("\n学号\t姓名\t语文\t数学\n");
while(p!=NULL)
{
printf("%d\t%s\t%d\t%d\n",p->id,p->name,p->chinese,p->math);
p = p->next;
}
}
int get_len(PSTU head) //获取长度
{
if(head == NULL)
{
printf("the link is empty...\n");
return 0;
}
PSTU p = head;
int len = 0;
while(p!=NULL)
{
len++;
p = p->next;
}
return len;
}
PSTU sort(PSTU head) //排序 按照语文成绩排序
{
if(head == NULL)
{
printf("the link is empty...\n");
return NULL;
}
PSTU p = head; //流动指针 从头开始
PSTU new_head = NULL; //新的链表头指针点
PSTU p2 = NULL; //用来接收最大值的节点
PSTU p3 = NULL; //最大值节点的前一个节点指针
PSTU p4 = NULL; //新链表的临时节点 实现尾插法
int len = get_len(head); //获取长度
int max = 0; //比较值
for(int i=0;i<len;i++) //循环比较
{
p = head; //每次循环开始初始化
max = 0;
while(p!=NULL)
{
if(p->chinese > max) // 获取最大节点p 用p2来接收
{
max = p->chinese;
p2 = p;
}
p = p->next;
}
if(p2 == head) //如果最大的节点是第一个 需要改变头指针指向
{
head = head->next;
}else //否则的话 获取p2的前一个的节点p3
{
p3 = head;
while(p3->next!=p2)
{
p3 = p3->next;
}
p3->next = p2->next; //改变p2的前一个节点p3的指向
}
//保证链表的完整性 方便下一次循环比较
p2->next = NULL; //获取到的最大节点p2这个时候已经独立了
if(new_head == NULL) //然后实现正常的创建链表方法 尾插法
{
new_head = p2;
}
else
{
p4->next = p2;
}
p4 = p2;
}
return new_head; //返回的新链表就是排序之后的链表
}
int main()
{
PSTU head = NULL;
head = add(head);
show(head);
printf("\n按照语文成绩排序\n");
head = sort(head);
show(head);
}
程序运行结果: