项目场景:学生信息管理系统
问题描述:
创建一个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*会导致数组越界造成访问冲突。查阅资料后发现是发生了数组越界的情况。但是现在还没有搞清楚为什么用数组就不会发生这样的情况?