亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言中單鏈表如何實現圖書管理系統

發布時間:2022-03-11 14:12:56 來源:億速云 閱讀:390 作者:小新 欄目:開發技術

小編給大家分享一下C語言中單鏈表如何實現圖書管理系統,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

具體內容如下

單鏈表實現的圖書管理系統相比于結構體實現的管理系統,可以隨時開辟新的空間,可以增加書的信息

單鏈表的實現

首先肯定還是打印單鏈表的常規操作,創建表頭,創建節點,表頭法插入,特定位置刪除,打印鏈表

struct book
{
    char name[20];
    float price;
    int num;          //書的數量
};
//3 數據容器——鏈表
struct Node
{
    struct book data;
    struct Node*next;
};
void printflist(struct Node*headnode);
struct Node*headnode = NULL;
//創建表頭
struct Node*createlisthead()
{
    //動態內存申請
    struct Node*headnode = (struct Node*)malloc(sizeof(struct Node));
    //變量的基本規則:使用前必須初始化
    headnode->next = NULL;
    return headnode;
}
//創建節點,為插入做準備
//把用戶的數據變為結構體變量
struct Node* createnewnode(struct book data)
{
    struct Node*newnode = (struct Node*)malloc(sizeof(struct Node));
    newnode->data = data;
    newnode->next = NULL;
    return newnode;
}
//表頭法插入
void insertbyhead(struct Node*headnode, struct book data)
{
    struct Node* newnode = createnewnode(data);
    //必須先連后斷
    newnode->next = headnode->next;
    headnode->next = newnode;

}
//指定位置刪除
void deletenodebyname(struct Node*headnode, char *bookname)
{
    struct Node*posleftnode = headnode;
    struct Node*posnode = headnode->next;
    //字符串比較函數
    while (posnode != NULL && strcmp(posnode->data.name,bookname))
    {
        posleftnode = posnode;
        posnode = posnode->next;
    }
    //討論結果
    if (posnode == NULL)
    {
        printf("未找到數據");
        return ;
    }
    else
    {
        posleftnode->next = posnode->next;
        free(posnode);
        posnode = NULL;
    }
    printflist(headnode);
}
//查找書籍
struct Node*searchbyname(struct Node*headnode, char *bookname)
{
    struct Node *posnode = headnode->next;
    while (posnode != NULL &&strcmp(posnode->data.name, bookname))
    {
        posnode = posnode->next;
    }
    return posnode;
}
//打印鏈表——從第二個節點開始打印
void printflist(struct Node*headnode)
{
    struct Node* pmove = headnode->next;
    printf("書名\t價格\t數量\n");

    while (pmove!=NULL)
    {
        printf("%s\t%.1f\t%d\n", pmove->data.name,pmove->data.price,pmove->data.num );
        pmove = pmove->next;
    }
    printf("\n");
}

冒泡排序——通過價格

第一個for循環表示遍歷次數,第二個for循環使相鄰的兩個元素進行比較并交換
1 比較條件里,只用q指針即可
2 交換時需要創建一個臨時變量

//冒泡排序算法
void bubblesortlist(struct Node*headnode)
{
    for (struct Node*p = headnode->next; p != NULL; p = p->next)
    {
        for (struct Node*q = headnode->next; q->next != NULL; q = q->next)
        {
            if (q->data.price > q->next->data.price)
            {
                //交換
                struct book tempdata = q->data;
                q->data = q->next->data;
                q->next->data = tempdata;
            }
        }
    }
    printflist(headnode);
}

如果不儲存信息,那么每次在輸入信息完畢后關閉控制臺,信息無法保留,所以我們通過文件的方式來儲存信息

文件寫操作

1 通過創建節點指針變量來遍歷輸出文件中的信息
2 通過fprintf可以將輸入的信息保持下來

//寫操作
void savefile(const char*filename, struct Node*headnode)
{
    FILE*fp = fopen(filename, "w");
    struct Node*pmove = headnode->next;
    while (pmove != NULL)
    {
        fprintf(fp, "%s\t%.1f\t%d\n", pmove->data.name, pmove->data.price, pmove->data.num);
        pmove = pmove->next;
    }

    fclose(fp);
    fp = NULL;
}

文件讀操作

1 當用 “r”的形式打開文件失敗時,說明沒有此文件,則可以用“w+”的形式打開,當沒有文件時,會創建一個文件
2 把讀取出的數據以表頭法插入到鏈表中則可以再次打印出信息

//文件讀操作
void readfile(const char *filename, struct Node*headnode)
{
    FILE*fp = fopen(filename, "r");
    if (fp == NULL)
    {
        //不存在文件則創建
        fp = fopen(filename, "w+");
    }
    struct book tempdata;
    while (fscanf(fp, "%s\t%f\t%d\n", tempdata.name, &tempdata.price, &tempdata.num) != EOF)
    {
        insertbyhead(headnode, tempdata);
    }
    fclose(fp);
    fp = NULL;
}

剩余代碼

1 當查找書籍時先用臨時指針接受找到書籍的指針,然后再打印書籍信息

//1 界面
void menu()
{
    printf("---------------------------------\n");
    printf("\t圖書管理系統\n");
    printf("\t0.退出系統\n");
    printf("\t1.登記書籍\n");
    printf("\t2.瀏覽書籍\n");
    printf("\t3.借閱書籍\n");
    printf("\t4.歸還書籍\n");
    printf("\t5.書籍排序\n");
    printf("\t6.刪除書籍\n");
    printf("\t7.查找書籍\n");
    printf("---------------------------------\n");
    printf("請輸入0~7\n");

}
//2  做交互
void keydown()
{
    int input = 0;
    struct book tempbook;  //創建臨時變量,存儲書籍信息
    struct Node*result = NULL;     //創建臨時指針變量,指向查找書籍的節點
    scanf("%d", &input);
    switch (input)
    {
    case 0:
        printf("【退出】\n");
        printf("退出成功\n");
        system("pause");
        exit(0);   //關閉整個程序
        break;
    case 1:
        printf("【登記】\n");
        printf("輸入書籍的信息(name,price,num)");
        scanf("%s%f%d", tempbook.name, &tempbook.price, &tempbook.num);
        insertbyhead(headnode, tempbook);
        savefile("book.txt", headnode);
        break;
    case 2:
        printf("【瀏覽】\n");
        printflist(headnode);
        break;
    case 3:
        printf("【借閱】\n");          //書籍存在,數量-1
        printf("請輸入要借閱的書籍");
        scanf("%s", tempbook.name);
        result = searchbyname(headnode, tempbook.name);
        if (result == NULL)
        {
            printf("沒有相關書籍,無法借閱");
        }
        else
        {
            if (result->data.num > 0)
            {
                result->data.num--;
                printf("借閱成功");
            }
            else
                printf("無庫存");
            
        }

        break;
    case 4:
        printf("【歸還】\n");      //書記歸還,數量+1
        printf("請輸入要歸還的書籍");
        scanf("%s", tempbook.name);
        result = searchbyname(headnode, tempbook.name);
        if (result == NULL)
            printf("來源非法");
        else
        {
            result->data.num++;
            printf("書籍歸還成功!");
        }
    
        break;
    case 5:
        printf("【排序】\n");
        bubblesortlist(headnode);
        savefile("book.txt", headnode);
        break;
    case 6:
        printf("【刪除】\n");
        printf("輸入要刪除的書名");
        scanf("%s", tempbook.name);
        deletenodebyname(headnode, tempbook.name);
        savefile("book.txt", headnode);
        break;
    case 7:
        printf("【查找】\n");
        printf("請輸入要查找的書籍");
        scanf("%s", tempbook.name);
        result = searchbyname(headnode, tempbook.name);
        if (result == NULL)
        {
            printf("未找到相關信息!\n");

        }
        else
        {
            printf("書名\t價格\t數量\n");
            printf("%s\t%.1f\t%d\t", result->data.name, result->data.price, result->data.num);
        }
        break;
    default:
        printf("選擇錯誤,請重新選擇:>");
        break;
    }
}
int main()
{
    headnode = createlisthead();
    readfile("book.txt", headnode);
    while (1)
    {
        menu();
        keydown();
        system("pause");
        system("cls");

    }
    system("pause");
    return 0;
}

以上是“C語言中單鏈表如何實現圖書管理系統”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

会泽县| 大冶市| 安阳县| 临安市| 垦利县| 双桥区| 昭平县| 阳信县| 广昌县| 桐庐县| 山阳县| 凤山县| 东丽区| 周至县| 东山县| 凌源市| 玛曲县| 紫金县| 报价| 旺苍县| 探索| 清徐县| 当阳市| 弥渡县| 正镶白旗| 大关县| 沙田区| 抚远县| 隆回县| 什邡市| 金阳县| 彭山县| 团风县| 禹城市| 闵行区| 苍山县| 太谷县| 油尖旺区| 平乐县| 钟山县| 上虞市|