#define _crt_secure_no_warnings
#include
#include
#include
//節點結構體
struct linknode
;//鍊錶結構體
struct llist
;//取個別名
typedef
void
* linklist;
//鍊錶的初始化:返回鍊錶結構體
linklist init_linklist()
//插入
//第乙個引數相當於void* list,這樣使用者就無法修改堆區結構體資料
//這邊如果不用兩個指標一前一後移動來插入,要注意curnode指標的移動位置,不要讓其移到空位
void
insert_linklist
(linklist list,
int pos,
void
* data)
//指向當前節點
linknode* curnode =
&mylist->pheader;
//將curnode移到要插入位置的前驅節點
for(
int i =
0; i < pos; i++
)//找到位置後,進行插入操作
//將newnode指標指向使用者傳入的結構體首位址,獲取前四個位元組的資料
struct linknode* newnode =
(linknode*
)data;
newnode->next =
null
; newnode->next = curnode->next;
curnode->next = newnode;
//更新鍊錶長度
mylist->size++;}
//遍歷鍊錶
void
foreach_linklist
(linklist list,
void
(*print)
(void*)
)}//刪除指定位置的節點----有效資料下標從0開始
void
del_linklist
(linklist mylist,
int pos)
//記錄待刪除的節點
linknode* delnode = curnode->next;
curnode->next = delnode->next;
//free(delnode); 資料是使用者取管理釋放,因為不知道是開闢在棧區還是堆區
//delnode->next = null;
//更新鍊錶長度
list->size--;}
//按照值來刪除
void
del_linklist
(linklist mylist,
void
* data,
int(
*compare)
(void*,
void*)
)}}//清空鍊錶
void
clear_list
(linklist list)
mylist->pheader.next =
null
; mylist->size =0;
}//返回鍊錶的長度
intsize_list
(linklist list)
//銷毀鍊錶
void
destory_list
(linklist list)
struct person
;void
print
(void
* val)
intcompare
(void
* v1,
void
* v2)
return0;
}int
main()
; person p2 =
; person p3 =
;insert_linklist
(list,0,
&p1)
;insert_linklist
(list,-1
,&p2)
;insert_linklist
(list,10,
&p3)
;printf
("列印鍊錶結果如下:\n");
foreach_linklist
(list, print)
;printf
("\n按位置刪除鍊錶後:\n");
del_linklist
(list,2)
;foreach_linklist
(list, print)
;printf
("\n按值刪除鍊錶後:\n");
del_linklist
(list,
&p1, compare)
;foreach_linklist
(list, print)
;printf
("\n鍊錶的長度:%d\n"
,size_list
(list));
clear_list
(list)
;printf
("清空鍊錶結果如下:\n");
foreach_linklist
(list, print)
;printf
("\n鍊錶的長度:%d\n"
,size_list
(list));
destory_list
(list)
;printf
("\n鍊錶的長度:%d\n"
企業級API設計
最近對service的api設計,在team內有些討論,主要集中在api是足夠抽象 通用好呢,還是具體 易用好?其實這個是要折衷的,通用的好處是以後更改api的可能性小,但壞處是想要通用,裡面的字段就不能定義太死,不定義死,極端的例子是全部用name value pair,最通用,但client面對...
鍊錶的企業級應用之Linux核心鍊錶
在 linux 核心中,有大量的資料結構需要用到雙向鍊錶,例如程序 檔案 模組 頁面等。若採用雙向鍊錶的傳統實現方式,需要為這些資料結構維護各自的鍊錶,並且為每個鍊錶都 要設計插入 刪除等操作函式。因為用來維持鍊錶的 next 和 prev 指標指向對應型別的對 象,因此一種資料結構的鍊錶操作函式不...
iOS企業級架構設計
對於單獨的小型應用能處理好各部分的功能,處理好各部分分層的業務邏輯已經實屬不易。因為模組與模組之間的耦合不易拆除,隨著業務的增長,當初嚴格的劃分已經越來越不能滿足要求,模組開始變得異常膨脹,邏輯也異常的冗餘。乙個好的架構應該能解決這些棘手的問題,乙個好的架構的機制一旦被確定,就不應該輕易更改。對於乙...