日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

实现图书增删的代码_不仅仅是图书信息管理系统

發(fā)布時間:2023/12/10 windows 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实现图书增删的代码_不仅仅是图书信息管理系统 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

點擊藍(lán)字 關(guān)注我們

不僅僅是圖書信息管理系統(tǒng)

基于雙鏈表,采用面向?qū)ο缶幊谭椒ㄖ谱鞯膱D書管理系統(tǒng)

?

效果演示

root用戶:賬號:0,密碼:0

普通用戶:賬號:1001,密碼:666666

圖書信息

沒有完全演示,只是個大概,微信gif只能300幀以內(nèi)

框架結(jié)構(gòu)

數(shù)據(jù)層:雙鏈表管理

核心層:用戶管理、圖書管理

用戶管理:

用戶分三種:readonly、write、root(可刪除數(shù)據(jù))

功能:Exit(退出), Add(添加), Show(顯示), Change(修改), Delete(刪除), Search(查找)

圖書管理:

權(quán)限分級:暫未實現(xiàn)(可自行實現(xiàn))

功能:EXIT(退出), ADD(添加), SHOW(顯示), CHANGE(修改), DELETE(刪除), SEARCH(查找)

ps:用這個雙鏈表框架可以解決99.9%的各種信息管理系統(tǒng)(增刪改查)問題,那%0.1就是給自己留的后路,畢竟沒有什么問題可以100%解決

以后再跟我提xxx管理系統(tǒng)我就給你扔過去這對代碼,自己去實現(xiàn)

核心部分:雙鏈表的實現(xiàn)

雙鏈表typedef struct deroy_node
{
void* data;
struct deroy_node* prev;
struct deroy_node* next;
}deroy_node_t;
typedef deroy_node_t* deroy_node_pt;


typedef struct deroy_list
{
int limit_size;
deroy_node_pt head;
deroy_node_pt tail;
}deroy_list_t;
typedef deroy_list_t* deroy_list_pt;

為什么鏈表里面的data是void*呢,譚浩強(qiáng)的C語言不是這樣教的啊

void類型是空類型,可以轉(zhuǎn)成任意一種類型,你不知道你插入的數(shù)據(jù)的結(jié)構(gòu)體是什么,或者說你要插入多種數(shù)據(jù)的結(jié)構(gòu)體,確定的結(jié)構(gòu)體已經(jīng)不能夠滿足需求了,需要定義void*類型來指向你要添加進(jìn)鏈表的結(jié)構(gòu)體數(shù)據(jù)

我們需要實現(xiàn)一些函數(shù)來管理鏈表,注意o,前方高能,小白勿看

功能函數(shù)

/*初始化鏈表*/
deroy_list_pt deroy_list_create(void);
/*插入節(jié)點*/
int deroy_list_insert_before(deroy_list_t** list_head, int num, void* new_node_data);
/*刪除節(jié)點*/
int deroy_list_delete(deroy_list_t** list_head, int num);
/*修改節(jié)點*/
int deroy_list_modify(deroy_list_t** list_head, int num, void* new_node_data);
/*遍歷節(jié)點*/
void deroy_list_cuid(deroy_list_t* list_head, void (*do_function)(void*));
/*查詢數(shù)據(jù) 返回 數(shù)據(jù)的位置*/
int deroy_list_search(deroy_list_t** list_head, void* find_data, int(*compare)(void*, void*));
/*查詢數(shù)據(jù) 返回 數(shù)據(jù)的指針*/
void* deroy_list_find(deroy_list_t** list_head, void* find_data, int(*compare)(void*, void*))

為什么我要先把功能函數(shù)的原型給列舉出來,因為你仔細(xì)看參數(shù),雙鏈表功能實現(xiàn)多次用到回調(diào)函數(shù)

什么是回調(diào)函數(shù)呢?

回調(diào)函數(shù)就是一個通過函數(shù)指針調(diào)用的函數(shù)。?

怎么說呢,如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù),當(dāng)這個指針被用來調(diào)用其所指向的函數(shù)時,我們就說這是回調(diào)函數(shù)。

回調(diào)函數(shù)能夠干什么?

你學(xué)過C++知道多肽吧,就是一個方法實現(xiàn)多個功能,回調(diào)函數(shù)就是C里面實現(xiàn)多肽的方式

舉個栗子:

功能函數(shù)里面有個遍歷所有節(jié)點的功能函數(shù)

/*遍歷節(jié)點*/
void deroy_list_cuid(deroy_list_t* list_head, void (*do_function)(void*)){
int i = 0;
if (list_head == NULL || list_head->limit_size < 0)
{
errno = EINVAL;
exit(errno);
}
for (i = 0; i < list_head->limit_size; i++)
{
(*do_function)(__deroy_list_visit(&list_head, i));
}
}

前面那個判斷沒啥可看的,直接看 (*do_function)(__deroy_list_visit(&list_head, i));

__deroy_list_visit是個內(nèi)聯(lián)函數(shù),它的功能就是返回list_head里面的第i個節(jié)點數(shù)據(jù)(void *data)

然后將數(shù)據(jù)給傳入的do_function,讓dofunction去處理data數(shù)據(jù),核心層用戶管理區(qū)實現(xiàn)dofunction

/*回調(diào)函數(shù) 打印所以學(xué)生信息*/
static void proxy_find_stu(deroy_data_pt pdata){
/*遍歷學(xué)生信息*/
if (pdata->type == STU)
{
printf(" %d\t%d\t%s\t%d\t%d\n", pdata->type, pdata->id, pdata->name, pdata->sex, pdata->rank);
}
}

/*回調(diào)函數(shù) root用戶打印所有信息*/
static void proxy_find_all(deroy_data_pt pdata){
/*遍歷所有信息*/
printf(" %d\t%d\t%s\t%d\t%d\t%d:\t%s\n", pdata->type, pdata->id, pdata->name, pdata->sex, pdata->rank, pdata->acount,pdata->password);
}

????通過對dofunction的實現(xiàn),我們一個deroy_list_cuid函數(shù)可以遍歷所有data的id段,還是不管什么數(shù)據(jù)都打印,這樣就實現(xiàn)了root用戶查看的權(quán)限更大

????如果覺得這個直接兩個函數(shù)實現(xiàn)不是更好嗎,如果你想到這里,證明你還在思考,對,兩個函數(shù)實現(xiàn)更方便,但是,那是核心層(自己寫回調(diào)函數(shù))去重新解釋這個功能,達(dá)到了分層的概念

或許這里的回調(diào)函數(shù)應(yīng)用的不明顯,這里還有個明顯的

/*查詢數(shù)據(jù) 返回 數(shù)據(jù)的位置*/
int deroy_list_search(deroy_list_t** list_head, void* find_data, int(*compare)(void*, void*)){
int counter = 1;
deroy_node_pt current = NULL;
if (list_head == NULL || *list_head == NULL)
{
errno = EINVAL;
exit(errno);
}
if ((*list_head)->limit_size == 0)
{
return -1; //無數(shù)據(jù)可查詢
}
current = (*list_head)->head;
/*通過傳入的comper函數(shù)進(jìn)行比較*/
while (compare(current->data, find_data) == 0 && current->next != NULL)
{
current = current->next;
counter++;
}
if (current->next == NULL && compare(current->data, find_data) == 0)
return 0;
return counter;
}

這里的的回調(diào)函數(shù)要求判斷兩個數(shù)據(jù),返回真假

/*回調(diào)函數(shù) 比較db_data_pt數(shù)據(jù)段的id是否相同*/
static int proxy_compare_id(deroy_data_pt pdata, deroy_data_pt other){
if (pdata->id == other->id)
return 1;
return 0;
}

通過核心層的用戶管理去實現(xiàn)按id查找,還是其他查找方式,這里你總不能兩個函數(shù)解決吧,必須要分層

不能扯太遠(yuǎn),咱說的是鏈表,繼續(xù)..

雙鏈表的實現(xiàn),我之前發(fā)過一篇循環(huán)雙鏈表,有圖解,還算詳細(xì)

循環(huán)雙鏈表

這個雙鏈表還算可以,沒有內(nèi)存泄漏(如果有請告訴我,反正我也不會去改),各種判斷安全系數(shù)高,功能完善,能處理各種增刪改查功能的系統(tǒng)設(shè)計

核心層:用戶管理

啊~當(dāng)時想著用雙鏈表實現(xiàn)學(xué)生信息管理系統(tǒng)來著,碼著碼著就想把圖書信息管理系統(tǒng)也碼下來,比較學(xué)生信息管理系統(tǒng)已經(jīng)爛大街了,我上個學(xué)生信息管理系統(tǒng)在知乎都有2000贊了

#define STU 0
#define TEACHER 1

typedef enum Menu
{
Exit, Add, Show, Change, Delete, Search
}MENU;

typedef enum Sex
{
MAN, WOMAN
}SEX;

/*權(quán)限*/
enum RANK
{
READ_ONLY /*只讀*/
, WRITE /*讀寫*/
, ROOT /*root可刪除*/
};

/*學(xué)號、專業(yè)、姓名、年齡、性別屬性。*/

typedef struct deroy_data
{
char type; /*類型*/
char rank; /*級別*/
int id; /*編號*/
char name[10]; /*姓名*/
char sex; /*性別*/
int acount; /*賬號*/
char password[20]; /*密碼*/
void* data; /*其他*/
int(*Init)(struct deroy_data* pdata);
}deroy_data_t;
typedef deroy_data_t* deroy_data_pt;

沒什么特殊的,甚至用戶信息少的可憐,有點用處的就是權(quán)限了,然后看到deroy_data里面的void* data段了嗎,沒錯,我就是想告訴你們,這個是擴(kuò)展功能,可擴(kuò)展用戶的其他信息,這個我就不實現(xiàn)了,比較代碼多了,你們看著挺煩的

然后這個結(jié)構(gòu)體里面的函數(shù)指針,就相當(dāng)于C++里面的方法,可以指向一個功能函數(shù)

然后就和之前的學(xué)生信息管理系統(tǒng)差不多了~

/*學(xué)生信息管理系統(tǒng)*/
int system_proxy_stu(deroy_list_pt ptlist,int user_rank){
rank = user_rank;
while (1)
{
switch (menu_proxy_stu()) //菜單選擇
{
case Exit: //退出程序
system("cls");
printf("退出程序\n");
Quit();
return 1;
break;
case Show: //顯示所有學(xué)生信息
system("cls");
if (rank == READ_ONLY)
{
printf(" 類型\t學(xué)號\t姓名\t性別\t權(quán)限\n\n");
deroy_list_cuid(ptlist, proxy_find_stu);
}
else if(rank == ROOT)
{
printf(" 類型\t學(xué)號\t姓名\t性別\t權(quán)限\t賬號:\t密碼\n\n");
deroy_list_cuid(ptlist, proxy_find_all);
}
Quit();
break;
case Add: //添加學(xué)生信息
init_proxy_stu(ptlist);
Quit();
break;
case Change: //修改學(xué)生信息
proxy_stu_modify(ptlist);
Quit();
break;
case Delete: //刪除學(xué)生信息
proxy_stu_delete(ptlist);
Quit();
break;
case Search: //查詢學(xué)生信息
proxy_stu_find(ptlist);
Quit();
break;
}
system("cls");
}
}

把所有功能函數(shù)都實現(xiàn)了,并且功能函數(shù)都有權(quán)限設(shè)置,普通用戶只能查看普通用戶的信息

核心層:圖書管理

這個圖書管理實現(xiàn)的比用戶管理還簡單,我都沒去設(shè)置權(quán)限問題,可自行設(shè)計

typedef enum BookMenu
{
EXIT, ADD, SHOW, CHANGE, DELETE, SEARCH
}BOOKMENU;

/*圖書編號、書名、圖書分類、數(shù)量、出版日期、登記日期*/
typedef struct deroy_book
{
int iID; /*序號*/
char cId[4]; /*編號*/
char cName[20]; /*書名*/
char cSubject[20]; /*圖書分類*/
int iNums; /*數(shù)量*/
char cPublish_data[20];/*出版日期*/
char cData[20]; /*登記日期*/
int(*Init)(struct deroy_book* pdata); /*初始化函數(shù)*/
}deroy_book_t;
typedef deroy_book_t* deroy_book_pt;

簡簡單單的把基本的圖書信息給列舉出來,只需要實現(xiàn)功能函數(shù)即可

/*初始化圖書數(shù)據(jù)*/
static void init_book_proxy_node(deroy_book_pt self)/*注冊圖書*/static void register_book_proxy_method(deroy_list_pt ptlist, void* pdata)/*初始化圖書信息*/static void init_proxy_book(deroy_list_pt ptlist)/*菜單選擇*/static int menu_proxy_book()/*修改圖書信息*/static void proxy_book_modify(deroy_list_pt ptlist)/*刪除圖書信息*/static void proxy_book_delete(deroy_list_pt ptlist)/*查找圖書信息*/static void proxy_book_find(deroy_list_pt ptlist)/*圖書信息管理系統(tǒng)*/int system_proxy_book(deroy_list_pt ptlist)

這些個功能函數(shù)都挺簡單的,都是圍繞著之前設(shè)計的鏈表來實現(xiàn)的,詳情可以看原碼

這其實就是我將用戶管理的代碼復(fù)制過來,改void *data所指向的結(jié)構(gòu)體deroy_book,幾乎是一模一樣的,所以說這是個模板,是個框架,框架定死了,你圍繞著這個框架去實現(xiàn)功能就行

這里提個有趣的:就是圖書注冊日期,這里不用管理員去實現(xiàn),直接sprintf(self->cData, "%s", __DATE__);__DATE__是一個宏,打印的是當(dāng)前日期,打印的是年月日例如Jul 11 2020,這個宏我在C語言預(yù)處理那里提過,可惜看的人不多,

預(yù)處理

用戶登錄

首先主函數(shù)里面把兩個核心層給創(chuàng)建咯,

deroy_list_pt pStu_Head = deroy_list_create(); //創(chuàng)建用戶
deroy_list_pt pBook_Head = deroy_list_create(); //創(chuàng)建書籍

在創(chuàng)建用戶的時候會創(chuàng)建兩個用戶對象,一個root、一個普通read_only,用于初始登錄

登錄就是去調(diào)用函數(shù),接收函數(shù)的返回值

int user_rank = load(pStu_Head);
if (user_rank < 0)
{
printf("登錄失敗");
return 0;
}

這個返回值是用戶的權(quán)限,用來層級之間交互

int load(deroy_list_pt phead){
char account[20],password[20]; //賬號密碼
printf("input acount:");
scanf("%s", account);
printf("password:");
scanf("%s", password);
deroy_data_t temp;
temp.id = atoi(account);
deroy_data_pt find_data = deroy_list_find(&phead, &temp, proxy_compare_load);
if (find_data >= 0)
{
if (strcmp(password, find_data->password) == 0)
{
return find_data->rank;
}
}
return -1;
}

之而立直接調(diào)用鏈表提供的方法deroy_list_find,自己實現(xiàn)回調(diào)函數(shù)

int proxy_compare_load(deroy_data_pt pdata, deroy_data_pt other){
if (pdata->id == other->id)
return 1;
return 0;
}

為什么是找id而不是用戶名呢,這里我懶了一下,直接將id賦值給account,整數(shù)方便,圖個開心

「公眾號【編程學(xué)習(xí)基地】后臺發(fā)送關(guān)鍵字「圖書信息管理系統(tǒng)」獲取源代碼」

關(guān)鍵字【圖書管理系統(tǒng)】

End


作者:夢凡夢想在,終不凡~你們的在看就是對我最大的肯定,點個在看好嗎~編程學(xué)習(xí)基地常回基地看看

總結(jié)

以上是生活随笔為你收集整理的实现图书增删的代码_不仅仅是图书信息管理系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。