最近很多同學因為學校的要求,需要完成自己的那個C語言課程設計,於是就有很多人私信或者加我私聊我,問的最多的還是《學生成績管理系統》,其實當你項目寫多了你就會發現:其實各類的管理系統都離不開一個核心——鏈表! 是的,不管是你想要寫學生成績管理系統,宿舍管理系統、火車票管理系統亦或者還是旅游管理系統等等 ...
最近很多同學因為學校的要求,需要完成自己的那個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\t%d\t%d\t%s\n", 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("未找到指定位置,無法刪除!\n"); } else { posNodeLeft->next = posNode->next; free(posNode); posNode = NULL; printf("刪除成功!\n"); } } //刪除所有姓名相同的 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\tage\tnum\taddr\n"); while (pMove != NULL) { //列印結構體的數據需要剝洋蔥 printf("%s\t%d\t%d\t%s\n", 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("-----------【小姐姐管理系統】--------\n"); printf("\t0.退出系統\n"); printf("\t1.錄入信息\n"); printf("\t2.瀏覽系統\n"); printf("\t3.修改系統\n"); printf("\t4.查找顯示\n"); printf("\t5.刪除信息\n"); printf("\t6.排序顯示\n"); printf("-------------------------------------\n"); } //2.做按鍵交互 void keyDown() { int userKey = 0; struct MM tempData; //存儲用戶的數據 struct Node* posNode = NULL; scanf("%d", &userKey); switch (userKey) { case 0: printf("正常退出,歡迎下次光臨!\n"); 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("輸入錯誤!,重新輸入!\n"); 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++編程知識,歡迎關註~