企業級鍊錶設計思路

2021-10-20 17:16:04 字數 3004 閱讀 4433

#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企業級架構設計

對於單獨的小型應用能處理好各部分的功能,處理好各部分分層的業務邏輯已經實屬不易。因為模組與模組之間的耦合不易拆除,隨著業務的增長,當初嚴格的劃分已經越來越不能滿足要求,模組開始變得異常膨脹,邏輯也異常的冗餘。乙個好的架構應該能解決這些棘手的問題,乙個好的架構的機制一旦被確定,就不應該輕易更改。對於乙...