C++利用鏈表實現圖書信息管理系統
C++利用鏈表實現一個簡單的圖書信息管理系統,供大傢參考,具體內容如下
(1)圖書信息包括ISBN號、書名、作者名、價格和數量等;
(2)系統的主要功能包括:圖書信息的創建、輸出圖書信息、查詢圖書信息、增加圖書信息、刪除圖書信息。
#include <stdio.h> #include <stdlib.h> #include <string.h> //創建結構體及其成員 typedef struct Node { int num;//編號 char name[20];//書名 char author[20];//作者 int isexsit;//數量 float price;//價格 struct Node *next;//指針域 } S;//結構體定義為S //各函數定義 void choose(); void menu(); //菜單函數 S *create();//創建鏈表函數 void print(S *);//輸出鏈表函數 void pop_sort(S *);//排序 void insert(S *);//插入節點函數 void del(S *);//刪除節點函數 void search1(S *);//書名查找節點函數 void search2(S *);//作者查找節點函數 void search3(S *);//編號查找 void mod(S *);//修改圖書信息 //主函數 int main() { choose(); } void choose() { S *head; int n, a = 1;//n用來控制選擇操作類型,a控制循環,以-1終止 while (a > 0) { menu();//顯示菜單 printf("選擇你想使用的功能:"); scanf("%d", &n);//選擇操作 switch (n)//各操作數字對應菜單數字,通過n確定操作類型 { case 1://創建 head = create(); break; case 2://輸出 printf("圖書信息為(按價格排序後)\n"); pop_sort(head); printf("編號\t書名\t作者\t數量\t價格\n"); print(head); break; case 3://插入 insert(head); printf("插入後\n"); printf("編號\t書名\t作者\t數量\t價格\n"); print(head); break; case 4://刪除 del(head); printf("刪除後\n"); printf("編號\t書名\t作者\t數量\t價格\n"); print(head); break; case 5://書名查找 search1(head); break; case 6://作者查找 search2(head); break; case 7://編號查找 search3(head); break; case 8://修改 mod(head); pop_sort(head); printf("圖書信息為\n"); printf("編號\t書名\t作者\t數量\t價格\n"); print(head); break; default: a = -1;//跳出循環條件 break; } } } //菜單模塊直接顯示 void menu() { printf("\n\n"); printf("\t\t 歡迎使用圖書管理系統\n"); printf("\t\t|----------SCORE-----------|\n"); printf("\t\t|\t1.創建圖書 |\n"); printf("\t\t|\t2.展示圖書信息 |\n"); printf("\t\t|\t3.添加圖書信息 |\n"); printf("\t\t|\t4.刪除圖書 |\n"); printf("\t\t|\t5.按圖書名搜索 |\n"); printf("\t\t|\t6.按作者名搜索 |\n"); printf("\t\t|\t7.按圖書編號搜索 |\n"); printf("\t\t|\t8.修改圖書信息 |\n"); printf("\t\t|\t9.退出程序 |\n"); printf("\t\t|--------------------------|\n"); printf("\t\t\tchoice(1-9):\n"); } //創建鏈表模塊 S *create() { S *head, *p, *q;//定義指針 int i; head = (S *) malloc(sizeof(S));//頭節點開辟空間 head->next = NULL;//置空頭節點的指針域 q = head;//q指針記錄頭節點的地址 p = head->next;//p指針記錄頭節點的指針域的地址 printf("請輸入圖書編號,圖書名,作者,圖書數量,價格,最後輸入0結束\n"); int num; scanf("%d", &num); while (num != 0)//輸入書籍編號輸入為零停止循環 { p = (S *) malloc(sizeof(S));//p指針開辟空間 //輸入各成員 p->num = num; scanf("%s %s %d %f", p->name, p->author, &p->isexsit, &p->price); p->next = NULL;//置空p節點的指針域 q->next = p;//p,q節點連接 q = p;//q指針後移 printf("請輸入圖書編號,圖書名,作者,圖書數量,價格,最後輸入0結束\n"); scanf("%d", &num); } return head;//返回鏈表的起始地址 } //插入節點模塊(可多個插入) void insert(S *head) { int i, num, flag = 1;//flag實現判斷指針是否到達最後一個節點 S *p, *q, *r; //定義指針便於插入操作 printf("請輸入一本圖書的信息:\n"); printf("請輸入圖書的編號,輸入0結束\n"); scanf("%d", &num); while (num != 0)//輸入編號不為零時循環,以零終止,可實現多個插入 { r = (S *) malloc(sizeof(S));//為r開辟空間 r->next = NULL;//置空r的指針域 r->num = num; printf("請輸入圖書名,作者,圖書數量,圖書價格\n"); scanf("%s %s %d %f", r->name, r->author, &r->isexsit, &r->price); q = head;//q指針記錄頭節點的地址 p = head->next;//p指針記錄頭節點的指針域的地址 while (q->next != NULL && p->price < r->price)//循環條件:當q->next不為空,以及按價格排序插入 { p = p->next;//p指針後移 q = q->next;//q指針後移 if (q->next == NULL)//這個判斷防止q->next為空時,在執行循環是出現野指針使程序出錯 { p = NULL;//防止出現野指針p q->next = r;//連接節點 r->next = NULL;//置空r指針域 flag = 0;//到達最後一個節點更改flag break; } } if (flag)//判斷是否到達最後一個節點,為真執行該操作 { r->next = p; q->next = r; //實現將r節點插入鏈表 } printf("請輸入圖書編號,輸入0結束\n"); scanf("%d", &num); } } //刪除節點模塊 void del(S *head) { S *p, *q;//定義指針 int b;//用於輸入編號查找刪除 p = head;//p記錄頭節點的地址 q = head->next;//q記錄頭節點的指針域的地址 printf("請輸入你想要刪除的圖書編號:"); //輸入編號 scanf("%d", &b); while (q != NULL)//q不為空時執行循環 { if (q->num == b)//判斷是否找到輸入的編號 //為真時 { p->next = q->next;//斷開q節點 free(q);//釋放q節點neicun q = NULL; //置空q指針防止出現野指針 } else { //判斷為假時 p = p->next;//p指針後移 q = q->next;//q指針後移 } } if (p == NULL)//當查找到最後一個節點還未查到要刪除的編號時,輸出輸入錯誤 printf("輸入錯誤\n"); } //書名查找模塊 void search1(S *head) { S *p;//定義指針 char name1[20];//定義name1用於輸入查找書名 printf("請輸入你要搜素的書名:"); //輸入查找書名 scanf("%s", name1); p = head->next; while (p != NULL) { if (strcmp(p->name, name1) == 0)//判斷是否找到書籍 { //為真時,輸出信息 printf("書籍信息\n"); printf("編號\t書名\t作者\t數量\t價格\n"); printf("%d\t%s\t%s\t%d\t%.2f\n", p->num, p->name, p->author, p->isexsit, p->price); break; } else //為假時 p = p->next;//指針後移 } if (p == NULL)//查找到最後一個節點還未查到要的編號時,輸出輸入錯誤 printf("輸入錯誤\n"); } //作者查找模塊 void search2(S *head) { S *p;//定義指針 char name2[20];//定義name2用於輸入查找書籍 printf("輸入你想要查詢的作者:"); //輸入查找作者 scanf("%s", name2); p = head->next; while (p != NULL) { if (strcmp(p->author, name2) == 0)//判斷是否找到書籍 { //為真時,輸出信息 printf("書籍信息\n"); printf("編號\t書名\t作者\t數量\t價格\n"); printf("%d\t%s\t%s\t%d\t%.2f\n", p->num, p->name, p->author, p->isexsit, p->price); break; } else //為假時 p = p->next;//指針後移 } if (p == NULL)//查找到最後一個節點還未查到要的編號時,輸出輸入錯誤 printf("輸入錯誤\n"); } //編號查找 void search3(S *head) { S *p;//定義指針 int num1;//定義num1用於輸入查找書籍 printf("請輸入你要搜索的圖書編號:"); //輸入查找編號 scanf("%d", &num1); p = head->next; while (p != NULL) { if (p->num == num1)//判斷是否找到書籍 { //為真時,輸出信息 printf("書籍信息\n"); printf("編號\t書名\t作者\t數量\t價格\n"); printf("%d\t%s\t%s\t%d\t%.2f\n", p->num, p->name, p->author, p->isexsit, p->price); break; } else //為假時 p = p->next;//指針後移 } if (p == NULL)//查找到最後一個節點還未查到要的編號時,輸出ERROR INPUT printf("輸入錯誤\n"); } //修改信息模塊 void mod(S *head) { S *p;//定義指針 int num1, num2, isexsit1;//定義num1用於輸入查找書籍修改信息,num2用於修改 char name1[20], author1[20]; float price1; printf("請輸入你要修改的圖書編號:"); //輸入要修改的圖書編號 scanf("%d", &num1); p = head->next; while (p != NULL) { if (p->num == num1)//判斷是否找到書籍 { printf("請再次輸入 圖書編號,書名,作者,圖書數量 ,價格\n"); //為真時,重輸圖書信息 scanf("%d %s %s %d %f", &num2, name1, author1, &isexsit1, &price1); p->num = num2; strcpy(p->name, name1); strcpy(p->author, author1); p->isexsit = isexsit1; p->price = price1; break; } else //為假時 p = p->next;//指針後移 } if (p == NULL)//查找到最後一個節點還未查到要的編號時,輸出輸入錯誤 printf("輸入錯誤\n"); } void pop_sort(S *head) //鏈表冒泡排序 { //排序中沒有修改頭節點指針值,隻是修改指針內容head->next的值 S *pre, *p, *tail, *temp; tail = NULL; pre = head; while ((head->next->next) != tail)//(head->next)!=tail同樣適用 ,多執行最後一個步比較 { p = head->next; pre = head; while (p->next != tail) { if ((p->price) > (p->next->price)) { pre->next = p->next; //交換節點方法 temp = p->next->next; p->next->next = p; p->next = temp; p = pre->next; //p回退一個節點 } p = p->next; //p再前進一個節點 pre = pre->next; } tail = p; } } //輸出鏈表模塊 void print(S *head) { int i; S *p = head->next; while (p)//當p不為空的時候執行 { printf("%d\t%s\t%s\t%d\t%.2f\n", p->num, p->name, p->author, p->isexsit, p->price); printf("\n"); p = p->next;//指針後移 } }
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。