学生基本信息管理系统(链表实现)


其中最核心的部分是排序部分。(交换的是节点,我认为是清晰易懂)

#include<stdio.h>
#define number 12
int fflush(FILE*);
struct student *head = NULL, *next = NULL, *guochen = NULL;
struct student
{
	char name[20];
	int id;
	int chinese;
	int math;
	int c;
	struct student *end;
};
void fuzhi()
{
		guochen = (struct student *)malloc(sizeof(struct student));
			head = guochen;
			guochen->name[0] = 'y';
			guochen->name[1] = 'y';
			guochen->name[2] = 'k';
			guochen->name[3] = '\0';
		guochen->id = 2017211199;
		guochen->chinese = 98;
		guochen->math = 99;
		guochen->c = 60;
		guochen->end = NULL;
		next = guochen;
		guochen = (struct student *)malloc(sizeof(struct student));
		next->end = guochen;
		guochen->name[0] = 'w';
		guochen->name[1] = 'm';
		guochen->name[2] = 'y';
		guochen->name[3] = '\0';
		guochen->id = 2017211156;
		guochen->chinese = 96;
		guochen->math = 92;
		guochen->c = 95;
		guochen->end = NULL;
		next = guochen;

}
void fuction()//函数初始化
{
	   void fuzhi();
	    void show();
		void jieguo();
		void shanchu();
		int tianjia();
		void pinjun();
		void maopao();

}
int main()
{
	int choice;
	int connst = 2;
	fuction();
	fuzhi();
	show();
	
	while (scanf("%d", &choice) == 1) 
	{
		switch (choice)
		{
		case 1:jieguo(); break;
		case 2:shanchu(); break;
		case 3:maopao(connst); break;
		case 4:pinjun(); break;
		case 5:connst=tianjia(); break;
		case 0: {
			printf("\n\n\n\n\t\t\t\t\t\t【欢迎再次使用】\n\n\n");
			system("pause");
			exit(0); }; break;
		default:printf("请按要求输入\a\n");
		}
		show();
	}
	system("pause");
}
void show()//初始界面
{

	for (int i = 0; i < 8; i++)
	{
		printf("------------------------");
	}
	printf("\n\n");
	printf("\t\t\t\t\t\t\t\t\t\t\t学生信息管理系统\n\n");
	for (int i = 0; i < 8; i++)
	{
		printf("------------------------");
	}
	printf("\n");
	printf("【欢迎使用学生成绩管理系统】\n");
	printf("[1] [显示所有学生信息]\n");
	printf("[2] [删除学生信息]\n");
	printf("[3] [对学生信息进行排序]\n");
	printf("[4] [求平均分]\n");
	printf("[5] [录入学生信息]\n");
	printf("[0] [退出程序]\n");
	printf("[请输入您的选择](0 - 5):");
}
void jieguo()//显示结果
{
	printf("\n【姓名】\t\t【学号】\t\t【语文成绩】\t【数学成绩】\t【C语言】\n");
	guochen = head;
	while (guochen != NULL)
	{

		printf("%s\t\t\t%d\t\t %d\t\t %d \t\t%d\n", guochen->name, guochen->id, guochen->chinese, guochen->math, guochen->c);
		guochen = guochen->end;
	}

}
void shanchu()//删除某个成员
{
	char str[20] = { NULL };
	struct student *y, *u, *prep;
	guochen = head;
	prep = guochen;
	y = guochen;
	u = prep;
	char *q = NULL, *p = NULL;
	int xc = 0, k = 0, c, *m=0, i = 0, n = 0,  l;
	p = guochen->name;
	l = guochen->id;
	printf("[1] [按姓名删除某个学生信息]\n");
	printf("[2] [按学号删除某个学生信息]\n");
	scanf("%d", &c); fflush(stdin);

	switch (c)
	{
	case 1: {
		printf("[请输入你所要删除的信息的学生的名字!]:");
		scanf("%s", str); fflush(stdin);
		q = str;
		while (guochen != NULL)
		{
			while ((!(xc = *p - *q)) && *p)
			{
				*q++;
				*p++;
			}

			if (xc == 0)
			{
				if (guochen == head)
				{
					prep = guochen->end;
					y = prep;
				}
				else
				{
					prep->end = guochen->end;
					i++;
				}
			}

			if (i == 0 && n > 0)
			{
				prep = prep->end;
			}
			guochen = guochen->end;
			p = guochen->name;
			q = str;
			i = 0;
			n++;

		}
		head = y;
		jieguo();
	}break;
	case 2:
	{
		printf("[请输入你所要删除的信息的学生的学号]:");
		scanf("%d", &k); fflush(stdin);
		m = &k;
		while (guochen != NULL)
		{
			if (l == *m)
			{
				if (guochen == head)
				{
					prep = guochen->end;
					y = prep;
				}
				else
				{
					prep->end = guochen->end;
					i++;
				}
			}

			if (i == 0 && n > 0)
			{
				prep = prep->end;
			}
			
			guochen = guochen->end;
			if (guochen == NULL)break;//防止出现内存错误
			l = guochen->id;
			i = 0;
			n++;
			
			
		}
		head = y;
		jieguo();
	}break;
		default:printf("[输入错误,已返回主菜单!]\n\a");
	}
	
}
int tianjia()//添加某个信息
{
	int i=0, b;
	
	printf("你想要添加几组学生的信息?\n");
	guochen = head;
	scanf("%d", &b); fflush(stdin);
	while(guochen!=NULL)
	{
		i++;
		guochen = guochen->end;
	}
	printf("\n\t\t【姓名】 【学号】 【语文成绩】 【数学成绩】 【C语言】\n");
	for (int j = i; j<i + b; j++)
	{
		guochen = (struct student *)malloc(sizeof(struct student));
		if (head == NULL)
			head = guochen;
		else
			next->end = guochen;
		guochen->end = NULL;
		printf("第[%d]组:\t", j + 1);

		scanf("%s", guochen->name);
		scanf("%d", &guochen->id);
		scanf("%d", &guochen->chinese);
		scanf("%d", &guochen->math);
		scanf("%d", &guochen->c);
		next = guochen;
	}
	printf("[添加成功!!!]\n");
	return i;
}
void maopao(int x)//排序,最核心的部分
{
	struct student *p, *q, *temp = NULL, *prep, *tail, *subHead, *b, *v = NULL, *t;
	int c;
	printf("[1] [按学号对学生排序]\n");
	printf("[2] [按语文成绩对学生排序]\n");
	printf("[3] [按数学成绩对学生排序]\n");
	printf("[4] [按c语言成绩对学生排序]\n");
	scanf("%d", &c); fflush(stdin);
	prep = head;
	b = head;
	p = prep;
	q = prep->end;
	for (int i = 0; i < x + 1; i++)
	{
		while (q != NULL)
		{

			switch (c)
			{
			case 1:
			{

				if (p->id > q->id)
				{
					if (p == b)
					{
						p->end = q->end;
						q->end = p;
						head = q;
						prep = head;
						p = head;
						b = head;
						q = head->end;

					}
					else if (p != b)
					{
						p->end = q->end;
						q->end = p;
						head->end = q;
						head = head->end;
						p = head;
						q = head->end;
					}
				}
			}break;
			case 2:
			{
				if (p->chinese > q->chinese)
				{
					if (p == b)//开头排序情况
					{
						p->end = q->end;
						q->end = p;
						head = q;
						prep = head;
						p = head;
						b = head;
						q = head->end;

					}
					else if (p != b)//中间过程
					{
						p->end = q->end;
						q->end = p;
						head->end = q;
						head = head->end;
						p = head;
						q = head->end;
					}

				}	}break;
			case 3:
			{

				if (p->math > q->math)
				{
					if (p == b)
					{
						p->end = q->end;
						q->end = p;
						head = q;
						prep = head;
						p = head;
						b = head;
						q = head->end;

					}
					else if (p != b)
					{
						p->end = q->end;
						q->end = p;
						head->end = q;
						head = head->end;
						p = head;
						q = head->end;
					}

				}	}break;
			case 4:
			{
				if (p->c > q->c)
				{
					if (p == b)
					{
						p->end = q->end;
						q->end = p;
						head = q;
						prep = head;
						p = head;
						b = head;
						q = head->end;

					}
					else if (p != b)
					{
						p->end = q->end;
						q->end = p;
						head->end = q;
						head = head->end;
						p = head;
						q = head->end;
					}

				}
			}break;
			default:printf("[输入错误,已返回主菜单!]\a\n");
			}
			p = p->end;
			q = q->end;
		}
		head = prep;
		p = prep;
		q = prep->end;
	}

	jieguo();
		}
void pinjun()//求平均值
{

	float guide = 0;
	int k = 0,c;
	printf("[1] [语文平均分]\n");
	printf("[2] [数学平均分]\n");
	printf("[3] [C语言平均分]\n");
	scanf("%d", &c); fflush(stdin);
	guochen = head;
	while (guochen != NULL)
	{
		k++;
		switch (c)
		{
		case 1: 
		{
			guide = guochen->chinese + guide;
		
		}break;
		case 2:
		{
			guide = guochen->math + guide;

		}break;
		case 3:
		{
			guide = guochen->c + guide;

		}break;
		}
		guochen = guochen->end;
	}
	if (c == 1)printf("语文成绩的总平均为[%f]\n", guide / k);
	else if (c == 2)printf("数学成绩的总平均为[%f]\n", guide / k);
	else if (c == 3)printf("C语言成绩的总平均为[%f]\n", guide / k);
	else cv:printf("[输入错误,已返回主菜单!]\a\n");
}


发布了29 篇原创文章 · 获赞 24 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/yyk219/article/details/80084442