提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
随着你们的代码能力不断提升,我觉得也该是做一些小项目的时候了,所以我们利用所学的单链表的知识来做一个信息管理系用吧
提示:以下是本篇文章正文内容,下面案例可供参考
一、学生信息管理系统是什么?
1.我们应该从何下手学生信息管理系统呢,其实这里面应该先定义两个结构体,第一个存放学生的数据,因为学生总不可能只有一个性名吧,肯定还有性别年龄,学号,在定义一个单链表的结构体那么这样我们的初始步骤就算完成了接下来请欣赏初步的代码段吧
typedef int Datatype; struct Person { char name[20];//存放姓名 char num[10];//存放学号 char age[3];//存放年龄 }; typedef struct SListNode { struct SListNode* next; Datatype data; }SLN;
二、使用步骤
1.定义接口
1.其中的接口肯定不止一个吧!肯定有单链表的初始化,单链表的插入,单链表的删除,单链表的遍历,单链表的查找
代码如下(示例):
1.首先是单链表的建立代码如下
void SList_Init(SLN** pphead) { SLN* tail = NULL, * phead = NULL; int n = 0, i = 0; *pphead = (SLN*)malloc(sizeof(SLN)); tail = *pphead; printf("请输入学生的总人数\n"); scanf("%d", &n); for (i = 0; i < n; i++) { phead = (SLN*)malloc(sizeof(SLN)); phead->next = NULL; printf("请输入你的学号\n"); scanf("%s", &phead->data.num); printf("请输入你的姓名\n"); scanf("%s", &phead->data.name); printf("请输入你的年龄\n"); scanf("%s", &phead->data.age); tail->next = phead; tail = phead; } tail->next = NULL; }
接下来是单链表的遍历
void SList_Print(SLN* pphead) { SLN* cur = pphead; printf("学号\t姓名\t年龄\t\n"); do { cur = cur->next; printf("%s\t%s\t%s\t\n",cur->data.num,cur->data.name,cur->data.age); } while (cur->next != NULL); }
定义一个临时的结构体变量SLN* cur存储数据的地址,本次采用的是do while循环,用while循环也可以,看个人!因为遍历不用改变数值,所以说传一级指针就行了,到目前为止,我们已经可以开始进行一些小的测试了,我们需要测试看一下之前写的代码有没有错误,因为写一些测一些嘛,假设你写了很多,然后一测试几十个报错你是不是就开始慌了呢?所以写一点测一点是一个非常好的习惯哦
int main() { SLN* plist = NULL; int i = 1, n = 0; printf("1.建立学生信息\n2.查看学生的信息\n"); while (i != 0) { printf("请选择你想要的操作\n"); scanf("%d", &i); switch (i) { case 1: SList_Init(&plist); break; case 2: SList_Print(plist); break; default: break; } } return 0; }
这是到目前为止的主函数段下面来进行测试吧
接下来是单链表的插入
void InsertNode(SLN* phead, int n) { SLN* plist = phead; int i = 1; while (plist && i < n) { plist = plist->next; ++i; } SLN* newnode = (SLN*)malloc(sizeof(SLN)); printf("请输入你的学号\n"); scanf("%s", &newnode->data.num); printf("请输入你的姓名\n"); scanf("%s", &newnode->data.name); printf("请输入你的年龄\n"); scanf("%s", &newnode->data.age); newnode->next = plist->next; plist->next = newnode; }
插入的话其实就是malloc一块节点出来,然后在把前后链接一下,plist->next其实是下一个数据的地址现在赋给了newnode->next其实就是让newnode指向下一个,然后再让plist->next指向newnode相当于把newnode与plist又链接起来了这样就完成了前后的连接
接下来写单链表的删除
void SListDelete(SLN* phead) { char arr[12] = { 0 }; SLN* tail, * cur; tail = phead; cur = phead->next; printf("请输入你要删除的学号\n"); scanf("%s", arr); while (cur && strcmp(arr, cur->data.num) !=0) { tail = cur; cur = cur->next; } if (cur!= NULL) { tail->next = cur->next; cur->next = NULL; free(cur); } else { printf("删除失败\n"); } }
这边利用的是一级指针,strcmp是string.h里面的一个函数用来比较的,当两个比较的数相等是就会等于0,所以此时我判断他不等于0,因为while里面一般放的都是继续的条件,讲一下思路吧,定义两个指针一个指向前一个指向后,如果没找到对应的学号就继续往下走,如果找到就停下来,这边我们要进行一个判断只有当cur不等于NULL的时候才会继续的往下走,然后把要删除位置的地址给覆盖,然后再置成NULL最后在free掉。
最后是单链表的查找
void SListSearch(SLN* phead) { char arr[12] = { 0 }; SLN* plist = phead->next; printf("请输入你要查找的学号\n"); scanf("%s", arr); while (plist && strcmp(arr, plist->data.num)) { plist = plist->next; } if (plist) { printf("学号:%s\t姓名%s\t年龄%s\t\n", plist->data.num, plist->data.name, plist->data.age); } else { printf("查找失败\n"); } }
好啦,本次的学生信息管理系统的内容已经完成啦,大家如果还想要其他的话可以在我底下评论并且关注我噢!
总结
最好是自己手敲一遍不要直接crtl c crtl v了,我们可不是cv工程师哦!