单链表学生管理系统(0723-林雪阵)

使用单链表形式完成学生管理系统以下操作

代码如下:

头文件 head.h

#ifndef __HEAD_H__
#define __HEAD_H__

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

typedef struct{
	int id;
	char name[20];
	float score;
}datatype;

typedef struct student{
	union{
		datatype data;
		int len;
	};
	struct student *next;
}STU;

//菜单
void menu();
//创建链表
STU* create();
//判空
int empty(STU *S);
//申请学生节点
STU* apply();
//新增学生信息(头插)
int add(STU *S);
//遍历学生信息
void show(STU *S);
//根据位置插入学生信息
int insert_pos(STU *S,int pos);
//按学号查询学生信息
STU* search_id(STU *S,int id);
//按姓名查询学生信息
STU* search_name(STU *S,char *name);
//删除指定学号学生信息
int delete_id(STU *S,int id);
//改名字
int change_id(STU *S,int old_id,int new_id);
//按成绩降序排列
void sort_down(STU *S);
//转置链表
void rever_list(STU *S);
//清空全部信息
void free_link(STU *S);


#endif

 功能函数文件 func.c

#include "head.h"

//menu
void menu()
{
	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");

}

//创建链表
STU* create()
{
	//判断逻辑
	STU* S=(STU*)malloc(sizeof(STU));
	if(NULL==S)
	{
		puts("创建失败");
		return NULL;
	}
	//头节点初始化
	S->next=NULL;
	S->len=0;
	//puts("创建成功");
	return S;
}
//判空
int empty(STU *S)
{
	return S->next==NULL?1:0;
}
//申请学生节点
STU* apply()
{
	//申请新节点
	STU *S=(STU*)malloc(sizeof(STU));
	if(NULL==S)
	{
		puts("节点申请失败");
		return NULL;
	}
	//给新申请节点赋值
	S->next=NULL;
	printf("请输入学生信息:\n");
	printf("学号:");
	scanf("%d",&S->data.id);
	getchar();
	printf("姓名:");
	gets(S->data.name);
	printf("成绩:");
	scanf("%f",&S->data.score);
	getchar();
	//返回申请节点
	return S;
}
//新增学生信息(头插)
int add(STU *S)
{
	//判断逻辑
	if(NULL==S)
	{
		puts("新增失败");
		return -1;
	}
	//申请新节点
	STU *p=apply();
	//头插
	p->next=S->next;
	S->next=p;
	//表的变化
	S->len++;
	puts("插入成功");
	return 0;
}
//遍历学生信息
void show(STU *S)
{
	//判断逻辑
	if(NULL==S)
	{
		puts("遍历失败");
		return;
	}
	if(empty(S))
	{
		puts("无信息");
		return;
	}
	//定义遍历指针遍历输出
	STU *p=S->next;
	printf("学号\t\t姓名\t\t成绩\n");
	while(p)
	{
		printf("%d\t\t%s\t\t%.2f\n",p->data.id,p->data.name,p->data.score);
		p=p->next;
	}
}
//根据位置插入学生信息
int insert_pos(STU *S,int pos)
{
	//判断逻辑
	if(NULL==S ||pos<=0 ||pos>S->len)
	{
		puts("插入失败");
		return -1;
	}
	//申请新节点
	STU *q=apply();
	if(NULL==q) return -1;

	//指针指向要插入前一个节点
	STU *p=S;
	for(int i=0;i<pos;i++)
	{
		p=p->next;
	}
	//插入操作
	q->next=p->next;
	p->next=q;
	//表的变化
	S->len++;
	puts("插入成功");
	return 0;
}
//按位置查询学生信息
STU* search_pos(STU*S,int pos)
{
	//判断逻辑
	if(NULL==S || pos<1 ||pos>S->len)
	{
		return NULL;
	}
	//定义遍历指针
	STU *p=S->next;
	//找到目标节点并返回
	for(int i=1;i<pos;i++)
	{
		p=p->next;
	}
	return p;
}
//按学号查询学生信息
STU* search_id(STU *S,int n)
{
	//判断逻辑
	if(NULL==S ||empty(S))
	{
		puts("无法查询");
		return NULL;
	}
	//定义遍历指针
	STU *p=S->next;
	//循环遍历查找目标节点
	while(p)
	{
		if(p->data.id==n)
		{
			break;
		}
		p=p->next;
	}
	//判断结果并返回
	if(NULL==p)
	{
		return NULL;
	}else
	{
		return p;
	}
}
//按姓名查询学生信息
STU* search_name(STU *S,char *na)
{
	//判断逻辑
	if(NULL==S ||empty(S))
	{
		puts("无法查询");
		return NULL;
	}
	STU *p=S;
	while(p)
	{
		if(strcmp(na,p->data.name)==0)
		{
			break;
		}
		p=p->next;
	}
	if(NULL==p)
	{
		return NULL;
	}else
	{
		return p;
	}
}
//删除指定学号学生信息
int delete_id(STU *S,int id)
{
	//判断逻辑
	if(NULL==S ||empty(S))
	{
		puts("删除失败");
		return -1;
	}
	//标记要删除节点
	STU *p=search_id(S,id);
	if(NULL==p)
	{
		puts("没有找到该学号");
		return -2;
	}
	//指针指向要删除前一个节点
	STU *q=S;
	while(q->next!=p)
	{
		q=q->next;
	}
	//删除节点
	q->next=p->next;
	free(p);
	p=NULL;
	//表的变化
	S->len--;
	puts("删除成功");
	return 0;
}
//改学号
int change_id(STU *S,int old_id,int new_id)
{
	//判断逻辑
	if(NULL==S)
	{
		puts("查找失败");
		return -1;
	}
	//调用查找函数,找到目标节点
	STU *p=search_id(S,old_id);
	if(NULL==p)
	{
		puts("查找失败");
		return -2;
	}
	//修改目标节点学号
	p->data.id=new_id;
	puts("修改成功");
	return 0;
}
//按成绩降序排列
void sort_down(STU *S)
{
	//判断逻辑
	if(NULL==S ||empty(S))
	{
		puts("无法排序");
		return;
	}
	//申请中间节点
	STU *p=(STU*)malloc(sizeof(STU));
	//冒泡排序
	for(int i=1;i<S->len;i++)
	{
		for(int j=1;j<=S->len-i;j++)
		{
			if(search_pos(S,j)->data.score < search_pos(S,j+1)->data.score)
			{
				p->data=search_pos(S,j)->data;
				search_pos(S,j)->data=search_pos(S,j+1)->data;
				search_pos(S,j+1)->data=p->data;
			}
		}
	}
	//释放临时节点空间
	free(p);
	p=NULL;
	puts("排序完成");
	return;
}
//转置链表
void rever_list(STU *S)
{
	//判断逻辑
	if(NULL==S ||S->len==0 ||S->len==1)
	{
		return;
	}
	//定义遍历指针
	STU *p=S->next;

	//孤立头结点
	S->next=NULL;

	//定义搬运指针
	STU*q=NULL;

	//遍历后头插
	while(p)
	{
		q=p;
		p=p->next;
		q->next=S->next;
		S->next=q;
	}
	puts("逆序成功");
	return;
}
//清空全部信息
void free_link(STU *S)
{
	//判断逻辑
	if(NULL==S)
	{
		return;
	}
	//使用头删法,循环释放链表空间
	while(S->next)
	{
		STU *p=S->next;
		S->next=p->next;
		free(p);
		p=NULL;
	}
	puts("数据已清空");
}

主函数(main.c)

#include "head.h"


int main(int argc, const char *argv[])
{
	//创建链表
	STU *S=create();
	if(NULL==S) return -1;

	while(1)
	{
		menu();
		printf("请输入您的选择:");
		int n;
		scanf("%d",&n);
		getchar();
		switch(n)
		{
			case 1:      //新增学生信息
				{
					int num;
					printf("请输入学生个数 :");
					scanf("%d",&num);
					getchar();
					for(int i=1;i<=num;i++)
					{
						add(S);
					}
				};
				break;
			case 2:       //查看信息
				{
					show(S);	
				};
				break;
			case 3:       //查找信息
				{
					int id,n1;
					char name[20];
					printf("请输入查询方式(1学号,2姓名) :");
					scanf("%d",&n);
					getchar();
					switch(n)
					{
						case 1:
							{
								printf("请输入要查询的学号:");
								scanf("%d",&id);
								getchar();
								STU *p=search_id(S,id);
								if(NULL==p)
								{
									puts("未查询到");
								}else
								{
									printf("查询到了:\n");
									printf("学号:%d\t姓名:%s\t成绩:%.2f\n",p->data.id,p->data.name,p->data.score);
								}
							};
							break;
						case 2:
							{
								printf("请输入要查询的姓名:");
								gets(name);
								STU *p=search_name(S,name);
								if(NULL==p)
								{
									puts("未查询到");
								}else
								{
									printf("查询到了:\n");
									printf("学号:%d\t姓名:%s\t成绩:%.2f\n",p->data.id,p->data.name,p->data.score);
								}						
							}
					}
				};
				break;
			case 4:       //插入信息
				{
					int pos;
					printf("请输入要插入的位置:");
					scanf("%d",&pos);
					getchar();
					insert_pos(S,pos);
				};
				break;
			case 5:       //更改信息
				{
					int id1,id2;
					printf("请输入要更改的学号和目的学号:");
					scanf("%d%d",&id1,&id2);
					getchar();
					change_id(S,id1,id2);
				};
				break;
			case 6:      //成绩排名
				{
					sort_down(S);
				};
				break;
			case 7:      //成绩逆序
				{
					rever_list(S);
				};
				break;
			case 8:      //删除信息
				{
					int id3;
					printf("请输入要删除的学生id:");
					scanf("%d",&id3);
					delete_id(S,id3);
				};
				break;
			case 9:      //清空信息
				{
					free_link(S);
				};
				break;
			case 0: exit(0); break;
			default :printf("输入选项不存在,请重新输入!\n");
		}
	}
	return 0;
}

功能实现:

*******学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:1
请输入学生个数 :3
请输入学生信息:
学号:1
姓名:tom
成绩:88
插入成功
请输入学生信息:
学号:2
姓名:jerry
成绩:60
插入成功
请输入学生信息:
学号:3
姓名:zs
成绩:43
插入成功
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:2
学号		姓名		成绩
3		zs		43.00
2		jerry		60.00
1		tom		88.00
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:3
请输入查询方式(1学号,2姓名) :1
请输入要查询的学号:2
查询到了:
学号:2	姓名:jerry	成绩:60.00
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:4
请输入要插入的位置:4
插入失败
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:4
请输入要插入的位置:3
请输入学生信息:
学号:4 
姓名:wwe
成绩:66
插入成功
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:2
学号		姓名		成绩
3		zs		43.00
2		jerry		60.00
1		tom		88.00
4		wwe		66.00
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:5
请输入要更改的学号和目的学号:4 14
修改成功
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:2
学号		姓名		成绩
3		zs		43.00
2		jerry		60.00
1		tom		88.00
14		wwe		66.00
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:6
排序完成
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:2
学号		姓名		成绩
1		tom		88.00
14		wwe		66.00
2		jerry		60.00
3		zs		43.00
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:7
逆序成功
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:2
学号		姓名		成绩
3		zs		43.00
2		jerry		60.00
14		wwe		66.00
1		tom		88.00
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:8
请输入要删除的学生id:14
删除成功
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:2
学号		姓名		成绩
3		zs		43.00
2		jerry		60.00
1		tom		88.00
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:9
数据已清空
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:2
无信息
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:0

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

林某某..

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

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

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

打赏作者

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

抵扣说明:

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

余额充值