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

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++ const的各種用法詳解

    C++ const的各種用法詳解

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

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

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

    C++基本用法實踐之移動語義詳解

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

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

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

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

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

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

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

    C語言實現(xiàn)棧及棧的詳解

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

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

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

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

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

    C++和C的混合編譯的項目實踐

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

最新評論