溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++利用鏈表如何實(shí)現(xiàn)圖書信息管理系統(tǒng)

發(fā)布時(shí)間:2021-11-24 12:22:33 來源:億速云 閱讀:310 作者:柒染 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(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ò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(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)容。

c++
AI