廣告做圖網(wǎng)站廣州新聞發(fā)布
目錄
書籍存儲(chǔ)的實(shí)現(xiàn)規(guī)劃
?編輯?前置準(zhǔn)備:
?書籍結(jié)構(gòu)體:
書籍展示的初始化和文件加載
書籍展示的銷毀和文件保存
?書籍展示的容量檢查
?書籍展示的尾插實(shí)現(xiàn)
?書籍展示的書籍增加
?書籍展示的書籍打印
?書籍刪除展示數(shù)據(jù)
書籍展示修改數(shù)據(jù)
在指定位置之前刪除數(shù)據(jù)
?書籍查找展示數(shù)據(jù)
?測(cè)試文件:
?源代碼文件:
書籍存儲(chǔ)的實(shí)現(xiàn)規(guī)劃
?前置準(zhǔn)備:
文件前置創(chuàng)建:
- BookList.h? -? 頭文件聲明
- BookList.c? -? 實(shí)現(xiàn)功能
- text.c? ? ? ? ? ?-? 測(cè)試文件
- 創(chuàng)建書籍結(jié)構(gòu)體
- 創(chuàng)建動(dòng)態(tài)內(nèi)存
??BookList 結(jié)構(gòu)體的創(chuàng)建
?為了方便后續(xù)更改,我們有以下定義
?1.書名 ?2.作者 ?3.價(jià)格 ?4.分類 ?5.編號(hào)
#define BOOKNAME 100
#define AUTHOR 50
#define TYPE 30
#define ID 50
?書籍結(jié)構(gòu)體:
typedef struct BookList
{char book_name[BOOKNAME]; //書名char author[AUTHOR]; //作者float price; //價(jià)格char type[TYPE]; //分類char id[ID]; //編號(hào)
}BookList;
?定義類型方便更改
typedef BookList SLDataType;
創(chuàng)建動(dòng)態(tài)順序表?
typedef struct Book
{SLDataType* arr; //指針變量,指向結(jié)構(gòu)體類型元素的數(shù)組int size; //有效數(shù)據(jù)的個(gè)數(shù)int capacity; //空間容量大小
}Book;
書籍展示的初始化和文件加載
void BookInit(Book* book);
void LoadBook(Book* book);
// 書籍展示的初始化和文件加載
void BookInit(Book* book)
{book->arr = NULL;book->size = book->capacity = 0;LoadBook(book);
}void LoadBook(Book* book)
{FILE* pf = fopen("booklist", "rb");if (NULL == pf){perror("fopen booklist error!");return;}//加載文件BookList b2;while (fread(&b2, sizeof(BookList), 1, pf)){//尾插BookPushBack(book, b2);}printf("數(shù)據(jù)加載成功!\n");fclose(pf);pf = NULL;
}
書籍展示的銷毀和文件保存
void BookDestroy(Book* book);
void SaveBook(Book* book);
// 書籍展示的銷毀和文件保存
void SLDestroy(Book* ps)
{if (ps->arr==NULL) //判斷ps->arr是否為NULL,如果不為NULL,說(shuō)明空間需要釋放{free(ps->arr);}ps->arr = NULL;ps->size = ps->capacity = 0;
}void BookDestroy(Book* book)
{SaveBook(book);SLDestroy(book);
}// 圖書書籍存儲(chǔ)
void SaveBook(Book* book)
{FILE* pd = fopen("booklist", "wb");if (NULL == pd){perror("fopen booklist error!");return;}// 存儲(chǔ)書籍?dāng)?shù)據(jù)for (int i = 0; i < book->size; i++){fwrite(book->arr+i, sizeof(BookList), 1, pd);}printf("數(shù)據(jù)保存成功!\n");fclose(pd);pd = NULL;
}
?書籍展示的容量檢查
void BookCheckCapacity(Book* book);
// 書籍展示的容量檢查
void BookCheckCapacity(Book* book)
{if (book->capacity == book->size){int newcapacity = book->capacity == 0 ? 4 : book->capacity * 2;//動(dòng)態(tài)內(nèi)存分配SLDataType* tmp = (SLDataType*)realloc(book->arr, newcapacity * sizeof(SLDataType));if (NULL == tmp){perror("realloc error!");return;}book->arr = tmp;book->capacity = newcapacity;}
}
?書籍展示的尾插實(shí)現(xiàn)
void BookPushBack(Book* book, SLDataType x);
// 書籍展示的尾插實(shí)現(xiàn)
void BookPushBack(Book* book, SLDataType x)
{assert(book);//尾插之前檢查內(nèi)存是否夠BookCheckCapacity(book);//進(jìn)行尾插book->arr[book->size++] = x;
}
?書籍展示的書籍增加
void BookAdd(Book* book);
// 書籍展示的書籍增加
void BookAdd(Book* book)
{// 1.書名 2.作者 3.價(jià)格 4.分類 5.編號(hào)BookList b1;printf("請(qǐng)輸入你要添加的書籍名字:\n");scanf("%s", b1.book_name);printf("請(qǐng)輸入你要添加的書籍作者:\n");scanf("%s", b1.author);printf("請(qǐng)輸入你要添加的書籍價(jià)格:\n");scanf("%f", &(b1.price));printf("請(qǐng)輸入你要添加的書籍分類:\n");scanf("%s", b1.type);printf("請(qǐng)輸入你要添加的書籍編號(hào):\n");scanf("%s", b1.id);// 添加數(shù)據(jù)BookPushBack(book, b1);printf("添加成功!\n");
}
?書籍展示的書籍打印
void BookPint(Book* book);
// 書籍展示的書籍打印
void BookPint(Book* book)
{// 1.書名 2.作者 3.價(jià)格 4.分類 5.編號(hào)printf("%-10s %-10s %-10s %-10s %-15s\n", "書名", "作者", "價(jià)格", "分類", "編號(hào)");printf("-------------------------------------------------------------\n");for (int i = 0; i < book->size; i++){printf("%-10s %-10s %-10.1f %-10s %-15s\n",book->arr[i].book_name,book->arr[i].author,book->arr[i].price,book->arr[i].type,book->arr[i].id);}
}
?書籍刪除展示數(shù)據(jù)
void BookDel(Book* book);
//刪除書籍展示數(shù)據(jù)
void BookDel(Book* book)
{// 在刪除之前先檢查數(shù)據(jù)存不存在char name[BOOKNAME];printf("請(qǐng)輸入您需要?jiǎng)h除的書籍:\n");scanf("%s", name);int find = FindByName(book, name);if (find < 0){printf("無(wú)法找到需要?jiǎng)h除的圖書\n");return;}SLErase(book, find);printf("刪除成功!\n");
}
書籍展示修改數(shù)據(jù)
void BookModify(Book* book);
//書籍展示修改數(shù)據(jù)
void BookModify(Book* book)
{//要修改的書籍需要存在char name[BOOKNAME];printf("請(qǐng)輸入你需要修改的圖書名字:\n");scanf("%s", name);//查找書籍看是否存在int find = FindByName(book, name);if (find < 0){printf("無(wú)法找到需要修改的圖書\n");return;}//直接修改printf("請(qǐng)輸入新的圖書名字:\n");scanf("%s", book->arr[find].book_name);printf("請(qǐng)輸入新的圖書作者:\n");scanf("%s", book->arr[find].author);printf("請(qǐng)輸入新的圖書價(jià)格:\n");scanf("%f", &(book->arr[find].price));printf("請(qǐng)輸入新的圖書分類:\n");scanf("%s", book->arr[find].type);printf("請(qǐng)輸入新的圖書編號(hào):\n");scanf("%s", book->arr[find].id);printf("修改成功!\n");
}
在指定位置之前刪除數(shù)據(jù)
void SLErase(Book* book, int pos);
//在指定位置之前刪除數(shù)據(jù)
void SLErase(Book* book, int pos)
{assert(book);//斷言防止傳入空指針//判斷刪除的數(shù)據(jù)是否合法if (pos >= 0 && pos < book->size){// 刪除數(shù)據(jù)for (int i = pos; i < book->size - 1; i++){book->arr[i] = book->arr[i + 1];//ps->[size-2]=ps->arr[size-1]}--book->size;}
}
?書籍查找展示數(shù)據(jù)
void BookFind(Book* book);
//查找圖書數(shù)據(jù)
void BookFind(Book* book)
{char name[BOOKNAME];printf("請(qǐng)輸入你要查找的書籍名字:\n");scanf("%s", name);//檢查圖書數(shù)據(jù)是否存在int find = FindByName(book, name);if (find < 0){printf("您要查找的書籍不存在!\n");return;}// 1.書名 2.作者 3.價(jià)格 4.分類 5.編號(hào)printf("%-10s %-10s %-10s %-10s %-15s\n", "書名", "作者", "價(jià)格", "分類", "編號(hào)");printf("-------------------------------------------------------------\n");//找到了printf("%-10s %-10s %-10.1f %-10s %-15s\n",book->arr[find].book_name,book->arr[find].author,book->arr[find].price,book->arr[find].type,book->arr[find].id);
}
?測(cè)試文件:
#define _CRT_SECURE_NO_WARNINGS 1
#include "BookList.h"
#include <windows.h>enum book_name
{ExitBook, // 0AddBook, // 1DelBook, //...PrintBook,ChangeBook,CheckBook
};void book_print()
{printf("*****************書籍錄*********************\n");printf("*************1. 增添圖書********************\n");printf("*************2. 刪除圖書********************\n");printf("*************3. 打印圖書********************\n");printf("*************4. 修改圖書********************\n");printf("*************5. 查找圖書********************\n");printf("*************0. 退出圖書錄******************\n");
}int main()
{Book b1;// 創(chuàng)建通訊錄對(duì)象,實(shí)際上就是順序表對(duì)象,等價(jià)于 SL sl//順序表的創(chuàng)建BookInit(&b1);int op = -1;do{book_print();printf("請(qǐng)選擇你的操作:\n");scanf("%d", &op);switch (op){case ExitBook:printf("退出圖書錄系統(tǒng)...\n");Sleep(1000);break;case AddBook:BookAdd(&b1);Sleep(1000);break;case DelBook:BookDel(&b1);Sleep(1000);break;case PrintBook:BookPint(&b1);Sleep(1000);break;case ChangeBook:BookModify(&b1);Sleep(1000);break;case CheckBook:BookFind(&b1);Sleep(1000);break;default:printf("選擇錯(cuò)誤,請(qǐng)重新選擇\n");Sleep(1000);break;}} while (op != 0);// 順序表的銷毀BookDestroy(&b1);return 0;
}
?源代碼文件:
BookList_2024_4_5 · 34c38d2 · 陽(yáng)區(qū)欠/C語(yǔ)言學(xué)習(xí)路程 - Gitee.com