C++利用鏈表實現(xiàn)圖書信息管理系統(tǒng)
更新時間:2021年11月26日 09:32:25 作者:noobcz
這篇文章主要為大家詳細(xì)介紹了C++利用鏈表實現(xiàn)圖書信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
C++利用鏈表實現(xiàn)一個簡單的圖書信息管理系統(tǒng),供大家參考,具體內(nèi)容如下
(1)圖書信息包括ISBN號、書名、作者名、價格和數(shù)量等;
(2)系統(tǒng)的主要功能包括:圖書信息的創(chuàng)建、輸出圖書信息、查詢圖書信息、增加圖書信息、刪除圖書信息。
#include <stdio.h> #include <stdlib.h> #include <string.h> //創(chuàng)建結(jié)構(gòu)體及其成員 typedef struct Node { int num;//編號 char name[20];//書名 char author[20];//作者 int isexsit;//數(shù)量 float price;//價格 struct Node *next;//指針域 } S;//結(jié)構(gòu)體定義為S //各函數(shù)定義 void choose(); void menu(); //菜單函數(shù) S *create();//創(chuàng)建鏈表函數(shù) void print(S *);//輸出鏈表函數(shù) void pop_sort(S *);//排序 void insert(S *);//插入節(jié)點函數(shù) void del(S *);//刪除節(jié)點函數(shù) void search1(S *);//書名查找節(jié)點函數(shù) void search2(S *);//作者查找節(jié)點函數(shù) void search3(S *);//編號查找 void mod(S *);//修改圖書信息 //主函數(shù) int main() { choose(); } void choose() { S *head; int n, a = 1;//n用來控制選擇操作類型,a控制循環(huán),以-1終止 while (a > 0) { menu();//顯示菜單 printf("選擇你想使用的功能:"); scanf("%d", &n);//選擇操作 switch (n)//各操作數(shù)字對應(yīng)菜單數(shù)字,通過n確定操作類型 { case 1://創(chuàng)建 head = create(); break; case 2://輸出 printf("圖書信息為(按價格排序后)\n"); pop_sort(head); printf("編號\t書名\t作者\t數(shù)量\t價格\n"); print(head); break; case 3://插入 insert(head); printf("插入后\n"); printf("編號\t書名\t作者\t數(shù)量\t價格\n"); print(head); break; case 4://刪除 del(head); printf("刪除后\n"); printf("編號\t書名\t作者\t數(shù)量\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數(shù)量\t價格\n"); print(head); break; default: a = -1;//跳出循環(huán)條件 break; } } } //菜單模塊直接顯示 void menu() { printf("\n\n"); printf("\t\t 歡迎使用圖書管理系統(tǒng)\n"); printf("\t\t|----------SCORE-----------|\n"); printf("\t\t|\t1.創(chuàng)建圖書 |\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"); } //創(chuàng)建鏈表模塊 S *create() { S *head, *p, *q;//定義指針 int i; head = (S *) malloc(sizeof(S));//頭節(jié)點開辟空間 head->next = NULL;//置空頭節(jié)點的指針域 q = head;//q指針記錄頭節(jié)點的地址 p = head->next;//p指針記錄頭節(jié)點的指針域的地址 printf("請輸入圖書編號,圖書名,作者,圖書數(shù)量,價格,最后輸入0結(jié)束\n"); int num; scanf("%d", &num); while (num != 0)//輸入書籍編號輸入為零停止循環(huán) { 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節(jié)點的指針域 q->next = p;//p,q節(jié)點連接 q = p;//q指針后移 printf("請輸入圖書編號,圖書名,作者,圖書數(shù)量,價格,最后輸入0結(jié)束\n"); scanf("%d", &num); } return head;//返回鏈表的起始地址 } //插入節(jié)點模塊(可多個插入) void insert(S *head) { int i, num, flag = 1;//flag實現(xiàn)判斷指針是否到達(dá)最后一個節(jié)點 S *p, *q, *r; //定義指針便于插入操作 printf("請輸入一本圖書的信息:\n"); printf("請輸入圖書的編號,輸入0結(jié)束\n"); scanf("%d", &num); while (num != 0)//輸入編號不為零時循環(huán),以零終止,可實現(xiàn)多個插入 { r = (S *) malloc(sizeof(S));//為r開辟空間 r->next = NULL;//置空r的指針域 r->num = num; printf("請輸入圖書名,作者,圖書數(shù)量,圖書價格\n"); scanf("%s %s %d %f", r->name, r->author, &r->isexsit, &r->price); q = head;//q指針記錄頭節(jié)點的地址 p = head->next;//p指針記錄頭節(jié)點的指針域的地址 while (q->next != NULL && p->price < r->price)//循環(huán)條件:當(dāng)q->next不為空,以及按價格排序插入 { p = p->next;//p指針后移 q = q->next;//q指針后移 if (q->next == NULL)//這個判斷防止q->next為空時,在執(zhí)行循環(huán)是出現(xiàn)野指針使程序出錯 { p = NULL;//防止出現(xiàn)野指針p q->next = r;//連接節(jié)點 r->next = NULL;//置空r指針域 flag = 0;//到達(dá)最后一個節(jié)點更改flag break; } } if (flag)//判斷是否到達(dá)最后一個節(jié)點,為真執(zhí)行該操作 { r->next = p; q->next = r; //實現(xiàn)將r節(jié)點插入鏈表 } printf("請輸入圖書編號,輸入0結(jié)束\n"); scanf("%d", &num); } } //刪除節(jié)點模塊 void del(S *head) { S *p, *q;//定義指針 int b;//用于輸入編號查找刪除 p = head;//p記錄頭節(jié)點的地址 q = head->next;//q記錄頭節(jié)點的指針域的地址 printf("請輸入你想要刪除的圖書編號:"); //輸入編號 scanf("%d", &b); while (q != NULL)//q不為空時執(zhí)行循環(huán) { if (q->num == b)//判斷是否找到輸入的編號 //為真時 { p->next = q->next;//斷開q節(jié)點 free(q);//釋放q節(jié)點neicun q = NULL; //置空q指針防止出現(xiàn)野指針 } else { //判斷為假時 p = p->next;//p指針后移 q = q->next;//q指針后移 } } if (p == NULL)//當(dāng)查找到最后一個節(jié)點還未查到要刪除的編號時,輸出輸入錯誤 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數(shù)量\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)//查找到最后一個節(jié)點還未查到要的編號時,輸出輸入錯誤 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數(shù)量\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)//查找到最后一個節(jié)點還未查到要的編號時,輸出輸入錯誤 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數(shù)量\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)//查找到最后一個節(jié)點還未查到要的編號時,輸出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("請再次輸入 圖書編號,書名,作者,圖書數(shù)量 ,價格\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)//查找到最后一個節(jié)點還未查到要的編號時,輸出輸入錯誤 printf("輸入錯誤\n"); } void pop_sort(S *head) //鏈表冒泡排序 { //排序中沒有修改頭節(jié)點指針值,只是修改指針內(nèi)容head->next的值 S *pre, *p, *tail, *temp; tail = NULL; pre = head; while ((head->next->next) != tail)//(head->next)!=tail同樣適用 ,多執(zhí)行最后一個步比較 { p = head->next; pre = head; while (p->next != tail) { if ((p->price) > (p->next->price)) { pre->next = p->next; //交換節(jié)點方法 temp = p->next->next; p->next->next = p; p->next = temp; p = pre->next; //p回退一個節(jié)點 } p = p->next; //p再前進(jìn)一個節(jié)點 pre = pre->next; } tail = p; } } //輸出鏈表模塊 void print(S *head) { int i; S *p = head->next; while (p)//當(dāng)p不為空的時候執(zhí)行 { 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;//指針后移 } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語言實現(xiàn)班級學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)班級學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11