数据结构——学生单链表

 根据用户输入的学生人数n(n≥3)及每个学生姓名和成绩建立一个单链表,并按学生成绩递减排序,然后按名次输出所有学生的姓名和成绩。

#include
#include
#include 
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");
}

 

 

你可能感兴趣的:(数据结构,链表,c++)