数据结构-链表实现学生信息管理系统

主函数

#include "fun.h"

int main(int argc, const char *argv[])
{
	Node *S = createlist();
	menu();
	while (1)
	{
		choice(S);
	}
	return 0;
}

函数声明

#ifndef __FUN_H__
#define __FUN_H__

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Node
{
	int id;
	char name[10];
	int score;
	int len;
	struct Node* next;
}Node;

//创建一个学生链表
Node *createlist();

//创建一个学生的结点
Node *createnode(Node *S,const int id,const char *name,const int score);

//判空
int empty(Node *S);

//在头部插入一个学生的信息
int ins_head(Node *S,const int id,const char *name,const int score);

//在尾部插入一个学生的信息
int ins_tail(Node *S,int id,char *name,int score);

//删除头部学生信息
int del_head(Node *S);

//删除尾部学生信息
int del_tail(Node *S);

//按姓名删除学生信息
int del_name(Node *S,char *name);

//按学号删除学生信息
int del_id(Node *S,int id);

//按学号修改学生信息
int change_id(Node *S,int id,int score);

//按姓名修改学生信息	
int change_name(Node *S,char *name,int score);

//按学号查找学生的信息
int find_id(Node *S,int id);

//按姓名查找学生的信息
int find_name(Node *S,char *name);

//遍历所有学生信息
int tra(Node *S);

//按学号排序
Node *sort_id(Node *S);

//按成绩排序
Node *sort_score(Node *S);

//菜单界面
void menu();

//输入项选择
int input();

//选择需要的操作  输入数据
int choice();

#endif

被调函数

#include "fun.h"

//------------------------------------------------------------
//创建一个学生链表
Node *createlist()
{
	//申请链表
	Node *S = (Node*)malloc(sizeof(Node));
	if (NULL == S)
	{
		printf("学生列表申请失败\n");
		return NULL;
	}

	printf("学生列表申请成功\n");

	//初始化
	S->id = 0;
	strcpy(S->name,"");
	S->score = 0;
	S->next = NULL;
	S->len = 0;
	return S;
}

//------------------------------------------------------------
//判空
int empty(Node *S)
{
	return NULL == S->next ? 1 : 0;   //1空 0非空
}

//------------------------------------------------------------
//创建一个学生的结点
Node *createnode(Node *S,const int id,const char *name,const int score)
{
	S = (Node*)malloc(sizeof(Node)); //给结点分配一个内存空间
	if (NULL == S)
	{
		printf("节点申请失败\n");
		return NULL;
	}

	//放数据
	S->id = id;
	strcpy(S->name,name);
	S->score = score;
	S->next = NULL;
	S->len++;
	return S;
}

//------------------------------------------------------------
//在头部插入一个学生的信息
int ins_head(Node *S,const int id,const char *name,const int score)
{
	if (NULL == S)
	{
		printf("所给链表不合法\n");
		return 0;
	}
	Node *p = createnode(S,id,name,score);
	if (NULL == p)
	{
		printf("结点申请失败\n");
		return 0;
	}

	//完成头插
	p->next = S->next;
	S->next = p;

	//表的变化
	S->len++;

	return 1;

}

//------------------------------------------------------------
//在尾部插入一个学生的信息
int ins_tail(Node *S,int id,char *name,int score)
{
	if (NULL == S)
	{
		printf("所给链表不合法\n");
		return 0;
	}
	Node *p = createnode(S,id,name,score);
	if (NULL == p)
	{
		printf("结点申请失败\n");
		return 0;
	}
	while (NULL != S->next)
	{
		S = S->next;
	}

	//完成尾插
	S->next = p;
	p->next = NULL;

	//表的变化
	S->len++;
	return 1;
}

//------------------------------------------------------------
//删除头部学生信息
int del_head(Node *S)
{
	if (NULL == S || empty(S))
	{
		printf("删除失败\n");
		return 0;
	}
	Node *p = S->next->next;
	free(S->next);
	S->next = p;
	p = NULL;
	S->len--;
	return 1;
}

//------------------------------------------------------------
//删除尾部学生信息
int del_tail(Node *S)
{
	if (NULL == S || empty(S))
	{
		printf("删除失败\n");
		return 0;
	}
	while (S->next->next != NULL)
	{
		S = S->next;
	}
	Node *p = S->next;
	S->next = NULL;
	free(p);
	p = NULL;
	S->len--;
	return 1;
}

//------------------------------------------------------------
//按姓名删除学生信息
int del_name(Node *S,char *name)
{
	if (NULL == S || empty(S))
	{
		printf("删除失败\n");
		return 0;
	}
	Node *p;

	while (S->next != NULL)
	{
		if (!strcmp(S->next->name,name))
		{
			p = S->next->next;
			free(S->next);
			S->next = p;
			p = NULL;
			S->len--;
			return 1;
		}
		S = S->next;
	}

	printf("没有该学生信息,无法删除\n");
	return 0;
}

//------------------------------------------------------------
//按学号删除学生信息
int del_id(Node *S,int id)
{
	if (NULL == S || empty(S))
	{
		printf("删除失败\n");
		return 0;
	}
	Node *p;

	while (S->next != NULL)
	{
		if (id == S->next->id)
		{
			p = S->next->next;
			free(S->next);
			S->next = p;
			p = NULL;
			S->len--;
			return 1;
		}
		S = S->next;

	}

	printf("没有该学生信息,无法删除\n");
	return 0;
}

//------------------------------------------------------------
//按学号修改学生的信息
int change_id(Node *S,int id,int score)
{
	while (S->next != NULL)
	{
		if (id == S->next->id)
		{
			S->next->score = score;
			return 1;
		}
		S = S->next;
	}
	printf("修改失败\n");
	return 0;

}

//------------------------------------------------------------
//按姓名修改学生的信息
int change_name(Node *S,char *name,int score)
{
	while (S->next != NULL)
	{
		if (!strcmp(name,S->next->name))
		{
			S->next->score = score;
			return 1;
		}
		S = S->next;
	}
	printf("查找失败\n");
	return 0;

}

//------------------------------------------------------------
//按学号查找学生的信息
int find_id(Node *S,int id)
{
	if (NULL == S || empty(S))
	{
		printf("查找失败\n");
		return 0;
	}
	Node *p = S;

	printf("学号\t姓名\t成绩\n");
	while (p->next != NULL)
	{
		if (p->next->id == id)
		{
			printf(" %d\t%s\t %d\n",p->next->id,p->next->name,p->next->score);
			return 1;
		}
		p = p->next;
	}
	printf("未查询到该学生信息\n");
	return 0;
}

//------------------------------------------------------------
//按姓名查找学生的信息
int find_name(Node *S,char *name)
{
	if (NULL == S || empty(S))
	{
		printf("查找失败\n");
		return 0;
	}
	Node *p = S;

	printf("学号\t姓名\t成绩\n");
	while (p->next != NULL)
	{
		if (!strcmp(p->next->name,name))
		{
			printf(" %d\t%s\t %d\n",p->next->id,p->next->name,p->next->score);
			return 1;
		}
		p = p->next;
	}
	printf("未查询到该学生信息\n");
	return 0;
}

//------------------------------------------------------------
//遍历所有的信息
int tra(Node *S)
{
	if (NULL == S || empty(S))
	{
		printf("遍历失败\n");
		return 0;
	}
	printf("学号\t姓名\t成绩\n");
	do
	{
		printf(" %d\t%s\t %d\n",S->next->id,S->next->name,S->next->score);
		S = S->next;
	}while(S->next != NULL);
	return 1;
}

//------------------------------------------------------------
//按学号排序
Node *sort_id(Node *S)
{
	Node *X = S;
	Node *head = X;
	Node *p = X->next;
	if (X->next == NULL)
	{
		printf("链表错误\n");
		return NULL;
	}
	Node *q = p->next;
	if (X->next->next == NULL)
	{
		printf("数据过少无需排序\n");
		return NULL;
	}
	for (int i=1;i<S->len;i++)
	{
		for (int j=0;j<S->len-i;j++)
		{
			if (q->id > p->id)
			{
				if (p->next == q)
				{
					head->next = q;
					if (q->next == NULL)
					{
						p->next = NULL;
					}
					else
					{
						p->next = q->next;
					}
					q->next = p;
				}
				else if (q->next == p)
				{
					head->next = p;
					if (p->next == NULL)
					{
						q->next = NULL;
					}
					else
					{
						q->next = p->next;
					}
					p->next = q;
				}
			}
			head = head->next;
			q = q->next;
			p = p->next;
		}
	}
	tra(p);
	
	return X; 
}


//------------------------------------------------------------
//按成绩排序
Node *sort_score(Node *S)
{
	Node *X = S;
	Node *head = X;
	Node *p = X->next;
	if (X->next == NULL)
	{
		printf("链表错误\n");
		return NULL;
	}
	Node *q = p->next;
	if (X->next->next == NULL)
	{
		printf("数据过少无需排序\n");
		return NULL;
	}
	for (int i=1;i<S->len;i++)
	{
		for (int j=0;j<S->len-i;j++)
		{
			if (q->score > p->score)
			{
				if (p->next == q)
				{
					head->next = q;
					if (q->next == NULL)
					{
						p->next = NULL;
					}
					else
					{
						p->next = q->next;
					}
					q->next = p;
				}
				else if (q->next == p)
				{
					head->next = p;
					if (p->next == NULL)
					{
						q->next = NULL;
					}
					else
					{
						q->next = p->next;
					}
					p->next = q;
				}
			}
			head = head->next;
			q = q->next;
			p = p->next;
		}
	}
	tra(p);
	
	return X; 

}


//------------------------------------------------------------
//菜单界面
void menu()
{
	printf("         ┌-----------------------------------------┐\n");
	printf("         |                                         |\n");
	printf("         |         欢迎使用学生信息管理系统          |\n");
	printf("         |_________________________________________|\n");
	printf("         |                          当前版本:V2.0  |\n");
	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("         |  10 按姓名修改学生信息                  |\n");
	printf("         |  11 按学号查找学生的信息                |\n");
	printf("         |  12 按姓名查找学生的信息                |\n");
	printf("         |  13 查看所有学生信息                    |\n");
	printf("         |  14 按学号排序                          |\n");
	printf("         |  15 按成绩排序                          |\n");
	printf("         |  16 清屏                                |\n");
	printf("         |   0 退出                                |\n");
	printf("         └-----------------------------------------┘\n");
}




//------------------------------------------------------------
//选择需要的操作
int choice(Node *S)
{
	int n = 0;
	n = input();
	switch(n)
	{
	case 1:
		menu();
		break;
	case 2:
		{
			int sum;
			printf("请输入添加的学生人数:");
			scanf("%d",&sum);
			for (int i = 0;i<sum;i++)
			{
				int id,score;
				char name[10];
				printf("请输入第%d名同学学号:",i+1);
				scanf("%d",&id);
				printf("请输入第%d名同学姓名:",i+1);
				scanf("%s",name);
				printf("请输入第%d名同学成绩:",i+1);
				scanf("%d",&score);
				ins_tail(S,id,name,score);
			}
		}
		break;
	case 3:
		{
			int id,score;
			char name[10];
			printf("请输入学号:");
			scanf("%d",&id);
			printf("请输入姓名:");
			scanf("%s",name);
			printf("请输入成绩:");
			scanf("%d",&score);
			if(ins_head(S,id,name,score))
			{
				printf("头插成功\n");
			}
		}
		break;
	case 4:
		{
			int id,score;
			char name[10];
			printf("请输入学号:");
			scanf("%d",&id);
			printf("请输入姓名:");
			scanf("%s",name);
			printf("请输入成绩:");
			scanf("%d",&score);
			if(ins_tail(S,id,name,score))
			{
				printf("尾插成功\n");
			}
		}
		break;
	case 5:
		{
			if(del_head(S))
			{
				printf("头删成功\n");
			}
		}
		break;
	case 6:
		{
			if (del_tail(S))
			{
				printf("尾删成功\n");
			}
		}
		break;
	case 7:
		{
			char name[10];
			printf("请输入要删除的学生姓名:");
			scanf("%s",name);
			if (del_name(S,name))
			{
				printf("删除成功\n");
			}
		}
		break;
	case 8:
		{
			int id;
			printf("请输入要删除的学生学号:");
			scanf("%d",&id);
			if (del_id(S,id))
			{
				printf("删除成功\n");
			}
		}
		break;
	case 9:
		{
			int id;
			printf("请输入要修改成绩的学生学号:");
			scanf("%d",&id);
			if (!find_id(S,id))
			{
				printf("没有该学生!\n");
			}
			else
			{
				int score;
				printf("请输入修改的成绩:");
				scanf("%d",&score);
				if (change_id(S,id,score))
				{
					printf("修改成功\n");
				}
			}
		}
		break;
	case 10:
		{
			char name[10];
			printf("请输入要修改成绩的学生姓名:");
			scanf("%s",name);
			if (!find_name(S,name))
			{
				printf("没有该学生!\n");
			}
			else
			{
				int score;
				printf("请输入修改的成绩:");
				scanf("%d",&score);
				if (change_name(S,name,score))
				{
					printf("修改成功\n");
				}
			}
		}
		break;
	case 11:
		{
			int id;
			printf("请输入要查找的学生学号:");
			scanf("%d",&id);
			if (find_id(S,id))
			{
				printf("查找成功\n");
			}
		}
		break;
	case 12:
		{
			char name[10];
			printf("请输入要查找的学生姓名:");
			scanf("%s",name);
			if(find_name(S,name));
			{
				printf("查找成功\n");
			}
		}
		break;
	case 13:
		{
			if (tra(S))
			{
				printf("所有学生信息输出成功\n");
			}
		}
		break;
	case 14:
		{
			Node *L = sort_id(S);
			if (L == NULL)
			{
				return -1;
			}
			printf("按学号排序成功\n");
			tra(L);
		}
		break;
	case 15:
		{
			Node *L = sort_score(S);
			if (L == NULL)
			{
				return -1;
			}
			printf("按成绩排序成功\n");
		}
		break;
	case 16:
		system("clear");
		break;
	case 0:
		system("clear");
		exit(0);
		break;
	}
}


//------------------------------------------------------------
//输入
int input()
{
	int num;
	printf("请输入你的选项:");
	scanf("%d",&num);
	if (num >= 0 && num <= 17)
	{
		return num;
	}
	else
	{
		system("clear");
		menu();
		printf("输入错误请重新输入\n");
		scanf("%*[^\n]%*c");
		input();
	}
}

测试

》》请输入你的选项:2
请输入添加的学生人数:2
请输入第1名同学学号:1002
请输入第1名同学姓名:hh
请输入第1名同学成绩:99
请输入第2名同学学号:1005
请输入第2名同学姓名:ll
请输入第2名同学成绩:55

》》请输入你的选项:3
请输入学号:1009
请输入姓名:jj
请输入成绩:56
头插成功

》》请输入你的选项:4
请输入学号:22
请输入姓名:pl
请输入成绩:85
尾插成功

》》请输入你的选项:13
学号	姓名	成绩
1009	jj	    56
1002	hh	    99
1005	ll  	55
22	    pl	    85
所有学生信息输出成功

》》请输入你的选项:5
头删成功

》》请输入你的选项:6
尾删成功

》》请输入你的选项:13
学号	姓名	成绩
1002	hh	    99
1005	ll	    55
所有学生信息输出成功
请输入你的选项:7

》》请输入要删除的学生姓名:hh
删除成功
请输入你的选项:8

》》请输入要删除的学生学号:1005
删除成功

》》请输入你的选项:13
遍历失败

。。。。。。。。。。。。。。。。。。

  • 3
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coding Peasant

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值