??????? 學(xué)習(xí)一個(gè)月c語言后所接觸的第一個(gè)項(xiàng)目,用ubuntu系統(tǒng)自帶的vim編寫的。作為之前只用過windows圖形界面的小白,使用linux操作系統(tǒng)還是略顯生疏,不過在編寫過一個(gè)相對(duì)完整的項(xiàng)目后,對(duì)終端的操作也變得駕輕就熟。
以下是項(xiàng)目的一些基本要求:
系統(tǒng)功能示例
需求:
1. 對(duì)用戶的管理:
對(duì)用戶鏈表的增、刪、改、查。
用戶能夠注冊(cè)、登陸、充值、查看個(gè)人信息、注銷
2. 對(duì)發(fā)行記錄的管理:
對(duì)發(fā)行記錄鏈表的增、查。
管理員能夠發(fā)行彩票、查詢發(fā)行的記錄
3. 對(duì)購(gòu)買記錄的管理:
對(duì)購(gòu)買記錄鏈表的增、查。
用戶能夠添加購(gòu)買記錄、查看購(gòu)買記錄
為了養(yǎng)成良好習(xí)慣,盡管項(xiàng)目相對(duì)簡(jiǎn)單,我仍然建立了工程目錄及makefile文件。

鏈表設(shè)立
首先確定了需要建立三條鏈表 分別儲(chǔ)存用戶信息、彩票購(gòu)買記錄、發(fā)行的彩票信息。
三個(gè)結(jié)構(gòu)體的定義:


鏈表結(jié)構(gòu)體的定義
我編寫了一條 雙向循環(huán)的通用鏈表 通過傳入三個(gè)結(jié)構(gòu)體生成了三條鏈表來保存數(shù)據(jù)。

其中 void* data 來指向所保存的數(shù)據(jù),因?yàn)閿?shù)據(jù)均為結(jié)構(gòu)體故在內(nèi)存空間是連續(xù)的,int size 表示這段數(shù)據(jù)的大小。通過不確定類型的指針void* 和 長(zhǎng)度 可以儲(chǔ)存不同類型的結(jié)構(gòu)體。
通用鏈表的功能實(shí)現(xiàn)
注釋解析:?? // 功能 / 傳入?yún)?shù) / 返回值

通過需要保存的結(jié)構(gòu)體大小size,來創(chuàng)建一條新的鏈表。將size的值傳入鏈表,為以后添加節(jié)點(diǎn)做準(zhǔn)備。

添加節(jié)點(diǎn)的函數(shù)中調(diào)用了兩次calloc,分別為節(jié)點(diǎn)和值域在堆上申請(qǐng)了空間。
由于是雙向循環(huán) 我這里使用了尾插法 要注意這里節(jié)點(diǎn)鏈接指針的賦值順序。30~34的順序不可更改。

這里通過額外傳入一個(gè)打印函數(shù)的指針來確定鏈表中數(shù)據(jù)的打印方式。

因?yàn)橹懊總€(gè)節(jié)點(diǎn)都調(diào)用了 兩次calloc, 故釋放的時(shí)候也需要調(diào)用兩次free分別對(duì)節(jié)點(diǎn)指針 和 值域指針進(jìn)行內(nèi)存釋放。

相對(duì)于一般鏈表這里需要 傳入一個(gè)比較函數(shù) 來確定節(jié)點(diǎn)內(nèi)部數(shù)據(jù)的比較方法。

刪除與查找類似 依賴于傳入的比較函數(shù),還有不能忘記對(duì)77,78行對(duì)鏈接指針的修改。

由于鏈表為雙向循環(huán)的,因此使用快速排序的方法。而且相對(duì)于選擇排序和冒泡排序,快速排序時(shí)間復(fù)雜度更低。
通過對(duì)鏈表內(nèi)部的值域指針的交換,達(dá)到數(shù)據(jù)排序的目的。

運(yùn)用了c語言的文件讀寫,將鏈表中數(shù)據(jù)部分保存至 指定路徑的 二進(jìn)制文件。

加載時(shí)注意退出時(shí)要釋放未使用的空間。(124~129行)

以上就是我針對(duì)該項(xiàng)目的鏈表建立。