根据用户输入的学生人数n(n≥3)及每个学生姓名和成绩建立一个单链表,并按学生成绩递减排序,然后按名次输出所有学生的姓名和成绩。
#include<stdio.h>
#include<stdlib.h>
#include <iostream>
using namespace std;
typedef struct node
{
char name[10]; //姓名
int score; //成绩域
struct node* next; //指针域
} StudList, * SLink; //学生单链表结点类型
SLink CreateStudent() //采用交互式方式创建学生单链表。
{
int n, i;
StudList* s, * tc; //结点
SLink sl; //指针
tc = (StudList*)malloc(sizeof(StudList)); //创建头结点
sl = tc;
cout << "输入学生人数:";
cin >> n;
for (i = 0; i < n; i++)
{
s = (StudList*)malloc(sizeof(StudList));
cout << "第" << i + 1 << "个学生的姓名与成绩:";
cin >> s->name;
cin >> s->score;
tc->next = s; //将S插入tc后
tc = s;
}
tc->next = NULL; //尾结点next域置为空
return sl; //返回学生链表的头指针
}
void DestroyList(SLink L) //销毁学生单链表。
{
StudList* pre = L, * p = pre->next;
while (p != NULL)
{
free(pre);
pre = p; p = p->next;
}
free(pre);
}
void DispList(SLink L) //输出学生单链表。
{
StudList* p = L->next;
int i = 1;
cout << "学生名次、姓名、成绩为" << endl;
while (p != NULL)
{
cout << " " << i++ << " ";
cout << p->name << " ";
cout << p->score << endl;
p = p->next;
}
}
void SortList(SLink L) //将学生单链表按成绩递减排序。
{
StudList* p, * pre, * q;
p = L->next->next; //p指向L的第二个数据结点
L->next->next = NULL; //构造只含有一个数据节点的有序表
while (p != NULL)
{
q = p->next; //q保存p结点后继结点的指针
pre = L; //从有序表开头进行比较,pre指向p的前驱结点
while (pre->next != NULL && pre->next->score > p->score)
pre = pre->next; //寻找插入的位置,即p的前驱结点pre;
p->next = pre->next; //pre之后插入p;
pre->next = p;
p = q;
}
}
void main()
{
SLink st;//指针
st = CreateStudent();
SortList(st);
DispList(st);
cout << endl;
DestroyList(st);
system("pause");
}