@【数据结构】(学生单链表)

@【数据结构】(学生单链表)

设计一个完整的程序,根据用户输入的学生人数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;//指针
	cout << "建立学生单链表" << endl;
	st = CreateStudent();
	cout << "按成绩递减排序:" << endl;
	SortList(st);
	cout << "排序后:";
	DispList(st);
	cout << endl;
	cout << "销毁学生单链表" << endl;
	DestroyList(st);
	system("pause");
}
}

测试结果:
在这里插入图片描述

发布了20 篇原创文章 · 获赞 1 · 访问量 77

猜你喜欢

转载自blog.csdn.net/gsgs1234/article/details/104844539