您好,登錄后才能下訂單哦!
小編給大家分享一下C語(yǔ)言中單鏈表如何實(shí)現(xiàn)圖書(shū)管理系統(tǒng),相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
具體內(nèi)容如下
單鏈表實(shí)現(xiàn)的圖書(shū)管理系統(tǒng)相比于結(jié)構(gòu)體實(shí)現(xiàn)的管理系統(tǒng),可以隨時(shí)開(kāi)辟新的空間,可以增加書(shū)的信息
首先肯定還是打印單鏈表的常規(guī)操作,創(chuàng)建表頭,創(chuàng)建節(jié)點(diǎn),表頭法插入,特定位置刪除,打印鏈表
struct book { char name[20]; float price; int num; //書(shū)的數(shù)量 }; //3 數(shù)據(jù)容器——鏈表 struct Node { struct book data; struct Node*next; }; void printflist(struct Node*headnode); struct Node*headnode = NULL; //創(chuàng)建表頭 struct Node*createlisthead() { //動(dòng)態(tài)內(nèi)存申請(qǐng) struct Node*headnode = (struct Node*)malloc(sizeof(struct Node)); //變量的基本規(guī)則:使用前必須初始化 headnode->next = NULL; return headnode; } //創(chuàng)建節(jié)點(diǎn),為插入做準(zhǔn)備 //把用戶的數(shù)據(jù)變?yōu)榻Y(jié)構(gòu)體變量 struct Node* createnewnode(struct book data) { struct Node*newnode = (struct Node*)malloc(sizeof(struct Node)); newnode->data = data; newnode->next = NULL; return newnode; } //表頭法插入 void insertbyhead(struct Node*headnode, struct book data) { struct Node* newnode = createnewnode(data); //必須先連后斷 newnode->next = headnode->next; headnode->next = newnode; } //指定位置刪除 void deletenodebyname(struct Node*headnode, char *bookname) { struct Node*posleftnode = headnode; struct Node*posnode = headnode->next; //字符串比較函數(shù) while (posnode != NULL && strcmp(posnode->data.name,bookname)) { posleftnode = posnode; posnode = posnode->next; } //討論結(jié)果 if (posnode == NULL) { printf("未找到數(shù)據(jù)"); return ; } else { posleftnode->next = posnode->next; free(posnode); posnode = NULL; } printflist(headnode); } //查找書(shū)籍 struct Node*searchbyname(struct Node*headnode, char *bookname) { struct Node *posnode = headnode->next; while (posnode != NULL &&strcmp(posnode->data.name, bookname)) { posnode = posnode->next; } return posnode; } //打印鏈表——從第二個(gè)節(jié)點(diǎn)開(kāi)始打印 void printflist(struct Node*headnode) { struct Node* pmove = headnode->next; printf("書(shū)名\t價(jià)格\t數(shù)量\n"); while (pmove!=NULL) { printf("%s\t%.1f\t%d\n", pmove->data.name,pmove->data.price,pmove->data.num ); pmove = pmove->next; } printf("\n"); }
冒泡排序——通過(guò)價(jià)格
第一個(gè)for循環(huán)表示遍歷次數(shù),第二個(gè)for循環(huán)使相鄰的兩個(gè)元素進(jìn)行比較并交換
1 比較條件里,只用q指針即可
2 交換時(shí)需要?jiǎng)?chuàng)建一個(gè)臨時(shí)變量
//冒泡排序算法 void bubblesortlist(struct Node*headnode) { 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.price > q->next->data.price) { //交換 struct book tempdata = q->data; q->data = q->next->data; q->next->data = tempdata; } } } printflist(headnode); }
如果不儲(chǔ)存信息,那么每次在輸入信息完畢后關(guān)閉控制臺(tái),信息無(wú)法保留,所以我們通過(guò)文件的方式來(lái)儲(chǔ)存信息
文件寫(xiě)操作
1 通過(guò)創(chuàng)建節(jié)點(diǎn)指針變量來(lái)遍歷輸出文件中的信息
2 通過(guò)fprintf可以將輸入的信息保持下來(lái)
//寫(xiě)操作 void savefile(const char*filename, struct Node*headnode) { FILE*fp = fopen(filename, "w"); struct Node*pmove = headnode->next; while (pmove != NULL) { fprintf(fp, "%s\t%.1f\t%d\n", pmove->data.name, pmove->data.price, pmove->data.num); pmove = pmove->next; } fclose(fp); fp = NULL; }
文件讀操作
1 當(dāng)用 “r”的形式打開(kāi)文件失敗時(shí),說(shuō)明沒(méi)有此文件,則可以用“w+”的形式打開(kāi),當(dāng)沒(méi)有文件時(shí),會(huì)創(chuàng)建一個(gè)文件
2 把讀取出的數(shù)據(jù)以表頭法插入到鏈表中則可以再次打印出信息
//文件讀操作 void readfile(const char *filename, struct Node*headnode) { FILE*fp = fopen(filename, "r"); if (fp == NULL) { //不存在文件則創(chuàng)建 fp = fopen(filename, "w+"); } struct book tempdata; while (fscanf(fp, "%s\t%f\t%d\n", tempdata.name, &tempdata.price, &tempdata.num) != EOF) { insertbyhead(headnode, tempdata); } fclose(fp); fp = NULL; }
剩余代碼
1 當(dāng)查找書(shū)籍時(shí)先用臨時(shí)指針接受找到書(shū)籍的指針,然后再打印書(shū)籍信息
//1 界面 void menu() { printf("---------------------------------\n"); printf("\t圖書(shū)管理系統(tǒng)\n"); printf("\t0.退出系統(tǒng)\n"); printf("\t1.登記書(shū)籍\n"); printf("\t2.瀏覽書(shū)籍\n"); printf("\t3.借閱書(shū)籍\n"); printf("\t4.歸還書(shū)籍\n"); printf("\t5.書(shū)籍排序\n"); printf("\t6.刪除書(shū)籍\n"); printf("\t7.查找書(shū)籍\n"); printf("---------------------------------\n"); printf("請(qǐng)輸入0~7\n"); } //2 做交互 void keydown() { int input = 0; struct book tempbook; //創(chuàng)建臨時(shí)變量,存儲(chǔ)書(shū)籍信息 struct Node*result = NULL; //創(chuàng)建臨時(shí)指針變量,指向查找書(shū)籍的節(jié)點(diǎn) scanf("%d", &input); switch (input) { case 0: printf("【退出】\n"); printf("退出成功\n"); system("pause"); exit(0); //關(guān)閉整個(gè)程序 break; case 1: printf("【登記】\n"); printf("輸入書(shū)籍的信息(name,price,num)"); scanf("%s%f%d", tempbook.name, &tempbook.price, &tempbook.num); insertbyhead(headnode, tempbook); savefile("book.txt", headnode); break; case 2: printf("【瀏覽】\n"); printflist(headnode); break; case 3: printf("【借閱】\n"); //書(shū)籍存在,數(shù)量-1 printf("請(qǐng)輸入要借閱的書(shū)籍"); scanf("%s", tempbook.name); result = searchbyname(headnode, tempbook.name); if (result == NULL) { printf("沒(méi)有相關(guān)書(shū)籍,無(wú)法借閱"); } else { if (result->data.num > 0) { result->data.num--; printf("借閱成功"); } else printf("無(wú)庫(kù)存"); } break; case 4: printf("【歸還】\n"); //書(shū)記歸還,數(shù)量+1 printf("請(qǐng)輸入要?dú)w還的書(shū)籍"); scanf("%s", tempbook.name); result = searchbyname(headnode, tempbook.name); if (result == NULL) printf("來(lái)源非法"); else { result->data.num++; printf("書(shū)籍歸還成功!"); } break; case 5: printf("【排序】\n"); bubblesortlist(headnode); savefile("book.txt", headnode); break; case 6: printf("【刪除】\n"); printf("輸入要?jiǎng)h除的書(shū)名"); scanf("%s", tempbook.name); deletenodebyname(headnode, tempbook.name); savefile("book.txt", headnode); break; case 7: printf("【查找】\n"); printf("請(qǐng)輸入要查找的書(shū)籍"); scanf("%s", tempbook.name); result = searchbyname(headnode, tempbook.name); if (result == NULL) { printf("未找到相關(guān)信息!\n"); } else { printf("書(shū)名\t價(jià)格\t數(shù)量\n"); printf("%s\t%.1f\t%d\t", result->data.name, result->data.price, result->data.num); } break; default: printf("選擇錯(cuò)誤,請(qǐng)重新選擇:>"); break; } } int main() { headnode = createlisthead(); readfile("book.txt", headnode); while (1) { menu(); keydown(); system("pause"); system("cls"); } system("pause"); return 0; }
以上是“C語(yǔ)言中單鏈表如何實(shí)現(xiàn)圖書(shū)管理系統(tǒng)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。