C++利用鏈表實現圖書信息管理系統

C++利用鏈表實現一個簡單的圖書信息管理系統,供大傢參考,具體內容如下

(1)圖書信息包括ISBN號、書名、作者名、價格和數量等;
(2)系統的主要功能包括:圖書信息的創建、輸出圖書信息、查詢圖書信息、增加圖書信息、刪除圖書信息。

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

//創建結構體及其成員
typedef struct Node {
    int num;//編號
    char name[20];//書名
    char author[20];//作者
    int isexsit;//數量
    float price;//價格
    struct Node *next;//指針域
} S;//結構體定義為S
//各函數定義
void choose();

void menu(); //菜單函數
S *create();//創建鏈表函數
void print(S *);//輸出鏈表函數
void pop_sort(S *);//排序
void insert(S *);//插入節點函數
void del(S *);//刪除節點函數
void search1(S *);//書名查找節點函數
void search2(S *);//作者查找節點函數
void search3(S *);//編號查找
void mod(S *);//修改圖書信息
//主函數
int main() {
    choose();
}

void choose() {
    S *head;
    int n, a = 1;//n用來控制選擇操作類型,a控制循環,以-1終止
    while (a > 0) {
        menu();//顯示菜單
        printf("選擇你想使用的功能:");
        scanf("%d", &n);//選擇操作
        switch (n)//各操作數字對應菜單數字,通過n確定操作類型
        {
            case 1://創建
                head = create();
                break;
            case 2://輸出
                printf("圖書信息為(按價格排序後)\n");
                pop_sort(head);
                printf("編號\t書名\t作者\t數量\t價格\n");
                print(head);
                break;
            case 3://插入
                insert(head);
                printf("插入後\n");
                printf("編號\t書名\t作者\t數量\t價格\n");
                print(head);
                break;
            case 4://刪除
                del(head);
                printf("刪除後\n");
                printf("編號\t書名\t作者\t數量\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數量\t價格\n");
                print(head);
                break;
            default:
                a = -1;//跳出循環條件
                break;
        }
    }
}

//菜單模塊直接顯示
void menu() {
    printf("\n\n");
    printf("\t\t     歡迎使用圖書管理系統\n");
    printf("\t\t|----------SCORE-----------|\n");
    printf("\t\t|\t1.創建圖書           |\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");
}

//創建鏈表模塊
S *create() {
    S *head, *p, *q;//定義指針
    int i;
    head = (S *) malloc(sizeof(S));//頭節點開辟空間
    head->next = NULL;//置空頭節點的指針域
    q = head;//q指針記錄頭節點的地址
    p = head->next;//p指針記錄頭節點的指針域的地址
    printf("請輸入圖書編號,圖書名,作者,圖書數量,價格,最後輸入0結束\n");
    int num;
    scanf("%d", &num);
    while (num != 0)//輸入書籍編號輸入為零停止循環
    {
        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節點的指針域
        q->next = p;//p,q節點連接
        q = p;//q指針後移
        printf("請輸入圖書編號,圖書名,作者,圖書數量,價格,最後輸入0結束\n");
        scanf("%d", &num);
    }
    return head;//返回鏈表的起始地址
}

//插入節點模塊(可多個插入)
void insert(S *head) {
    int i, num, flag = 1;//flag實現判斷指針是否到達最後一個節點
    S *p, *q, *r; //定義指針便於插入操作
    printf("請輸入一本圖書的信息:\n");
    printf("請輸入圖書的編號,輸入0結束\n");
    scanf("%d", &num);
    while (num != 0)//輸入編號不為零時循環,以零終止,可實現多個插入
    {
        r = (S *) malloc(sizeof(S));//為r開辟空間
        r->next = NULL;//置空r的指針域
        r->num = num;
        printf("請輸入圖書名,作者,圖書數量,圖書價格\n");
        scanf("%s %s %d %f", r->name, r->author, &r->isexsit, &r->price);
        q = head;//q指針記錄頭節點的地址
        p = head->next;//p指針記錄頭節點的指針域的地址
        while (q->next != NULL && p->price < r->price)//循環條件:當q->next不為空,以及按價格排序插入
        {
            p = p->next;//p指針後移
            q = q->next;//q指針後移
            if (q->next == NULL)//這個判斷防止q->next為空時,在執行循環是出現野指針使程序出錯
            {
                p = NULL;//防止出現野指針p
                q->next = r;//連接節點
                r->next = NULL;//置空r指針域
                flag = 0;//到達最後一個節點更改flag
                break;
            }
        }
        if (flag)//判斷是否到達最後一個節點,為真執行該操作
        {
            r->next = p;
            q->next = r;
            //實現將r節點插入鏈表
        }
        printf("請輸入圖書編號,輸入0結束\n");
        scanf("%d", &num);
    }
}

//刪除節點模塊
void del(S *head) {
    S *p, *q;//定義指針
    int b;//用於輸入編號查找刪除
    p = head;//p記錄頭節點的地址
    q = head->next;//q記錄頭節點的指針域的地址
    printf("請輸入你想要刪除的圖書編號:");
    //輸入編號
    scanf("%d", &b);
    while (q != NULL)//q不為空時執行循環
    {
        if (q->num == b)//判斷是否找到輸入的編號
            //為真時
        {
            p->next = q->next;//斷開q節點
            free(q);//釋放q節點neicun
            q = NULL; //置空q指針防止出現野指針
        } else {
            //判斷為假時
            p = p->next;//p指針後移
            q = q->next;//q指針後移
        }
    }
    if (p == NULL)//當查找到最後一個節點還未查到要刪除的編號時,輸出輸入錯誤
        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數量\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)//查找到最後一個節點還未查到要的編號時,輸出輸入錯誤
        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數量\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)//查找到最後一個節點還未查到要的編號時,輸出輸入錯誤
        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數量\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)//查找到最後一個節點還未查到要的編號時,輸出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("請再次輸入 圖書編號,書名,作者,圖書數量 ,價格\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)//查找到最後一個節點還未查到要的編號時,輸出輸入錯誤
        printf("輸入錯誤\n");
}

void pop_sort(S *head)   //鏈表冒泡排序
{
    //排序中沒有修改頭節點指針值,隻是修改指針內容head->next的值
    S *pre, *p, *tail, *temp;
    tail = NULL;
    pre = head;
    while ((head->next->next) != tail)//(head->next)!=tail同樣適用 ,多執行最後一個步比較
    {
        p = head->next;
        pre = head;
        while (p->next != tail) {
            if ((p->price) > (p->next->price)) {
                pre->next = p->next; //交換節點方法
                temp = p->next->next;
                p->next->next = p;
                p->next = temp;
                p = pre->next;  //p回退一個節點
            }
            p = p->next;  //p再前進一個節點
            pre = pre->next;
        }
        tail = p;
    }
}

//輸出鏈表模塊
void print(S *head) {
    int i;
    S *p = head->next;
    while (p)//當p不為空的時候執行
    {
        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;//指針後移
    }
}

以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: