欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2021年11月26日 09:32:25   作者:noobcz  
這篇文章主要為大家詳細(xì)介紹了C++利用鏈表實(shí)現(xiàn)圖書(shū)信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

C++利用鏈表實(shí)現(xiàn)一個(gè)簡(jiǎn)單的圖書(shū)信息管理系統(tǒng),供大家參考,具體內(nèi)容如下

(1)圖書(shū)信息包括ISBN號(hào)、書(shū)名、作者名、價(jià)格和數(shù)量等;
(2)系統(tǒng)的主要功能包括:圖書(shū)信息的創(chuàng)建、輸出圖書(shū)信息、查詢(xún)圖書(shū)信息、增加圖書(shū)信息、刪除圖書(shū)信息。

#include <stdio.h>
#include  <stdlib.h>
#include <string.h>

//創(chuàng)建結(jié)構(gòu)體及其成員
typedef struct Node {
    int num;//編號(hào)
    char name[20];//書(shū)名
    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 *);//書(shū)名查找節(jié)點(diǎn)函數(shù)
void search2(S *);//作者查找節(jié)點(diǎn)函數(shù)
void search3(S *);//編號(hào)查找
void mod(S *);//修改圖書(shū)信息
//主函數(shù)
int main() {
    choose();
}

void choose() {
    S *head;
    int n, a = 1;//n用來(lái)控制選擇操作類(lèi)型,a控制循環(huán),以-1終止
    while (a > 0) {
        menu();//顯示菜單
        printf("選擇你想使用的功能:");
        scanf("%d", &n);//選擇操作
        switch (n)//各操作數(shù)字對(duì)應(yīng)菜單數(shù)字,通過(guò)n確定操作類(lèi)型
        {
            case 1://創(chuàng)建
                head = create();
                break;
            case 2://輸出
                printf("圖書(shū)信息為(按價(jià)格排序后)\n");
                pop_sort(head);
                printf("編號(hào)\t書(shū)名\t作者\(yùn)t數(shù)量\t價(jià)格\n");
                print(head);
                break;
            case 3://插入
                insert(head);
                printf("插入后\n");
                printf("編號(hào)\t書(shū)名\t作者\(yùn)t數(shù)量\t價(jià)格\n");
                print(head);
                break;
            case 4://刪除
                del(head);
                printf("刪除后\n");
                printf("編號(hào)\t書(shū)名\t作者\(yùn)t數(shù)量\t價(jià)格\n");
                print(head);
                break;
            case 5://書(shū)名查找
                search1(head);
                break;
            case 6://作者查找
                search2(head);
                break;
            case 7://編號(hào)查找
                search3(head);
                break;
            case 8://修改
                mod(head);
                pop_sort(head);
                printf("圖書(shū)信息為\n");
                printf("編號(hào)\t書(shū)名\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     歡迎使用圖書(shū)管理系統(tǒng)\n");
    printf("\t\t|----------SCORE-----------|\n");
    printf("\t\t|\t1.創(chuàng)建圖書(shū)           |\n");
    printf("\t\t|\t2.展示圖書(shū)信息        |\n");
    printf("\t\t|\t3.添加圖書(shū)信息        |\n");
    printf("\t\t|\t4.刪除圖書(shū)           |\n");
    printf("\t\t|\t5.按圖書(shū)名搜索        |\n");
    printf("\t\t|\t6.按作者名搜索        |\n");
    printf("\t\t|\t7.按圖書(shū)編號(hào)搜索      |\n");
    printf("\t\t|\t8.修改圖書(shū)信息        |\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)開(kāi)辟空間
    head->next = NULL;//置空頭節(jié)點(diǎn)的指針域
    q = head;//q指針記錄頭節(jié)點(diǎn)的地址
    p = head->next;//p指針記錄頭節(jié)點(diǎn)的指針域的地址
    printf("請(qǐng)輸入圖書(shū)編號(hào),圖書(shū)名,作者,圖書(shū)數(shù)量,價(jià)格,最后輸入0結(jié)束\n");
    int num;
    scanf("%d", &num);
    while (num != 0)//輸入書(shū)籍編號(hào)輸入為零停止循環(huán)
    {
        p = (S *) malloc(sizeof(S));//p指針開(kāi)辟空間
        //輸入各成員
        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)輸入圖書(shū)編號(hào),圖書(shū)名,作者,圖書(shū)數(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)輸入一本圖書(shū)的信息:\n");
    printf("請(qǐng)輸入圖書(shū)的編號(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開(kāi)辟空間
        r->next = NULL;//置空r的指針域
        r->num = num;
        printf("請(qǐng)輸入圖書(shū)名,作者,圖書(shū)數(shù)量,圖書(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)輸入圖書(shū)編號(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除的圖書(shū)編號(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;//斷開(kāi)q節(jié)點(diǎn)
            free(q);//釋放q節(jié)點(diǎn)neicun
            q = NULL; //置空q指針?lè)乐钩霈F(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");
}

//書(shū)名查找模塊
void search1(S *head) {
    S *p;//定義指針
    char name1[20];//定義name1用于輸入查找書(shū)名
    printf("請(qǐng)輸入你要搜素的書(shū)名:");
    //輸入查找書(shū)名
    scanf("%s", name1);
    p = head->next;
    while (p != NULL) {
        if (strcmp(p->name, name1) == 0)//判斷是否找到書(shū)籍
        {
            //為真時(shí),輸出信息
            printf("書(shū)籍信息\n");
            printf("編號(hào)\t書(shū)名\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 search2(S *head) {
    S *p;//定義指針
    char name2[20];//定義name2用于輸入查找書(shū)籍
    printf("輸入你想要查詢(xún)的作者:");
    //輸入查找作者
    scanf("%s", name2);
    p = head->next;
    while (p != NULL) {
        if (strcmp(p->author, name2) == 0)//判斷是否找到書(shū)籍
        {
            //為真時(shí),輸出信息
            printf("書(shū)籍信息\n");
            printf("編號(hào)\t書(shū)名\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 search3(S *head) {
    S *p;//定義指針
    int num1;//定義num1用于輸入查找書(shū)籍
    printf("請(qǐng)輸入你要搜索的圖書(shū)編號(hào):");
    //輸入查找編號(hào)
    scanf("%d", &num1);
    p = head->next;
    while (p != NULL) {
        if (p->num == num1)//判斷是否找到書(shū)籍
        {
            //為真時(shí),輸出信息
            printf("書(shū)籍信息\n");
            printf("編號(hào)\t書(shū)名\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用于輸入查找書(shū)籍修改信息,num2用于修改
    char name1[20], author1[20];
    float price1;
    printf("請(qǐng)輸入你要修改的圖書(shū)編號(hào):");
    //輸入要修改的圖書(shū)編號(hào)
    scanf("%d", &num1);
    p = head->next;
    while (p != NULL) {
        if (p->num == num1)//判斷是否找到書(shū)籍
        {
            printf("請(qǐng)?jiān)俅屋斎?圖書(shū)編號(hào),書(shū)名,作者,圖書(shū)數(shù)量 ,價(jià)格\n");
            //為真時(shí),重輸圖書(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)   //鏈表冒泡排序
{
    //排序中沒(méi)有修改頭節(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;//指針后移
    }
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++ const的各種用法詳解

    C++ const的各種用法詳解

    const名叫常量限定符,用來(lái)限定特定變量,以通知編譯器該變量是不可修改的。習(xí)慣性的使用const,可以避免在函數(shù)中對(duì)某些不應(yīng)修改的變量造成可能的改動(dòng)。本文主要談?wù)刢onst的用法,感興趣的同學(xué)可以參考閱讀
    2023-04-04
  • C/C++實(shí)現(xiàn)詞法分析程序的示例代碼

    C/C++實(shí)現(xiàn)詞法分析程序的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何基于C/C++實(shí)現(xiàn)一個(gè)簡(jiǎn)單的詞法分析程序,并通過(guò)完成詞法分析程序,了解詞法分析的過(guò)程,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)學(xué)習(xí)
    2023-05-05
  • C++基本用法實(shí)踐之移動(dòng)語(yǔ)義詳解

    C++基本用法實(shí)踐之移動(dòng)語(yǔ)義詳解

    移動(dòng)(move)語(yǔ)義是C++引入了一種新的內(nèi)存優(yōu)化,以避免不必要的拷貝,下面小編就來(lái)和大家簡(jiǎn)單聊聊C++中移動(dòng)語(yǔ)義的相關(guān)使用吧,希望對(duì)大家有所幫助
    2023-07-07
  • C語(yǔ)言指針之必須要掌握的指針基礎(chǔ)知識(shí)

    C語(yǔ)言指針之必須要掌握的指針基礎(chǔ)知識(shí)

    這篇文章主要介紹了C語(yǔ)言指針必須要掌握的基礎(chǔ)知識(shí),文中實(shí)例講解的很清晰,有不太懂的同學(xué)可以研究下,希望能夠給你帶來(lái)幫助
    2021-09-09
  • C語(yǔ)言函數(shù)的參數(shù)使用指針

    C語(yǔ)言函數(shù)的參數(shù)使用指針

    這篇文章主要介紹了C語(yǔ)言函數(shù)的參數(shù)使用指針,本文講述了指針在作為函數(shù)參數(shù)時(shí)候的使用方法,解析值傳遞和值引用的區(qū)別案例,希望對(duì)你有所幫助
    2021-06-06
  • 詳解C語(yǔ)言中結(jié)構(gòu)體的自引用和相互引用

    詳解C語(yǔ)言中結(jié)構(gòu)體的自引用和相互引用

    這篇文章主要介紹了C語(yǔ)言中結(jié)構(gòu)體的自引用和相互引用,詳細(xì)解析了結(jié)構(gòu)體中指針的指向情況,需要的朋友可以參考下
    2016-04-04
  • C語(yǔ)言實(shí)現(xiàn)棧及棧的詳解

    C語(yǔ)言實(shí)現(xiàn)棧及棧的詳解

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)棧及棧的詳解,一種特殊的線(xiàn)性表,其只允許在固定的一端進(jìn)行插入和刪除元素操作,進(jìn)行數(shù)據(jù)插入和刪除操作的一端稱(chēng)為棧頂,另一端稱(chēng)為棧底,需要的朋友可以參考下
    2023-07-07
  • C語(yǔ)言實(shí)現(xiàn)班級(jí)學(xué)生管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)班級(jí)學(xué)生管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)班級(jí)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C++基于prim實(shí)現(xiàn)迷宮生成

    C++基于prim實(shí)現(xiàn)迷宮生成

    這篇文章主要為大家詳細(xì)介紹了C++基于prim實(shí)現(xiàn)迷宮生成,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • C++和C的混合編譯的項(xiàng)目實(shí)踐

    C++和C的混合編譯的項(xiàng)目實(shí)踐

    本文主要介紹了C++和C的混合編譯的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06

最新評(píng)論