2022/7/24---数据结构day4

本文详细记录了作者使用单链表实现学生信息管理系统的全过程,包括数据结构定义、操作函数如创建、插入、删除、查找、排序及菜单交互等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创作本文目的:记录自己的学习历程

单链表实现学生信息管理系统


一、student.h

#ifndef __STUDENT_H__
#define __STUDENT_H__

#define MAX 20         	//姓名长度

typedef struct student
{
	int id;				//学号
	char name[MAX]; 	//姓名
	int score; 			//成绩
}datatype;

typedef struct Node
{
	union
	{
		datatype data;
		int len;
	};

	struct Node *next;
}Linklist;

//创建
Linklist *list_create();

//判空
int list_empty(Linklist *);

//申请节点函数
Linklist *Node_apply(datatype );

//遍历
void list_show(Linklist *);

//按位置查找返回找到的节点
Linklist *find_node(Linklist *,int );

//销毁
void list_free(Linklist *);

//目录
void meun();

//学生信息插入
void stu_insert(Linklist *);

//学生信息删除
void stu_delete(Linklist *);

//学生信息查看与修改
void stu_search_and_updata(Linklist *);

//排序
void sort(Linklist *);

#endif

二、student.c

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

//目录
void meun()
{
	printf("\t\t*********************************\n");
	printf("\t\t*\t链式学生管理系统\t*\n");
	printf("\t\t*\t1.增\t\t\t*\n");
	printf("\t\t*\t2.删\t\t\t*\n");
	printf("\t\t*\t3.查与改\t\t*\n");
	printf("\t\t*\t4.排序\t\t\t*\n");
	printf("\t\t*\t5.查看全部信息\t\t*\n");
	printf("\t\t*\t0.清空并退出\t\t*\n");
	printf("\t\t*********************************\n");
}
//创建
Linklist *list_create()
{
	Linklist *l = (Linklist *)malloc(sizeof(Linklist));
	if(NULL == l)
	{
		printf("创建失败\n");
		return NULL;
	}

	l->len=0;
	l->next=NULL;
	printf("创建成功\n");
	return l;
}

//判空
int list_empty(Linklist *L)
{
	if(NULL==L)
	{
		printf("表不合法\n");
		return -1;
	}
	return NULL==L->next?1:0;
}

//申请节点函数
Linklist *Node_apply(datatype e)
{
	Linklist *p = (Linklist *)malloc(sizeof(Linklist));
	if(NULL == p)
	{
		printf("节点申请失败\n");
		return NULL;
	}

	p->data =e;
	p->next =NULL;
	return p;
}

//遍历
void list_show(Linklist *L)
{
	if(NULL==L || list_empty(L))
	{
		printf("表空,遍历失败\n");
		return;
	}
	printf("\t\t学生信息\n");
	Linklist *q = L->next;
	while(q != NULL)
	{
		printf("学号:%d\t\t姓名:%s\t\t成绩:%d\n",q->data.id,q->data.name,q->data.score);
		q = q->next;
	}
	printf("\n");
}

//按位置查找返回节点
Linklist *find_node(Linklist *L,int pos)
{
	if(NULL==L || pos<0 || pos>L->len)
	{
		printf("查找失败\n");
		return NULL;
	}

	Linklist *q = L;
	for(int i=1;i<=pos;i++)
	{
		q = q->next;
	}

	return q;
}

//销毁
void list_free(Linklist *L)
{
	if(NULL==L)
	{
		printf("不合法\n");
		return;
	}

	while(L->next!=NULL)
	{
		Linklist *p = L->next; //标记
		L->next = p->next; //孤立
		free(p); //踢开
		p=NULL;
		L->len--;	
	}
	free(L);
	L=NULL;
	printf("释放完成\n");
}

//学生插入
void stu_insert(Linklist *L)
{
	int choice;
	int n;
	while(1)
	{
		printf("选择插入方式\n1.头部插入n个\n2.尾部插入n个\n3.任意位置插入n个\n请输入:");
		scanf("%d",&choice);
		if(choice>3 || choice<1)
		{
			printf("请输入正确的选项:");
			while(getchar()!='\n');
			continue;
		}
		printf("输入人数:");
		scanf("%d",&n);
		switch(choice)
		{
			case 1:
				{
					for(int i=0;i<n;i++)
					{
						datatype info;
						printf("输入第%d个学生信息:",i+1);
						scanf("%d%s%d",&info.id,info.name,&info.score);
						Linklist *s=Node_apply(info);
						s->next=L->next;
						L->next=s;
						L->len++;
						printf("头部插入成功\n");
					}
				}break;
			case 2:
				{
					for(int i=0;i<n;i++)
					{
						datatype info;
						printf("输入第%d个学生信息:",i+1);
						scanf("%d%s%d",&info.id,info.name,&info.score);
						Linklist *s=Node_apply(info);
						Linklist *q=L;
						while(q->next!=NULL)
						{
							q=q->next;
						}
						q->next=s;
						L->len++;
						printf("尾部插入成功\n");
					}
				}break;
			case 3:
				{
					int tmp=1;
					while(1)
					{
						if(L->len)
						{
							printf("输入从第几位插入:");
							scanf("%d",&tmp);
							if(tmp<1 || tmp>L->len+1)
							{
								printf("请输入正确的数\n");
								continue;
							}
						}
						break;
					}
					for(int i=0;i<n;i++)
					{
						datatype info;
						printf("输入第%d个学生信息:",i+1);
						scanf("%d%s%d",&info.id,info.name,&info.score);
						Linklist *s=Node_apply(info);
					
						Linklist *q=L;
						for(int j=0;j<tmp-1;j++)
							q=q->next;
						s->next=q->next;
						q->next=s;

						tmp++;
						L->len++;
						printf("插入成功\n");
					}
				}break;
		}
		break;
	}
}

//学生删除
void stu_delete(Linklist *L)
{
	if(NULL==L || list_empty(L))
	{
		printf("所给链表不合法\n");
		return;
	}
	int choice;
	int n;
	while(1)
	{
		printf("选择删除方式\n1.头部删除n个\n2.尾部删除n个\n3.任意位置删除n个\n请输入:");
		scanf("%d",&choice);
		if(choice>3 || choice<1)
		{
			printf("请输入正确的选项:");
			while(getchar()!='\n');
			continue;
		}
		while(1)
		{
			printf("输入人数:");
			scanf("%d",&n);
			if(n>L->len)
			{
				printf("请输入正确的数\n");
				while(getchar()!='\n');
				continue;
			}
			break;
		}
		switch(choice)
		{
			case 1:
				{
					for(int i=0;i<n;i++)
					{
						Linklist *s=L->next;
						L->next=s->next;
						free(s);
						s=NULL;
						L->len--;
						printf("头部删除成功\n");
					}
				}break;
			case 2:
				{
					for(int i=0;i<n;i++)
					{
						Linklist *q=L;
						while(q->next->next!=NULL)
						{
							q=q->next;
						}
						free(q->next);
						q->next=NULL;
						L->len--;
						printf("尾部删除成功\n");
					}
				}break;
			case 3:
				{
					int tmp=0;
					while(1)
					{
						if(L->len && n)
						{
							printf("输入从第几位删除:");
							scanf("%d",&tmp);
							if(tmp<1 || tmp>L->len+1)
							{
								printf("请输入正确的数\n");
								continue;
							}
						}
						break;
					}
					for(int i=0;i<n;i++)
					{
						Linklist *s=find_node(L,tmp-1);
						Linklist *p=s->next;
						s->next=p->next;
						free(p);
						p=NULL;
						L->len--;
						printf("删除成功\n");
					}
				}break;
		}
		break;
	}
}

//学生信息查看与修改
void stu_search_and_updata(Linklist *L)
{
	if(NULL==L ||list_empty(L))
	{
		printf("所给链表不合法\n");
		return;
	}
	int choice;
	while(1)
	{
		printf("选择查看方式\n1.按位置进行查看\n2.按学号进行查看\n3.按姓名进行查看\n4.按成绩进行查看\n请输入:");
		scanf("%d",&choice);
		if(choice<1 || choice>4)
		{
			printf("选择正确的修改方式\n");
			continue;
		}
		break;
	}
	switch(choice)
	{
		case 1:
			{
				int pos=0;
				char ch;
				datatype new;
				while(1)
				{
					printf("输入要查看的位置:");
					scanf("%d",&pos);
					if(pos<1 || pos>L->len)
					{
						printf("请输入正确的位置\n");
						continue;
					}
					break;
				}
				Linklist *p=find_node(L,pos);
				printf("\n学号:%d\t\t姓名:%s\t\t成绩:%d\n",p->data.id,p->data.name,p->data.score);
				while(getchar()!='\n');
				printf("\n是否修改当前信息(y/n):");
				ch=getchar();
				if(ch=='y')
				{
					printf("输入修改信息:");
					scanf("%d%s%d",&new.id,new.name,&new.score);
					p->data=new;
					printf("修改成功\n");
				}
				else
				{
					printf("未修改\n");
				}
			}break;
		case 2:
			{
				datatype new;
				int flag=0;
				char ch;
				printf("输入要查看位置的学号:");
				scanf("%d",&new.id);
				Linklist *p=L->next;
				while(p!=NULL)
				{
					if(p->data.id==new.id)
					{
						printf("\n学号:%d\t\t姓名:%s\t\t成绩:%d\n",p->data.id,p->data.name,p->data.score);
						while(getchar()!='\n');
						printf("\n是否修改当前信息(y/n):");
						ch=getchar();
						if(ch=='y')
						{
							printf("输入修改信息:");
							scanf("%d%s%d",&new.id,new.name,&new.score);
							p->data=new;
							printf("修改成功\n");
						}
						else
						{
							printf("未修改\n");
						}
						flag=1;
					}
					p=p->next;
				}
				if(!flag)
				{
					printf("查无此人\n");
				}
			}break;
		case 3:
			{
				datatype new;
				int flag=0;
				char ch;
				printf("输入要查看位置的姓名:");
				scanf("%s",new.name);
				Linklist *p=L->next;
				while(p!=NULL)
				{
					if(strcmp(p->data.name,new.name)==0)
					{
						printf("\n学号:%d\t\t姓名:%s\t\t成绩:%d\n",p->data.id,p->data.name,p->data.score);
						while(getchar()!='\n');
						printf("\n是否修改当前信息(y/n):");
						ch=getchar();
						if(ch=='y')
						{
							printf("输入修改信息:");
							scanf("%d%s%d",&new.id,new.name,&new.score);
							p->data=new;
							printf("修改成功\n");
						}
						else
						{
							printf("未修改\n");
						}
						flag=1;
					}
					p=p->next;
				}
				if(!flag)
				{
					printf("查无此人\n");
				}
			}break;
		case 4:
			{
				datatype new;
				int flag=0;
				char ch;
				printf("输入要查看位置的成绩:");
				scanf("%d",&new.score);
				Linklist *p=L->next;
				while(p!=NULL)
				{
					if(p->data.score==new.score)
					{
						printf("\n学号:%d\t\t姓名:%s\t\t成绩:%d\n",p->data.id,p->data.name,p->data.score);
						while(getchar()!='\n');
						printf("\n是否修改当前信息(y/n):");
						ch=getchar();
						if(ch=='y')
						{
							printf("输入修改信息:");
							scanf("%d%s%d",&new.id,new.name,&new.score);
							p->data=new;
							printf("修改成功\n");
						}
						else
						{
							printf("未修改\n");
						}
						flag=1;
					}
					p=p->next;
				}
				if(!flag)
				{
					printf("查无此人\n");
				}
			}break;
	}
}

//排序
void sort(Linklist *L)
{
	if(NULL==L || list_empty(L))
	{
		printf("所给链表不合法\n");
		return;
	}
	int i,j;
	Linklist *q=L->next;
	datatype tmp;
	for(i=1;i<L->len;i++)
	{
		q=L->next;
		for(j=0;j<L->len-i;j++)
		{
			if(q->data.score>q->next->data.score)
			{
				tmp=q->data;
				q->data=q->next->data;
				q->next->data=tmp;
			}
			q=q->next;
		}
	}
	printf("排序完成\n");
}

三、main.c

#include "student.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, const char *argv[])
{
	char choice;
	Linklist *L = list_create();
	if(NULL==L)
	{
		return -1;
	}
	while(1)
	{
		meun();
		printf("\n请选择(0-4):");
		scanf("%c",&choice);
		switch(choice)
		{
			case '1':
				{
					stu_insert(L);
				}break;
			case '2':
				{
					stu_delete(L);
				}break;
			case '3':
				{
					stu_search_and_updata(L);
				}break;
			case '4':
				{
					sort(L);
				}break;
			case '5':
				{
					list_show(L);
				}break;
			case '0':
				{
					list_free(L);
					L=NULL;
					sleep(1); //延时1s
					exit(0);
				}break;
			default:printf("\n请输入正确的选项\n");
		}
		while(getchar()!='\n');
	}
	return 0;
}

四、测试结果

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值