通用雙向鏈表的特色算法
鏈表每一個節點佔用一塊內存。頻繁增刪,雙向鏈表容易形成內存碎片
app
雙向鏈表增刪數據,只須要修改先後元素的指針設計
某些高級排序算法在鏈表中表現很差,使用基本的排序算法便可指針
雙向鏈表只能使用順序查找
code
二)通用雙向鏈表接口設計
排序
/*************************dlist.h***********************************/ #include <stdio.h> #ifndef DLIST_H #define DLIST_H #ifdef __cplusplus extern "C" { #endif/*__cplusplus*/ typedef enum _DListRet { DLIST_RET_OK, DLIST_RET_OOM, DLIST_RET_STOP, DLIST_RET_INVALID_PARAMS, DLIST_RET_FAIL }DListRet; struct _DList; typedef struct _DList DList; typedef void (*DListDataDestroyFunc)(void* ctx, void* data); typedef int (*DListDataCompareFunc)(void* ctx, void* data); typedef DListRet (*DListDataVisitFunc)(void* ctx, void* data); DList* dlist_create(DListDataDestroyFunc data_destroy, void* data_destroy_ctx); DListRet dlist_insert(DList* thiz, size_t index, void* data); DListRet dlist_prepend(DList* thiz, void* data); DListRet dlist_append(DList* thiz, void* data); DListRet dlist_delete(DList* thiz, size_t index); DListRet dlist_get_by_index(DList* thiz, size_t index, void** data); DListRet dlist_set_by_index(DList* thiz, size_t index, void* data); size_t dlist_length(DList* thiz); int dlist_find(DList* thiz, DListDataCompareFunc cmp, void* ctx); DListRet dlist_foreach(DList* thiz, DListDataVisitFunc visit, void* ctx); void dlist_destroy(DList* thiz); #define return_if_fail(p) if(!(p)) \ {printf("%s:%d Warning: "#p" failed.\n", \ __func__, __LINE__); return;} #define return_val_if_fail(p, ret) if(!(p)) \ {printf("%s:%d Warning: "#p" failed.\n",\ __func__, __LINE__); return (ret);} #ifdef __cplusplus } #endif/*__cplusplus*/ #endif/*DLIST*/