心得體會:模組化程式設計,達到「高內聚,低耦合」,將.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節點迴圈找到最後鏈結點操作.所以雙端鍊錶適合製造佇...