最近很多同学因为学校的要求,需要完成自己的那个C语言课程设计,于是就有很多人私信或者加我私聊我,问的最多的还是《学生成绩管理系统》,其实当你项目写多了你就会发现:其实各类的管理系统都离不开一个核心——链表!
是的,不管是你想要写学生成绩管理系统,宿舍管理系统、火车票管理系统亦或者还是旅游管理系统等等,都需要用的到我们的链式结构来写,那么今天呢,我们就来看看如何利用C语言链式管理系统应该如何来写!
本期分享并不是直接教大家写这个学生成绩管理系统,而是以这个为线头,引出我们的大学项目类管理系统核心——链式结构。
话不多说,我们接下来就来看看我们的本文核心——链式结构管理系统的核心源码吧!让你做到:一表在手,系统我有!
源码献上
先来看看我们的singleList.h文件的代码,这个文件实际上也就是对我们的数据进行具体的操作,当然,核心还是我们的链式结构:
#include <stdio.h> #include <stdlib.h> #include <string.h> struct MM { char name[20]; int age; int num; char addr[20]; }; struct Node { //int data; struct MM data; struct Node* next; }; //所有涉及到数据的地方都要改 struct Node* createHead() { struct Node* headNode = (struct Node*)malloc(sizeof(struct Node)); headNode->next = NULL; return headNode; } struct Node* createNode(struct MM data) { struct Node * newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = data; newNode->next = NULL; return newNode; } void insertByHead(struct Node* headNode, struct MM data) { struct Node* newNode = createNode(data); newNode->next = headNode->next; headNode->next = newNode; } //按查找浏览 void searchAllInfo(struct Node* headNode, char *name) { struct Node* pMove = headNode->next; while (pMove != NULL) { //!strcmp(pMove->data.name,name)条件可以改为 //strcmp(pMove->data.name,name)==0 //!:否定 真变假 ,假变真 //!-1等于0 //计算机中非零表示成立 if (!strcmp(pMove->data.name, name)) printf("%s %d %d %s ", pMove->data.name, pMove->data.age, pMove->data.num, pMove->data.addr); pMove = pMove->next; } } //按姓名查找 struct Node* searchInfo(struct Node* headNode, char *name) { struct Node* pMove = headNode->next; while (pMove != NULL&&strcmp(pMove->data.name, name)) { pMove = pMove->next; } return pMove; //返回NULL没有找到 } //改为按照姓名的方式 //删除一个方式 void deleteByAppoin(struct Node* headNode, char *name) { struct Node* posNodeLeft = headNode; struct Node* posNode = headNode->next; //字符串比较+数据剥洋葱 while (posNode != NULL&&strcmp(posNode->data.name ,name)) { posNodeLeft = posNode; posNode = posNodeLeft->next; } if (posNode == NULL) { printf("未找到指定位置,无法删除! "); } else { posNodeLeft->next = posNode->next; free(posNode); posNode = NULL; printf("删除成功! "); } } //删除所有姓名相同的 void deleteAll(struct Node* headNode, char *name) { while (searchInfo(headNode, name) != NULL) { deleteByAppoin(headNode, name); } } //修改所有姓名相同的 void modifyALL(struct Node* headNode, char *name,struct MM newInfo) { while (searchInfo(headNode, name) != NULL) { searchInfo(headNode, name)->data = newInfo; } } //打印-->具体需求:抬头 void printList(struct Node* headNode) { struct Node* pMove = headNode->next; //表格数据的表头 printf("name age num addr "); while (pMove != NULL) { //打印结构体的数据需要剥洋葱 printf("%s %d %d %s ", pMove->data.name, pMove->data.age, pMove->data.num, pMove->data.addr); pMove = pMove->next; } } //链表的冒泡排序 void BubbleSortList(struct Node*headNode) { //0---size for (struct Node* p = headNode->next; p != NULL; p = p->next) { for (struct Node* q = headNode->next; q->next != NULL; q = q->next) { if ((q->data.age > q->next->data.age)) { struct MM tempData = q->data; q->data = q->next->data; q->next->data = tempData; } } } printList(headNode); } void BubbleSortByName(struct Node*headNode) { //0---size for (struct Node* p = headNode->next; p != NULL; p = p->next) { for (struct Node* q = headNode->next; q->next != NULL; q = q->next) { if (strcmp(q->data.name, q->next->data.name)>0) { struct MM tempData = q->data; q->data = q->next->data; q->next->data = tempData; } } } printList(headNode); }
好,接下来再来将我们的这个界面给完善一下:
#define _CRT_SECURE_NO_WARNINGS #include "singleList.h" struct Node* list = NULL; //存储数据的容器 //1.菜单 void makeMenu() { printf("-----------【小姐姐管理系统】-------- "); printf(" 0.退出系统 "); printf(" 1.录入信息 "); printf(" 2.浏览系统 "); printf(" 3.修改系统 "); printf(" 4.查找显示 "); printf(" 5.删除信息 "); printf(" 6.排序显示 "); printf("------------------------------------- "); } //2.做按键交互 void keyDown() { int userKey = 0; struct MM tempData; //存储用户的数据 struct Node* posNode = NULL; scanf("%d", &userKey); switch (userKey) { case 0: printf("正常退出,欢迎下次光临! "); system("pause"); exit(0); break; case 1: //为当前函数传参 //增加全局变量 printf("请输入信息:(name,age,num,addr):"); scanf("%s%d%d%s", tempData.name, &tempData.age, &tempData.num, tempData.addr); insertByHead(list,tempData); break; case 2: printList(list); break; case 3: //修改 --->修改作业 printf("请输入要修改的姓名:"); scanf("%s", tempData.name); //输入信息存储到临时变量 tempInfo //循环去做修改: 知道posNode==NULL 位置 posNode = searchInfo(list, tempData.name); if (posNode == NULL) { printf("未找到指定位置,无法修改!"); } else { printf("请输入新的信息:(name,age,num,addr):"); scanf("%s%d%d%s", posNode->data.name, &posNode->data.age, &posNode->data.num, posNode->data.addr); //posNode->data=tempInfo; printf("修改成功!"); } break; case 4: //查找 printf("请输入要查找的姓名:"); scanf("%s", tempData.name); searchAllInfo(list, tempData.name); break; case 5: //删除 printf("请输入要删除的姓名:"); scanf("%s", tempData.name); deleteByAppoin(list, tempData.name); break; case 6: BubbleSortList(list); break; // default: printf("输入错误!,重新输入! "); break; } } int main() { list = createHead(); //1.创建容器 while (1) { makeMenu(); keyDown(); system("pause"); system("cls"); } system("pause"); return 0; }
好了,本期分享就到这里了!希望能够对大家有帮助,希望大家都能依照本文分享的东西自己完成自己的管理系统哦~
其实做为一个编程学习者,有一个学习的氛围跟一个交流圈子特别重要这里我推荐一个C语言C++交流Q群1108152000,不管你是小白还是转行人士欢迎入驻,大家一起交流成长。
微信公众号:C语言编程学习基地,学习C/C++编程知识,欢迎关注~