C++利用鏈表實(shí)現(xiàn)圖書信息管理系統(tǒng)
更新時(shí)間:2021年11月26日 09:32:25 作者:noobcz
這篇文章主要為大家詳細(xì)介紹了C++利用鏈表實(shí)現(xiàn)圖書信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
C++利用鏈表實(shí)現(xiàn)一個(gè)簡單的圖書信息管理系統(tǒng),供大家參考,具體內(nèi)容如下
(1)圖書信息包括ISBN號、書名、作者名、價(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;//編號
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 search1(S *);//書名查找節(jié)點(diǎn)函數(shù)
void search2(S *);//作者查找節(jié)點(diǎn)函數(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("圖書信息為(按價(jià)格排序后)\n");
pop_sort(head);
printf("編號\t書名\t作者\(yùn)t數(shù)量\t價(jià)格\n");
print(head);
break;
case 3://插入
insert(head);
printf("插入后\n");
printf("編號\t書名\t作者\(yùn)t數(shù)量\t價(jià)格\n");
print(head);
break;
case 4://刪除
del(head);
printf("刪除后\n");
printf("編號\t書名\t作者\(yùn)t數(shù)量\t價(jià)格\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作者\(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.按圖書編號搜索 |\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("請輸入圖書編號,圖書名,作者,圖書數(shù)量,價(jià)格,最后輸入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é)點(diǎn)的指針域
q->next = p;//p,q節(jié)點(diǎn)連接
q = p;//q指針后移
printf("請輸入圖書編號,圖書名,作者,圖書數(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("請輸入一本圖書的信息:\n");
printf("請輸入圖書的編號,輸入0結(jié)束\n");
scanf("%d", &num);
while (num != 0)//輸入編號不為零時(shí)循環(huán),以零終止,可實(shí)現(xiàn)多個(gè)插入
{
r = (S *) malloc(sizeof(S));//為r開辟空間
r->next = NULL;//置空r的指針域
r->num = num;
printf("請輸入圖書名,作者,圖書數(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("請輸入圖書編號,輸入0結(jié)束\n");
scanf("%d", &num);
}
}
//刪除節(jié)點(diǎn)模塊
void del(S *head) {
S *p, *q;//定義指針
int b;//用于輸入編號查找刪除
p = head;//p記錄頭節(jié)點(diǎn)的地址
q = head->next;//q記錄頭節(jié)點(diǎn)的指針域的地址
printf("請輸入你想要刪除的圖書編號:");
//輸入編號
scanf("%d", &b);
while (q != NULL)//q不為空時(shí)執(zhí)行循環(huán)
{
if (q->num == b)//判斷是否找到輸入的編號
//為真時(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)還未查到要刪除的編號時(shí),輸出輸入錯(cuò)誤
printf("輸入錯(cuò)誤\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)//判斷是否找到書籍
{
//為真時(shí),輸出信息
printf("書籍信息\n");
printf("編號\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)還未查到要的編號時(shí),輸出輸入錯(cuò)誤
printf("輸入錯(cuò)誤\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)//判斷是否找到書籍
{
//為真時(shí),輸出信息
printf("書籍信息\n");
printf("編號\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)還未查到要的編號時(shí),輸出輸入錯(cuò)誤
printf("輸入錯(cuò)誤\n");
}
//編號查找
void search3(S *head) {
S *p;//定義指針
int num1;//定義num1用于輸入查找書籍
printf("請輸入你要搜索的圖書編號:");
//輸入查找編號
scanf("%d", &num1);
p = head->next;
while (p != NULL) {
if (p->num == num1)//判斷是否找到書籍
{
//為真時(shí),輸出信息
printf("書籍信息\n");
printf("編號\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)還未查到要的編號時(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("請輸入你要修改的圖書編號:");
//輸入要修改的圖書編號
scanf("%d", &num1);
p = head->next;
while (p != NULL) {
if (p->num == num1)//判斷是否找到書籍
{
printf("請?jiān)俅屋斎?圖書編號,書名,作者,圖書數(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)還未查到要的編號時(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;//指針后移
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- C++實(shí)現(xiàn)簡單的圖書管理系統(tǒng)
- C++實(shí)現(xiàn)圖書管理系統(tǒng)
- C++實(shí)現(xiàn)圖書管理系統(tǒng)課程設(shè)計(jì)
- C++實(shí)現(xiàn)圖書管理系統(tǒng)源碼
- C++編寫實(shí)現(xiàn)圖書管理系統(tǒng)
- C++實(shí)現(xiàn)圖書館管理系統(tǒng)
- C++實(shí)現(xiàn)圖書管理系統(tǒng)課程設(shè)計(jì)(面向?qū)ο?
- C++順序表實(shí)現(xiàn)圖書管理系統(tǒng)
- C++實(shí)現(xiàn)圖書管理系統(tǒng)最新版
- C++實(shí)現(xiàn)簡單版圖書管理系統(tǒng)
相關(guān)文章
C語言實(shí)現(xiàn)班級學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)班級學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11

