大一上学期基于c语言的学生信息管理系统小项目(链表实现)

项目场景:学生信息管理系统


问题描述:

创建一个menu页面 其中包括浏览信息、查看信息,添加信息,修改信息,删除信息五个方面的内容。要求能够随时查找,修改、浏览等基本功能


解决方案:

1.浏览信息:打印链表
2.查看信息:打印某一个特定的节点
3.修改信息:对某一个特定的节点里面的成员进行修改
4.删除信息:删除一个节点
5.添加信息:插入一个节点

相应的功能实现:

 打印链表:

void printfnode(struct node* headnode)
{
	struct node* pMove = headnode->next;//头指针没有初始化,因此从第二个开始打印
	printf("----------------【当前所有成员信息】--------------------\n");
	printf("\t姓名\t年龄\t性别\t电话号码\n");
	if (pMove == NULL)
	{
		printf("没有成员信息\n");
		return;
	}
	while (pMove != NULL)
	{
		printf("\t%s\t%d\t%s\t%s\n", pMove->data.name, pMove->data.old, pMove->data.gender, pMove->data.tel);
		pMove = pMove->next;
	}
}

 插入节点:

void insertInfoBynode(struct node* headnode, struct student data)
{
	struct node* newnode = creatNode(data);//需要创建一个节点,因此还要写一个创建节点的函数
	newnode->next = headnode->next;
	
	headnode->next = newnode;
}

 删除节点:

void deleteNode(struct node* headnode, char* name)
{
	struct node* posData = headnode->next;
	struct node* FrontNode = headnode;
	if (posData == NULL)
	{
		printf("没有数据,无法删除任何信息\n");
		return;
	}
	while (strcmp(posData->data.name, name) != 0)
	{
		FrontNode = posData;
		posData = posData->next;
		if (posData == NULL)
		{
			printf("查无此人,无法删除\n");
			return;
		}
	}
	FrontNode->next = posData->next;
	free(posData);
	return;
}

 打印节点:

struct node* printfInfoBynode(struct node* headnode, char* name)
{
	struct node* pMove = headnode->next;
	while (pMove != NULL && strcmp(pMove->data.name, name) != 0)
	{
		pMove = pMove->next;
	}
	if (pMove == NULL)
	{
		printf("抱歉,没有成员信息\n");
		return NULL;
	}
	else
	{
		printf("姓名\t年龄\t性别\t电话号码\n");
		printf("%s\t%d\t%s\t%s\n", pMove->data.name, pMove->data.old, pMove->data.gender, pMove->data.tel);
		return pMove;
	}
}

 修改节点:

void changeInfo(struct node* headnode,char* name)
{
	struct node* newnode = searchNode(headnode,name);
	printfInfoBynode(headnode, name);
	if (newnode == NULL)
	{
		return;
	}
	else{
			printf("====================【用户信息】==================");
			printf("请问您需要修改什么信息\n");
			printf("1.名字\n2.年龄\n3.性别\n4.电话号码\n");
			int choice = 0;
			char toname[20];
			char togender[20] ;
			char totel [20];
				cin >> choice;
				switch (choice)
				{
				case 1:
					printf("请输入要修改后的名字:\n");
					cin >> toname;
				
						strcpy(newnode->data.name, toname);
						printf("修改成功!\n");
						break;
					
				case 3:
						printf("请输入修改后的性别:\n");
			
						cin >> togender;
						strcpy(newnode->data.gender, togender);
						printf("修改成功!");
						break;
					
				case 2:
					printf("请输入修改后的年龄:\n");
					int toold;
					cin >> toold;
					newnode->data.old = toold;
					printf("修改成功!\n");
					break;
				case 4:
					printf("请输入修改后的电话号码:");
					cin >> totel;
				
						strcpy(newnode->data.tel, totel);
						printf("修改成功!");
						break;
					
				default:
					printf("输入错误,请重新输入");
					break;
				}
	}
}

 创建节点:

struct node* creatNode(struct node data)
{
	struct node* newnode=(struct node*)malloc(sizeof(struct node));
	headnode->next=NULL;
	headnode->data=data;
	return newcode;
}

  创建链表

void creatList()
{
	struct node* headnode=(struct node*)malloc(sizeof(struct node));
	headnode->next=NULL;
	returun ;
}

 查找节点

struct node* searchNode(struct node* headnode, char* name)
{
	struct node* pMove = headnode->next;
	while (pMove != NULL && strcmp(pMove->data.name, name) != 0)
	{
		pMove = pMove->next;
	}
	if (pMove == NULL)
	{
		printf("抱歉,查无此人");
		return NULL;
	}
	else
	{
		return pMove;
	}
}

==================================================
完整代码:

/*************************************************************************************
							项目名称:学生信息管理系统

							项目功能:录入、修改、删除、查找、浏览信息

							作者:yanghui

							编译环境:VS2019
**************************************************************************************/


#include<iostream>
#include<string.h>
#include<cstdlib>
using namespace std;
struct student {
	char name[20];
	char gender[20];
	int old;
	char tel[20];
};
struct node {
	struct student data;
	struct node* next;
};


//建立链表
struct node* creatList()
{
	struct node* headnode = (struct node*)malloc(sizeof(struct node));
	headnode->next = NULL;
	return headnode;
}



//建立节点
struct node* creatNode(struct student data)
{
	struct node* newnode = (struct node*)malloc(sizeof(struct node));
	newnode->next = NULL;
	newnode->data = data;
	return newnode;
}

//建立菜单
void menu()
{
	printf("*****************Welcome to Information about Student system****************\n");
	printf("======================\t选择菜单键\t====================\n");
	printf("\t1.查找信息\n\t2.录入信息\n\t3.删除信息\n\t4.修改信息\n\t5.浏览所有信息\n\t6.程序使用指南\n");
	printf("\t0是退出\n");
	printf("\t注意请不要按除了12345以外的其他键,否则会有很严重的后果哦~\n");
}


//添加信息
void insertInfoBynode(struct node* headnode, struct student data)
{
	struct node* newnode = creatNode(data);//需要创建一个节点,因此还要写一个创建节点的函数
	newnode->next = headnode->next;
	
	headnode->next = newnode;
}

//打印链表
void printfnode(struct node* headnode)
{
	struct node* pMove = headnode->next;//头指针没有初始化,因此从第二个开始打印
	printf("----------------【当前所有成员信息】--------------------\n");
	printf("\t姓名\t年龄\t性别\t电话号码\n");
	if (pMove == NULL)
	{
		printf("没有成员信息\n");
		return;
	}
	while (pMove != NULL)
	{
		printf("\t%s\t%d\t%s\t%s\n", pMove->data.name, pMove->data.old, pMove->data.gender, pMove->data.tel);
		pMove = pMove->next;
	}
}


//删除信息
void deleteNode(struct node* headnode, char* name)
{
	struct node* posData = headnode->next;
	struct node* FrontNode = headnode;
	if (posData == NULL)
	{
		printf("没有数据,无法删除任何信息\n");
		return;
	}
	while (strcmp(posData->data.name, name) != 0)
	{
		FrontNode = posData;
		posData = posData->next;
		if (posData == NULL)
		{
			printf("查无此人,无法删除\n");
			return;
		}
	}
	FrontNode->next = posData->next;
	free(posData);
	return;
}



//查找信息
struct node* printfInfoBynode(struct node* headnode, char* name)
{
	struct node* pMove = headnode->next;
	while (pMove != NULL && strcmp(pMove->data.name, name) != 0)
	{
		pMove = pMove->next;
	}
	if (pMove == NULL)
	{
		printf("抱歉,没有成员信息\n");
		return NULL;
	}
	else
	{
		printf("姓名\t年龄\t性别\t电话号码\n");
		printf("%s\t%d\t%s\t%s\n", pMove->data.name, pMove->data.old, pMove->data.gender, pMove->data.tel);
		return pMove;
	}
}



//查找节点
struct node* searchNode(struct node* headnode, char* name)
{
	struct node* pMove = headnode->next;
	while (pMove != NULL && strcmp(pMove->data.name, name) != 0)
	{
		pMove = pMove->next;
	}
	if (pMove == NULL)
	{
		printf("抱歉,查无此人");
		return NULL;
	}
	else
	{
		return pMove;
	}
}




//修改信息
void changeInfo(struct node* headnode,char* name)
{
	struct node* newnode = searchNode(headnode,name);
	printfInfoBynode(headnode, name);
	if (newnode == NULL)
	{
		return;
	}
	else{
			printf("====================【用户信息】==================");
			printf("请问您需要修改什么信息\n");
			printf("1.名字\n2.年龄\n3.性别\n4.电话号码\n");
			int choice = 0;
			char toname[20];
			char togender[20] ;
			char totel [20];
				cin >> choice;
				switch (choice)
				{
				case 1:
					printf("请输入要修改后的名字:\n");
					cin >> toname;
				
						strcpy(newnode->data.name, toname);
						printf("修改成功!\n");
						break;
					
				case 3:
						printf("请输入修改后的性别:\n");
			
						cin >> togender;
						strcpy(newnode->data.gender, togender);
						printf("修改成功!");
						break;
					
				case 2:
					printf("请输入修改后的年龄:\n");
					int toold;
					cin >> toold;
					newnode->data.old = toold;
					printf("修改成功!\n");
					break;
				case 4:
					printf("请输入修改后的电话号码:");
					cin >> totel;
				
						strcpy(newnode->data.tel, totel);
						printf("修改成功!");
						break;
					
				default:
					printf("输入错误,请重新输入");
					break;
				}
	}
}

struct node* List = creatList();
//选择程序
void select()
{
	struct student data;
	int number;
	cin >> number;
		switch (number)
		{
		case 0:
			printf("正常退出");
			system("pause");
			exit(0);
			break;
		case 1:
			printf("==================【查找用户信息】===============\n");
			printf("请输入你需要查找的用户名:");
			cin >> data.name;
			printfInfoBynode(List, data.name);
			break;
		case 2:
			printf("==================【录入新用户信息】==============\n");
				printf("请输入姓名,年龄,性别,电话号码:\n");
				fflush(stdin);					//清除缓冲区----->防止有数据存留在缓冲区中
		
			cin >> data.name >> data.old >> data.gender >> data.tel;
			insertInfoBynode(List, data);
			break;
		case 3:
			printf("==================【删除用户信息】================\n");
			cin >> data.name;
			deleteNode(List, data.name);
			break;
		case 4:
			printf("==================【修改用户信息】================\n");
			printf("请输入需要修改信息的人的名字:\n");
			fflush(stdin);
			cin >> data.name;
			changeInfo(List,data.name);
			break;
		case 5:
			printfnode(List);         //打印链表
			break;
		case 6:
			printf("==================【说明指南】==============\n");
			printf("    感谢各位帮忙测试使用本款程序,对于程序的使用方法做如下解释:\n");
			printf("    本程序功能为录入、修改、删除、查找、浏览信息\n");
			printf("    1.一开始使用本程序时,得先添加信息,否则查找或者修改信息都会弹出查无此人之类的话。\n");
			printf("    2.本程序可以添加N组成员信息,大家可以放心添加。除此之外,如果有输入错误,在菜单界面上按下”修改信息“相对应的按键即可修改相应信息\n");
			printf("    3.为给用户更好的体验,在使用”修改信息“功能的时候,本软件提供对某一信息的精准修改\n");
		default:
			menu();
			printf("输入错误,请重新输入\n");
			break;
		}
	
}




int main()
{
	while (1)
	{
		menu();
		select();
		system("pause");
		system("cls");
	}
}

第一次写的时候遇到的问题总结

1.不知道要插入节点之前要先创建节点。

2.在删除节点步骤中不知道要先判断节点是否为空的情况

3.打印节点的形参类型模糊

4.不知道要初始化链表

5.修改节点的时候遇到指针与数组问题:### char数组和char*之间的不同点是?

修改信息函数的具体思路与解决办法

1.通过名字来搜索到这个人的信息—>要写一个查找函数 但不要打印
2.提示用户要修改哪一条信息----->switch()进行选择
3.(1)名字的修改:提示用户输入想改的名,再进行strcpy()函数赋值
 (2)年龄的修改:提示用户要改的年龄,再进行链表赋值
  (3)性别的修改和电话号码的修改和名字的修改是一样的
4.如果用户输入别的数字提示输入错误,重新输入

### 难点1char* strcpy(char* des,const char* source)里面的两个形参要搞清楚。一个是指针类型,一个是const char* 即不变的char指针变量(这个值一旦确定就不会改变)。其中,char数组可以代替指针类型成为形参。

###难点2 toname,totel,togender变量为什么可以是char数组,而不可以是char*?利用char*会导致数组越界造成访问冲突。查阅资料后发现是发生了数组越界的情况。但是现在还没有搞清楚为什么用数组就不会发生这样的情况?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值