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