資料結構 雙向迴圈帶頭結點鍊錶

2021-08-28 04:53:27 字數 2283 閱讀 3300

前面我們寫過了不帶頭結點的單鏈表,由於沒有頭結點,在對單鏈表進行頭插/刪的時候需要傳入二級指標;在需要進行尾插/刪的時候,需要先根據頭指標找到頭結點,然後從頭往後遍歷找到最後乙個結點再進行相應操作。而我們今天要寫的雙向迴圈帶頭結點鍊錶,相對於不帶頭結點的單鏈表做增刪時,將會方便許多。

typedef

int datatype;

typedef

struct node

node;

node *createnode(datatype data)

void

linklistinit(node *hnode)

void print(const node *hnode)

}printf("--->hnode");

printf("\n");

}

void clear(node *hnode)

}void destroy(node *hnode)

其實雙向迴圈帶頭結點鍊錶的插入操作都是如出一轍的,都是僅需要更改插入/刪除結點的next&prev指標指向,以及前乙個結點的next和後乙個結點的prev下面以頭刪為例進行說明:

而雙向迴圈帶頭結點鍊錶的刪除操作比插入更加簡單,只需要變更前乙個結點的next和後乙個結點的prev,然後釋放掉該結點就ok

//頭插

void

pushfront(node *hnode, datatype

data)

//尾插

void

pushback(node *hnode, datatype

data)

//任意位置前插入,假設pos在鍊錶中

void

insert(node *pos, datatype

data)

而因為雙向迴圈帶頭結點鍊錶操作的便利性,可以將頭插/尾插通過insert來實現

void

pushfront_simplify(node *hnode, datatype

data)

void

pushback_simplify(node *hnode, datatype

data)

測試展示:

//頭刪

void popfront(node *hnode)

hnode->next = front->next;

front->next->prev = hnode;

free(front);

front->next =

null;

front->prev =

null;

}//尾刪

void popback(node *hnode)

back->prev->next = hnode;

hnode->prev = back->prev;

free(back);

back->next =

null;

back->prev =

null;

}//刪除任意位置,假設pos在鍊錶中

void erase(node *hnode, node *pos)

pos->prev->next = pos->next;

pos->next->prev = pos->prev;

free(pos);

pos->next =

null;

pos->prev =

null;

}

同樣,可以用erase實現頭刪/尾刪

void popfront_simplify(node *hnode)

void popback_simplify(node *hnode)

測試展示:

雙向迴圈帶頭節點鍊錶

include include struct dblnode typedef struct dblnode dblnode typedef struct dblnode dbllink void create link dbllink head 建立鍊錶 void create newnode db...

雙向迴圈帶頭結點鍊錶的常見操作

include dlist.h include malloc.h include assert.h include pdlnode buydlist dldatatype data pnewnode pnext null 剛開始給節點並不知道位置所以給null pnewnode ppre null ...

資料結構C 描述 帶頭結點的雙向迴圈鍊錶

執行展示 鍊錶是線性表的一種實現形式,它的核心是指標,主要特點是增加與刪除不需要移動大量元素,查詢某一特定元素較慢,邏輯上相鄰的元素物理上不一定相鄰。鍊錶主要分為單鏈表,雙向鍊錶與迴圈鍊錶。每種鍊錶又可分為帶頭結點的和不帶頭結點的。本篇主要介紹帶頭結點的雙向迴圈鍊錶的基本操作。雙向迴圈鍊錶的每個結點...