控制雙端通用鍊錶

2021-07-09 03:20:29 字數 4652 閱讀 9262

心得體會:模組化程式設計,達到「高內聚,低耦合」,將.h檔案與.c檔案分開寫。不僅使程式模組更加清晰,而且程式的可重複利用率提高,暴露出介面,使開發者不用關心函式是怎麼實現的,只要呼叫就行

//工具函式的.h檔案

#ifndef _tools_h_

#define _tools_h_

#include

#include

#include

//工具類介面

void *malloc(size_t size);

void swap(void *a, void *b, int length);

#endif

//工具函式的具體實現.c檔案

#include "tools.h"

void *malloc(size_t size)

return result;}

void swap(void *a, void *b, int length)

//雙端鍊錶的函式實現的具體宣告.h檔案

#ifndef _dlist_h_

#define _dlist_h_

//   a \ esc j .   vim實用技巧

#define true     (1)

#define false    (0)

#define zero     (0)

#define only_one (1)

typedef unsigned char boolean;

typedef void (*print_func)(void *value);

//通用雙端鍊錶的節點資訊

typedef struct dlist_nodedlist_node;

//通用雙端鍊錶的控制資訊

typedef struct dlistdlist;

//通用雙端鍊錶的介面

dlist *init_dlist(void);    //雙端鍊錶的初始化

void destroy_dlist(dlist **dlist);    //雙端鍊錶的銷毀

boolean push_front(dlist *dlist, void *value);    //頭部插入

boolean push_back(dlist *dlist, void *value);    //尾部插入

boolean pop_front(dlist *dlist);    //頭部刪除

boolean pop_back(dlist *dlist);    //尾部刪除

boolean insert_prev(dlist *dlist, dlist_node *node, void *value);   //插入到鍊錶某個節點的前邊

boolean insert_next(dlist *dlist, dlist_node *node, void *value);   //插入到鍊錶某個節點的後邊

boolean remove_dlist_node(dlist *dlist, dlist_node *node, void **value);   //刪除某個節點

void    show_dlist(dlist *dlist, print_func print);    //顯示雙端鍊錶資訊

boolean get_front(dlist *dlist, void **value);   //得到第乙個節點資料域

boolean get_tail(dlist *dlist, void **value);   //得到最後乙個節點資料域

int get_dlist_count(dlist *dlist);   //得到鍊錶節點數量

#endif

//通用雙端鍊錶的具體實現的.c檔案

#include "dlist.h"

#include "tools.h"

static dlist_node *create_node(void);

static dlist_node *create_node(void)

//通用雙端鍊錶的介面

dlist *init_dlist(void)    //雙端鍊錶的初始化

void destroy_dlist(dlist **dlist)    //雙端鍊錶的銷毀

//先釋放鍊錶節點資訊,再釋放鍊錶控制資訊

////在釋放鍊錶節點資訊時,需要判斷是否釋放資料域所指向的空間

p_node = (*dlist)->head;

while((*dlist)->head != null)

free(p_node);

p_node = (*dlist)->head;}

free(*dlist);

*dlist = null;}

boolean push_front(dlist *dlist, void *value)    //頭部插入

//生成鍊錶節點

node = create_node();

node->data = value;

if(dlist->count == zero)else

dlist->count++;

return true;}

boolean push_back(dlist *dlist, void *value)    //尾部插入

node = create_node();

node->data = value;

//對鍊錶為空或非空區別處理

if(dlist->count == zero)else

dlist->count++;

return true;}

boolean pop_front(dlist *dlist)    //頭部刪除

p_node = dlist->head;

if(dlist->count == only_one)else

//在釋放節點資訊之前,先要判斷資料域的指向是否需要釋放

if(dlist->free != null)

free(p_node);

dlist->count--;

return true;}

boolean pop_back(dlist *dlist)    //尾部刪除

//讓p_node 指向最後乙個節點

p_node = dlist->tail;

if(dlist->count == only_one)else

if(dlist->free != null)

free(p_node);

dlist->count--;

return true;    }

boolean insert_prev(dlist *dlist, dlist_node *node, void *value)   //插入到鍊錶某個節點的前邊

//建立節點儲存value

p_node = create_node();

p_node->data = value;

//進行節點的插入

//1.當前鍊錶值有乙個節點

//2.一般情況(多個節點)

p_node->next = node;

p_node->prev = node->prev;

if(node->prev == null)else

node->prev = p_node;

dlist->count++;}

boolean insert_next(dlist *dlist, dlist_node *node, void *value)   //插入到鍊錶某個節點的後邊

boolean remove_dlist_node(dlist *dlist, dlist_node *node, void **value)   //刪除某個節點

void    show_dlist(dlist *dlist, print_func print)    //顯示雙端鍊錶資訊

printf("\n");

}  }

boolean get_front(dlist *dlist, void **value)   //得到第乙個節點資料域

if(value != null)

return true;}

boolean get_tail(dlist *dlist, void **value)   //得到最後乙個節點資料域

if(value != null)

return true;}

int get_dlist_count(dlist *dlist)   //得到鍊錶節點數量

return dlist->count;}

//主函式

#include "dlist.h"

#include

void print_int(void *value);

void print_int(void *value)

int main(int argc, char **argv)

;int length = sizeof(array) / sizeof(array[0]);

int i = 0;

for(i = 0; i < length; ++i)

show_dlist(dlist, print_int);   //顯示鍊錶資訊

destroy_dlist(&dlist);    //雙端鍊錶的銷毀

return 0;}

redis 雙端鍊錶

鍊錶作為陣列之外的一種常用序列抽象,是大多數高階語言的基本資料型別,因為c 語言本身不支援鍊錶型別,大部分c 程式都會自己實現一種鍊錶型別,redis 也不例外.雙端鍊錶的應用 雙端鍊錶作為一種通用的資料結構,在redis 內部使用得非常多 它既是redis 列表結構的底層實現之一,還被大量redi...

1 4雙端鍊錶

雙端鍊錶與普通單鏈表的區別在於既可以從鍊錶頭部開始遍歷,又可以從尾部開始遍歷,這就要求每個節點不僅有乙個後向指標,還要乙個前驅指標。節點資料結構定義如下 public class dlinknode public dlinknode public dlinknode t data 雙端鍊錶資料結構包...

鍊錶結構之雙端鍊錶

雙端鍊錶 雙端鍊錶與傳統鍊錶非常相似.只是新增了乙個屬性 即對最後乙個鏈結點的引用 如上圖所示 由於有著對最後乙個鏈結點的直接引用.所以雙端鍊錶比傳統鍊錶在某些方面要方便.比如在尾部插入乙個鏈結點.雙端鍊錶可以進行直接操作 但傳統鍊錶只能通過next節點迴圈找到最後鏈結點操作.所以雙端鍊錶適合製造佇...