您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)C++利用鏈表如何實(shí)現(xiàn)圖書信息管理系統(tǒng),文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
C++利用鏈表實(shí)現(xiàn)一個(gè)簡單的圖書信息管理系統(tǒng),具體內(nèi)容如下
(1)圖書信息包括ISBN號(hào)、書名、作者名、價(jià)格和數(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;//編號(hào) char name[20];//書名 char author[20];//作者 int isexsit;//數(shù)量 float price;//價(jià)格 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é)點(diǎn)函數(shù) void del(S *);//刪除節(jié)點(diǎn)函數(shù) void search2(S *);//書名查找節(jié)點(diǎn)函數(shù) void search3(S *);//作者查找節(jié)點(diǎn)函數(shù) void search4(S *);//編號(hào)查找 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ù)字對(duì)應(yīng)菜單數(shù)字,通過n確定操作類型 { case 1://創(chuàng)建 head = create(); break; case 2://輸出 printf("圖書信息為(按價(jià)格排序后)\n"); pop_sort(head); printf("編號(hào)\t書名\t作者\(yùn)t數(shù)量\t價(jià)格\n"); print(head); break; case 3://插入 insert(head); printf("插入后\n"); printf("編號(hào)\t書名\t作者\(yùn)t數(shù)量\t價(jià)格\n"); print(head); break; case 4://刪除 del(head); printf("刪除后\n"); printf("編號(hào)\t書名\t作者\(yùn)t數(shù)量\t價(jià)格\n"); print(head); break; case 5://書名查找 search2(head); break; case 6://作者查找 search3(head); break; case 7://編號(hào)查找 search4(head); break; case 8://修改 mod(head); pop_sort(head); printf("圖書信息為\n"); printf("編號(hào)\t書名\t作者\(yùn)t數(shù)量\t價(jià)格\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.按圖書編號(hào)搜索 |\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é)點(diǎn)開辟空間 head->next = NULL;//置空頭節(jié)點(diǎn)的指針域 q = head;//q指針記錄頭節(jié)點(diǎn)的地址 p = head->next;//p指針記錄頭節(jié)點(diǎn)的指針域的地址 printf("請(qǐng)輸入圖書編號(hào),圖書名,作者,圖書數(shù)量,價(jià)格,最后輸入0結(jié)束\n"); int num; scanf("%d", &num); while (num != 0)//輸入書籍編號(hào)輸入為零停止循環(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é)點(diǎn)的指針域 q->next = p;//p,q節(jié)點(diǎn)連接 q = p;//q指針后移 printf("請(qǐng)輸入圖書編號(hào),圖書名,作者,圖書數(shù)量,價(jià)格,最后輸入0結(jié)束\n"); scanf("%d", &num); } return head;//返回鏈表的起始地址 } //插入節(jié)點(diǎn)模塊(可多個(gè)插入) void insert(S *head) { int i, num, flag = 1;//flag實(shí)現(xiàn)判斷指針是否到達(dá)最后一個(gè)節(jié)點(diǎn) S *p, *q, *r; //定義指針便于插入操作 printf("請(qǐng)輸入一本圖書的信息:\n"); printf("請(qǐng)輸入圖書的編號(hào),輸入0結(jié)束\n"); scanf("%d", &num); while (num != 0)//輸入編號(hào)不為零時(shí)循環(huán),以零終止,可實(shí)現(xiàn)多個(gè)插入 { r = (S *) malloc(sizeof(S));//為r開辟空間 r->next = NULL;//置空r的指針域 r->num = num; printf("請(qǐng)輸入圖書名,作者,圖書數(shù)量,圖書價(jià)格\n"); scanf("%s %s %d %f", r->name, r->author, &r->isexsit, &r->price); q = head;//q指針記錄頭節(jié)點(diǎn)的地址 p = head->next;//p指針記錄頭節(jié)點(diǎn)的指針域的地址 while (q->next != NULL && p->price < r->price)//循環(huán)條件:當(dāng)q->next不為空,以及按價(jià)格排序插入 { p = p->next;//p指針后移 q = q->next;//q指針后移 if (q->next == NULL)//這個(gè)判斷防止q->next為空時(shí),在執(zhí)行循環(huán)是出現(xiàn)野指針使程序出錯(cuò) { p = NULL;//防止出現(xiàn)野指針p q->next = r;//連接節(jié)點(diǎn) r->next = NULL;//置空r指針域 flag = 0;//到達(dá)最后一個(gè)節(jié)點(diǎn)更改flag break; } } if (flag)//判斷是否到達(dá)最后一個(gè)節(jié)點(diǎn),為真執(zhí)行該操作 { r->next = p; q->next = r; //實(shí)現(xiàn)將r節(jié)點(diǎn)插入鏈表 } printf("請(qǐng)輸入圖書編號(hào),輸入0結(jié)束\n"); scanf("%d", &num); } } //刪除節(jié)點(diǎn)模塊 void del(S *head) { S *p, *q;//定義指針 int b;//用于輸入編號(hào)查找刪除 p = head;//p記錄頭節(jié)點(diǎn)的地址 q = head->next;//q記錄頭節(jié)點(diǎn)的指針域的地址 printf("請(qǐng)輸入你想要?jiǎng)h除的圖書編號(hào):"); //輸入編號(hào) scanf("%d", &b); while (q != NULL)//q不為空時(shí)執(zhí)行循環(huán) { if (q->num == b)//判斷是否找到輸入的編號(hào) //為真時(shí) { p->next = q->next;//斷開q節(jié)點(diǎn) free(q);//釋放q節(jié)點(diǎn)neicun q = NULL; //置空q指針防止出現(xiàn)野指針 } else { //判斷為假時(shí) p = p->next;//p指針后移 q = q->next;//q指針后移 } } if (p == NULL)//當(dāng)查找到最后一個(gè)節(jié)點(diǎn)還未查到要?jiǎng)h除的編號(hào)時(shí),輸出輸入錯(cuò)誤 printf("輸入錯(cuò)誤\n"); } //書名查找模塊 void search2(S *head) { S *p;//定義指針 char name1[20];//定義name1用于輸入查找書名 printf("請(qǐng)輸入你要搜素的書名:"); //輸入查找書名 scanf("%s", name1); p = head->next; while (p != NULL) { if (strcmp(p->name, name1) == 0)//判斷是否找到書籍 { //為真時(shí),輸出信息 printf("書籍信息\n"); printf("編號(hào)\t書名\t作者\(yùn)t數(shù)量\t價(jià)格\n"); printf("%d\t%s\t%s\t%d\t%.2f\n", p->num, p->name, p->author, p->isexsit, p->price); break; } else //為假時(shí) p = p->next;//指針后移 } if (p == NULL)//查找到最后一個(gè)節(jié)點(diǎn)還未查到要的編號(hào)時(shí),輸出輸入錯(cuò)誤 printf("輸入錯(cuò)誤\n"); } //作者查找模塊 void search3(S *head) { S *p;//定義指針 char name2[20];//定義name2用于輸入查找書籍 printf("輸入你想要查詢的作者:"); //輸入查找作者 scanf("%s", name2); p = head->next; while (p != NULL) { if (strcmp(p->author, name2) == 0)//判斷是否找到書籍 { //為真時(shí),輸出信息 printf("書籍信息\n"); printf("編號(hào)\t書名\t作者\(yùn)t數(shù)量\t價(jià)格\n"); printf("%d\t%s\t%s\t%d\t%.2f\n", p->num, p->name, p->author, p->isexsit, p->price); break; } else //為假時(shí) p = p->next;//指針后移 } if (p == NULL)//查找到最后一個(gè)節(jié)點(diǎn)還未查到要的編號(hào)時(shí),輸出輸入錯(cuò)誤 printf("輸入錯(cuò)誤\n"); } //編號(hào)查找 void search4(S *head) { S *p;//定義指針 int num1;//定義num1用于輸入查找書籍 printf("請(qǐng)輸入你要搜索的圖書編號(hào):"); //輸入查找編號(hào) scanf("%d", &num1); p = head->next; while (p != NULL) { if (p->num == num1)//判斷是否找到書籍 { //為真時(shí),輸出信息 printf("書籍信息\n"); printf("編號(hào)\t書名\t作者\(yùn)t數(shù)量\t價(jià)格\n"); printf("%d\t%s\t%s\t%d\t%.2f\n", p->num, p->name, p->author, p->isexsit, p->price); break; } else //為假時(shí) p = p->next;//指針后移 } if (p == NULL)//查找到最后一個(gè)節(jié)點(diǎn)還未查到要的編號(hào)時(shí),輸出ERROR INPUT printf("輸入錯(cuò)誤\n"); } //修改信息模塊 void mod(S *head) { S *p;//定義指針 int num1, num2, isexsit1;//定義num1用于輸入查找書籍修改信息,num2用于修改 char name1[20], author1[20]; float price1; printf("請(qǐng)輸入你要修改的圖書編號(hào):"); //輸入要修改的圖書編號(hào) scanf("%d", &num1); p = head->next; while (p != NULL) { if (p->num == num1)//判斷是否找到書籍 { printf("請(qǐng)?jiān)俅屋斎?nbsp;圖書編號(hào),書名,作者,圖書數(shù)量 ,價(jià)格\n"); //為真時(shí),重輸圖書信息 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 //為假時(shí) p = p->next;//指針后移 } if (p == NULL)//查找到最后一個(gè)節(jié)點(diǎn)還未查到要的編號(hào)時(shí),輸出輸入錯(cuò)誤 printf("輸入錯(cuò)誤\n"); } void pop_sort(S *head) //鏈表冒泡排序 { //排序中沒有修改頭節(jié)點(diǎn)指針值,只是修改指針內(nèi)容head->next的值 S *pre, *p, *tail, *temp; tail = NULL; pre = head; while ((head->next->next) != tail)//(head->next)!=tail同樣適用 ,多執(zhí)行最后一個(gè)步比較 { p = head->next; pre = head; while (p->next != tail) { if ((p->price) > (p->next->price)) { pre->next = p->next; //交換節(jié)點(diǎn)方法 temp = p->next->next; p->next->next = p; p->next = temp; p = pre->next; //p回退一個(gè)節(jié)點(diǎn) } p = p->next; //p再前進(jìn)一個(gè)節(jié)點(diǎn) pre = pre->next; } tail = p; } } //輸出鏈表模塊 void print(S *head) { int i; S *p = head->next; while (p)//當(dāng)p不為空的時(shí)候執(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;//指針后移 } }
關(guān)于C++利用鏈表如何實(shí)現(xiàn)圖書信息管理系統(tǒng)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。