最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言單鏈表實(shí)現(xiàn)圖書管理系統(tǒng)

 更新時間:2022年03月11日 12:27:33   作者:不可觸碰的殤  
這篇文章主要為大家詳細(xì)介紹了C語言單鏈表實(shí)現(xiàn)圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C語言單鏈表實(shí)現(xiàn)圖書管理系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下

單鏈表實(shí)現(xiàn)的圖書管理系統(tǒng)相比于結(jié)構(gòu)體實(shí)現(xiàn)的管理系統(tǒng),可以隨時開辟新的空間,可以增加書的信息

單鏈表的實(shí)現(xiàn)

首先肯定還是打印單鏈表的常規(guī)操作,創(chuàng)建表頭,創(chuàng)建節(jié)點(diǎn),表頭法插入,特定位置刪除,打印鏈表

struct book
{
?? ?char name[20];
?? ?float price;
?? ?int num; ? ? ? ? ?//書的數(shù)量
};
//3 數(shù)據(jù)容器——鏈表
struct Node
{
?? ?struct book data;
?? ?struct Node*next;
};
void printflist(struct Node*headnode);
struct Node*headnode = NULL;
//創(chuàng)建表頭
struct Node*createlisthead()
{
?? ?//動態(tài)內(nèi)存申請
?? ?struct Node*headnode = (struct Node*)malloc(sizeof(struct Node));
?? ?//變量的基本規(guī)則:使用前必須初始化
?? ?headnode->next = NULL;
?? ?return headnode;
}
//創(chuàng)建節(jié)點(diǎn),為插入做準(zhǔn)備
//把用戶的數(shù)據(jù)變?yōu)榻Y(jié)構(gòu)體變量
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;
?? ?//字符串比較函數(shù)
?? ?while (posnode != NULL && strcmp(posnode->data.name,bookname))
?? ?{
?? ??? ?posleftnode = posnode;
?? ??? ?posnode = posnode->next;
?? ?}
?? ?//討論結(jié)果
?? ?if (posnode == NULL)
?? ?{
?? ??? ?printf("未找到數(shù)據(jù)");
?? ??? ?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;
}
//打印鏈表——從第二個節(jié)點(diǎn)開始打印
void printflist(struct Node*headnode)
{
?? ?struct Node* pmove = headnode->next;
?? ?printf("書名\t價格\t數(shù)量\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循環(huán)表示遍歷次數(shù),第二個for循環(huán)使相鄰的兩個元素進(jìn)行比較并交換
1 比較條件里,只用q指針即可
2 交換時需要創(chuàng)建一個臨時變量

//冒泡排序算法
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);
}

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

文件寫操作

1 通過創(chuàng)建節(jié)點(diǎn)指針變量來遍歷輸出文件中的信息
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 當(dāng)用 “r”的形式打開文件失敗時,說明沒有此文件,則可以用“w+”的形式打開,當(dāng)沒有文件時,會創(chuàng)建一個文件
2 把讀取出的數(shù)據(jù)以表頭法插入到鏈表中則可以再次打印出信息

//文件讀操作
void readfile(const char *filename, struct Node*headnode)
{
?? ?FILE*fp = fopen(filename, "r");
?? ?if (fp == NULL)
?? ?{
?? ??? ?//不存在文件則創(chuàng)建
?? ??? ?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 當(dāng)查找書籍時先用臨時指針接受找到書籍的指針,然后再打印書籍信息

//1 界面
void menu()
{
?? ?printf("---------------------------------\n");
?? ?printf("\t圖書管理系統(tǒng)\n");
?? ?printf("\t0.退出系統(tǒng)\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; ?//創(chuàng)建臨時變量,存儲書籍信息
?? ?struct Node*result = NULL; ? ? //創(chuàng)建臨時指針變量,指向查找書籍的節(jié)點(diǎn)
?? ?scanf("%d", &input);
?? ?switch (input)
?? ?{
?? ?case 0:
?? ??? ?printf("【退出】\n");
?? ??? ?printf("退出成功\n");
?? ??? ?system("pause");
?? ??? ?exit(0); ? //關(guān)閉整個程序
?? ??? ?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"); ? ? ? ? ?//書籍存在,數(shù)量-1
?? ??? ?printf("請輸入要借閱的書籍");
?? ??? ?scanf("%s", tempbook.name);
?? ??? ?result = searchbyname(headnode, tempbook.name);
?? ??? ?if (result == NULL)
?? ??? ?{
?? ??? ??? ?printf("沒有相關(guān)書籍,無法借閱");
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?if (result->data.num > 0)
?? ??? ??? ?{
?? ??? ??? ??? ?result->data.num--;
?? ??? ??? ??? ?printf("借閱成功");
?? ??? ??? ?}
?? ??? ??? ?else
?? ??? ??? ??? ?printf("無庫存");
?? ??? ??? ?
?? ??? ?}

?? ??? ?break;
?? ?case 4:
?? ??? ?printf("【歸還】\n"); ? ? ?//書記歸還,數(shù)量+1
?? ??? ?printf("請輸入要?dú)w還的書籍");
?? ??? ?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("未找到相關(guān)信息!\n");

?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?printf("書名\t價格\t數(shù)量\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;
}

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

相關(guān)文章

  • C++常見容器獲取頭元素的方法大全

    C++常見容器獲取頭元素的方法大全

    在C++編程中,容器是存儲和管理數(shù)據(jù)集合的重要工具,不同的容器提供了不同的接口來訪問和操作其中的元素,獲取容器的頭元素(即第一個元素)是常見的操作之一,本文將詳細(xì)列舉C++標(biāo)準(zhǔn)庫中所有常見容器獲取頭元素的方法,并對每種方法進(jìn)行簡要說明,需要的朋友可以參考下
    2025-03-03
  • STL中的string你了解嗎

    STL中的string你了解嗎

    這篇文章主要為大家詳細(xì)介紹了STL中的string,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 判斷本機(jī)office安裝版本的方法分享

    判斷本機(jī)office安裝版本的方法分享

    這篇文章主要介紹了判斷本機(jī)office安裝版本的方法分享,需要的朋友可以參考下
    2014-01-01
  • 貪心算法 WOODEN STICKS 實(shí)例代碼

    貪心算法 WOODEN STICKS 實(shí)例代碼

    貪心算法 WOODEN STICKS 實(shí)例代碼,需要的朋友可以參考一下
    2013-05-05
  • vs2019配置Qt5開發(fā)環(huán)境(圖文教程)

    vs2019配置Qt5開發(fā)環(huán)境(圖文教程)

    本文主要介紹了如何使用visual studi2019配置qt5開發(fā)環(huán)境,以及創(chuàng)建qt項(xiàng)目,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • C++實(shí)現(xiàn)字符串類型相互轉(zhuǎn)換的代碼示例

    C++實(shí)現(xiàn)字符串類型相互轉(zhuǎn)換的代碼示例

    在C/C++編程中,字符串是非?;A(chǔ)且常用的數(shù)據(jù)類型,但是由于不同的編程語言或標(biāo)準(zhǔn)庫可能采用不同的字符串類型,因此在不同的應(yīng)用場景下可能需要進(jìn)行字符串類型的相互轉(zhuǎn)換,本文將介紹如何在C/C++中將char*,std::string,QString,CString/MFC?String相互轉(zhuǎn)換
    2023-06-06
  • C/C++實(shí)現(xiàn)磁盤相關(guān)操作的示例代碼

    C/C++實(shí)現(xiàn)磁盤相關(guān)操作的示例代碼

    這篇文章主要為大家詳細(xì)介紹了C/C++如何實(shí)現(xiàn)磁盤相關(guān)操作,例如遍歷磁盤容量、實(shí)現(xiàn)磁盤格式化、移除指定磁盤等,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • C++進(jìn)程間共享數(shù)據(jù)實(shí)例

    C++進(jìn)程間共享數(shù)據(jù)實(shí)例

    這篇文章主要介紹了C++進(jìn)程間共享數(shù)據(jù)的方法,是進(jìn)行C++應(yīng)用程序開發(fā)中非常實(shí)用的技巧,需要的朋友可以參考下
    2014-10-10
  • C語言判斷大小端的兩種方法

    C語言判斷大小端的兩種方法

    大小端的問題在很多面試筆試中都會遇到,本文主要介紹了C語言判斷大小端的兩種方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • c++中的malloc底層實(shí)現(xiàn)代碼

    c++中的malloc底層實(shí)現(xiàn)代碼

    這篇文章主要介紹了c++中的malloc底層實(shí)現(xiàn)代碼,包括malloc底層實(shí)現(xiàn)原理解析,內(nèi)存池的相關(guān)知識,需要的朋友可以參考下
    2021-07-07

最新評論

收藏| 鹤峰县| 会同县| 延寿县| 双柏县| 布尔津县| 富民县| 深泽县| 方山县| 拜泉县| 石屏县| 射洪县| 拜泉县| 宣汉县| 寻乌县| 忻州市| 甘洛县| 绵阳市| 项城市| 常山县| 巴林左旗| 科技| 东兰县| 庐江县| 横山县| 永春县| 达日县| 临江市| 大渡口区| 鲜城| 康保县| 黎川县| 黑河市| 郧西县| 维西| 安庆市| 济宁市| 五台县| 英德市| 盐亭县| 二连浩特市|