学生信息管理系统完整版(数据结构C语言)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#define max 20
#define elemtype char

typedef struct studentnode//定义学生结构体
{
	int sid;
	char name[10];
	float score;
}studentnode, * student;
typedef struct stu//定义顺序表
{
	studentnode data[max];
	int last;
}STU;


//输入学生信息
void Insert(STU* L)
{
	int num;
	printf("请输入学生个数:");
	scanf_s("%d", &num);
	L->last = num;
	int i;
	for (i = 0; i < num; i++)
	{
		printf("学生的学号为:");
		scanf_s("%d", &L->data[i].sid);
		printf("\n");
		printf("学生的姓名为:");
		scanf_s("%s", L->data[i].name, 20);
		printf("\n");
		printf("学生的成绩为:");
		scanf_s("%f", &L->data[i].score);
		printf("\n");
	}
}

//逐个显示学生表中所有学生的相关信息
void xinxi(STU L)
{
	int i;
	for (i = (L.last - 1); i >= 0; i--)
	{
		printf("学生的学号为:%d", L.data[i].sid);
		printf("\n");
		printf("学生的姓名为:%s", L.data[i].name);
		printf("\n");
		printf("学生的成绩为:%f", L.data[i].score);
		printf("\n");
	}
}

//给定一个学生信息,插入到表中指定的位置
void Inslist(STU* L, int i)
{
	int k;
	if ((i < 0) || (i > (L->last + 1)))
	{
		printf("插入位置不合理");
	}
	if (L->last >= max)
	{
		printf("表已满,无法插入");
	}
	for (k = (L->last); k >= i; k--)
	{
		L->data[k + 1] = L->data[k];
		printf("新增学生的学号为:");
		scanf_s("%d", &L->data[i].sid);
		printf("\n");
		printf("新增学生的姓名为:");
		scanf_s("%s", &L->data[i].name, 20);
		printf("\n");
		printf("新增学生的成绩为:");
		scanf_s("%d", &L->data[i].score);
		L->last++;
	}
}

//删除指定位置的学生记录
void Delete(STU* L, int i)
{
	int k;
	if ((i < 1) || (i > (L->last + 1)))
	{
		printf("删除位置不合理");
	}
	for (k = i; i <= L->last; k++)
	{
		L->data[k - 1] = L->data[k];
		L->last--;
	}
	printf("删除成功");
}

//统计表中学生个数
void Num(STU L)
{
	int num;
	num = L.last;
	printf("学生个数为;%d", num);
}

//利用直接插入排序或者折半插入排序按照姓名进行排序
void BinSort(STU* L)
{
	int low, high, mid;
	int i, j;
	for (i = 1; i < L->last; i++)
	{
		studentnode x;
		x = L->data[i];
		low = 0;
		high = i - 1;
		while (low <= high)
		{
			mid = (low + high) / 2;
			if (strcmp(x.name ,L->data[mid].name)<0)
				high = mid - 1;
			else low = mid + 1;
		}
		for (j = i; j >= low + 1; j--)
		{
			L->data[j] = L->data[j - 1];
		}
		L->data[low] = x;

	}
	for (i = 0; i < L->last; i++)
	{
		printf("学生的学号为:%d", L->data[i].sid);
		printf("\n");
		printf("学生的姓名为:%s", L->data[i].name);
		printf("\n");
		printf("学生的成绩为:%f", L->data[i].score);
		printf("\n");
	}
}

//利用快速排序按照学号进行排序

int QuickSort(STU* L, int low, int high)
{
	
		int i = low;	//第一位
		int j = high;	//最后一位
		studentnode y = L->data[i];
		int key = L->data[i].sid; //将第一个数作为基准值-- 先找到一个基准值

		while (i < j)
		{
			while (i < j && L->data[j].sid >= key)
			{
				j--;
			}
			L->data[i] = L->data[j];

			while (i < j && L->data[i].sid <= key)
			{
				i++;
			}
			L->data[j] = L->data[i];
		}
		L->data[i] = y;
		if (i - 1 > low)
		{
			QuickSort(&L, low, i - 1);
		}

		if (i + 1 < high)
		{
			QuickSort(&L, i + 1, high);
		}

		return 0;
	}

		
		
	

//根据学号进行折半查找,要求使用非递归算法实现,成功返回此学生的姓名和成绩。
studentnode Binsrch(STU L)
{
	int low = 1;
	int high = L.last;
	int k;
	printf("请输入要查找的学号:");
	scanf_s("%d", &k);
	printf("\n");
	while (low <= high)
	{
		int mid = (low + high) / 2;
		if (k == L.data[mid].sid)
		{
			return L.data[mid];

		}
		else if (k < L.data[mid].sid)
			high = mid - 1;
		else low = mid + 1;
	}
}

//根据姓名进行折半查找,要求使用递归算法实现,成功返回此学生的学号和成绩
studentnode insrch(STU L, studentnode i, int low, int high) {

	while (low <= high) {
		int z = (low + high) / 2;
		if (strcmp(i.name, L.data[z].name) == 0) {
			return L.data[z];
		}
		else if (strcmp(i.name, L.data[z].name) < 0) {
			return insrch(L, i, low, z - 1);
		}
		else
			return insrch(L, i, z + 1, high);
	}
}
void showMenu()
{
	printf("---------学生信息管理系统-----------\n");
	printf("*       1. 输入学生信息           *\n");
	printf("*       2. 学生信息显示           *\n");
	printf("*       3. 学生信息新增           *\n");
	printf("*       4. 学生信息删除           *\n");
	printf("*       5. 学生个数统计           *\n");
	printf("*       6. 按照姓名进行排序       *\n");
	printf("*       7. 按照学号进行排序       *\n");
	printf("*       8. 按照学号进行查找       *\n");
	printf("*       9.按照姓名进行查找        *\n");
	printf("*       0. 退出系统               *\n");
	printf("------------------------------------\n");
}
int main()
{
	STU L;
	int command;
	showMenu();
	printf("请选择:");
	scanf_s("%d", &command);
	printf("\n");
	while (1)//根据command的值执行不同的值
	{
		switch (command) {
		case 1: {
			Insert(&L);//输入学生信息
		}; break;
		case 2: {
			xinxi(L);//逐个显示学生表中所有学生的相关信息
		}; break;
		case 3: {
			int i;
			printf("插入信息的位置为:");
			scanf_s("%d", &i);
			Inslist(&L, i);//给定一个学生信息,插入到表中指定的位置
		}; break;
		case 4:
		{
			int a;
			printf("删除信息的位置为:");
			scanf_s("%d", &a);
			Delete(&L, a);//删除指定位置的学生记录
		}; break;
		case 5:
			Num(L);//统计表中学生个数
			break;
		case 6: {
			BinSort(&L);//利用折半插入排序按照姓名进行排序
		}; break;
		case 7: {
			QuickSort(&L,0,L.last-1 );
			xinxi(L);//快速排序
		}; break;
		case 8: {
			studentnode j = Binsrch(L);//根据学号进行折半查找,要求使用非递归算法实现,成功返回此学生的姓名和成绩。
			printf("学生的姓名为:%s学生的成绩:%f", j.name, j.score);
		}; break;
		case 9: {
			studentnode i;
			printf("请输入学生姓名:");
			scanf(" %s", i.name);
			studentnode o = insrch(L, i, 0, L.last);//根据姓名进行折半查找,要求使用递归算法实现,成功返回此学生的学号和成绩
			printf("学号:%d 成绩:%f", o.sid, o.score);
		}; break;
		case 0:exit(0);//退出系统
		}
		printf("按任意健继续");
		_getch();//让程序暂停一下,按任意键继续
		system("cls");//清除屏幕
		showMenu();
		printf("请选择:");
		scanf("%d", &command);
	}
	return 0;
}

代码小白 有错勿喷 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 学生信息管理系统需要存储学生的基本信息,包括但不限于姓名、学号、性别、出生日期、籍贯、班级、电话、邮箱等。在数据结构上,可以使用一个包含学生基本信息的结构体来存储每个学生的信息,如下所示: ``` struct Student { char name[20]; char id[10]; char gender; char birthdate[10]; char hometown[20]; char classname[20]; char phone[15]; char email[30]; }; ``` 对于学生信息的存储,可以使用数组、链表等数据结构。例如,使用一个包含多个学生信息结构体的数组来存储学生信息,如下所示: ``` Student students[100]; ``` 其中,数组长度可以根据具体需要进行调整。 此外,为了方便对学生信息进行查找和排序,可以使用一些常见的数据结构,如哈希表、二叉搜索树、堆等。例如,可以使用哈希表来快速查找某个学号对应的学生信息,使用二叉搜索树来对学生信息按照姓名进行排序,使用堆来按照某个成绩指标对学生信息进行筛选等。 ### 回答2: 学生信息管理系统是一个用于管理学生信息的系统,它需要有一个合适的数据结构来存储和组织学生的基本信息。 在学生信息管理系统中,一般会使用数组或链表的方式来存储学生的信息。对于小规模的系统,可以使用数组来存储学生对象,每个对象包含学生的姓名、学号、性别、年龄等属性。数组的索引值可以作为学生对象的唯一标识,方便对学生信息进行查找和修改操作。 对于大规模的系统,可以考虑使用链表来存储学生对象。链表的每个节点包含一个学生对象,并通过指针来连接各个节点。这样可以方便地插入和删除学生信息,但可能会增加一定的存储空间和访问时间的开销。 除了基本的学生信息外,学生信息管理系统还可以支持更多的功能,比如成绩管理、课程管理等。为了实现这些功能,可以在学生对象中添加相应的属性和方法。比如,可以为每个学生对象添加一个成绩列表的属性,用于存储学生的各科成绩,以及计算平均分、排序等操作的方法。 总之,学生信息管理系统数据结构选择应根据系统规模和需求来确定。无论使用数组还是链表,都需要合理组织学生信息,以便于增删改查等操作,并支持系统的扩展功能。这样能够更好地满足学生信息管理系统的需求。 ### 回答3: 学生信息管理系统数据结构是指用于存储和管理学生信息的数据组织方式。常用的数据结构包括数组、链表、栈、队列、树、图等。不同的数据结构在不同的场景下有着不同的优势和特点。 对于学生信息管理系统来说,常用的数据结构是数组和链表。数组是一种线性数据结构,可以按照下标直接访问元素,适用于对数据的随机访问。在学生信息管理系统中,可以使用数组来存储学生的基本信息,如学号、姓名、性别、年龄等,通过下标来访问和修改这些数据。 链表是一种非线性数据结构,由一系列的节点组成,每个节点包含数据和指向下一个节点的指针。链表适用于需要频繁插入和删除元素的场景。在学生信息管理系统中,可以使用链表来存储学生的课程信息,每个节点表示一个课程,通过指针链接不同的课程节点。这样就可以方便地删除或插入某个课程节点,不需要移动其他节点。 除了数组和链表,学生信息管理系统还可以使用树结构。树是一种非线性数据结构,由根节点和若干个子节点组成,每个节点可以有多个子节点,但只有一个父节点。在学生信息管理系统中,可以使用树结构来表示学生与课程之间的关系,根节点表示学生,子节点表示课程。这样可以方便地查询某个学生的选修课程。 总之,学生信息管理系统数据结构选择应根据具体的需求和场景来确定。不同的数据结构有着不同的优势和特点,灵活选择合适的数据结构可以提高系统的效率和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值