鍊錶 雙向迴圈鍊錶

2021-10-04 19:43:14 字數 2636 閱讀 5070

雙向迴圈鍊錶與單鏈表一樣,都是邏輯連續、物理不連續的儲存方式,但它的效果要遠遠優於單鏈表,其結構如下:

雙向迴圈鍊錶首先要有乙個頭節點,頭節點中不存放資料,真正的資料從頭節點的下乙個節點開始存放;然後每乙個節點都有兩個指標,分別指向前乙個節點和後乙個節點;最後頭尾相連,就成了雙向迴圈鍊錶。

#include

#include

typedef

int type;

typedef

struct node

node;

typedef

struct link

link;

//初始化

void

linkinit

(link* l)

;//建立節點

node*

createnode

(type data)

;//頭插

void

headpush

(link* l, type data)

;//尾插

void

tailpush

(link* l, type data)

;//在pos位置前插入

void

linkinsert

(node* pos, type data)

;//頭刪

void

headpop

(link* l)

;//尾刪

void

tailpop

(link* l)

;//刪除pos位置元素

void

linkdelete

(node* pos)

;//查詢

node*

linkfind

(link* l, type data)

;//列印

void

linkprint

(link* l)

;//銷毀

void

linkdestroy

(link* l)

;//初始化

void

linkinit

(link* l)

//建立節點

node*

createnode

(type data)

//頭插

void

headpush

(link* l, type data)

//尾插

void

tailpush

(link* l, type data)

//在pos位置前插入

void

linkinsert

(node* pos, type data)

//頭刪

void

headpop

(link* l)

/*node* cur = l->head->next;

node* next = cur->next;

l->head->next = next;

next->prev = l->head;

free(cur);*/

linkdelete

(l->head->next);}

//尾刪

void

tailpop

(link* l)

/*node* last = l->head->prev;

node* prev = last->prev;

l->head->prev = prev;

prev->next = l->head;

free(last);*/

linkdelete

(l->head->prev);}

//刪除pos位置元素

void

linkdelete

(node* pos)

node* next = pos->next;

node* prev = pos->prev;

prev->next = next;

next->prev = prev;

free

(pos);}

//查詢

node*

linkfind

(link* l, type data)

cur = cur->next;

}return

null;}

//列印

void

linkprint

(link* l)

printf

("\n");

}//銷毀

void

linkdestroy

(link* l)

free

(l->head)

; l->head =

null

;}

優點

比起單鏈表和順序表來說,執行插入刪除操作更加方便,時間複雜度均為o(1)

缺點不能像順序表那樣支援隨機訪問,結構較為複雜

沒有增容的問題,直接用乙個開乙個

適用場景

需要頻繁插入刪除元素

迴圈鍊錶,雙向鍊錶

迴圈鍊錶 迴圈鍊錶與順序鍊錶之間的區別 迴圈鍊錶最後乙個資料的next指標域不為空,而是指向頭結點,其他基本操作大體相同,只是在判斷表結束的條件變為判斷節點的引用域是否為頭引用 雙向鍊錶 author neosong date oct 10,2017 4 43 01 pm program of in...

雙向鍊錶和雙向迴圈鍊錶

和單向鍊錶相比,多了乙個前驅結點。如果他為空,那麼next和prior都指向自己。而對於雙迴圈鍊錶,只需要最後乙個元素的next指向head next,head next的prior指向最後乙個節點即可。新節點s插入鍊錶,s next給p結點,s prior給p prior,然後,p prior n...

迴圈鍊錶與雙向鍊錶

迴圈鍊錶 最後節點的next指標不指向null,直接改為指向首節點就行。迴圈列表不需要頭節點 include include includetypedef struct student lstudent,lpstudent void initlink lpstudent phead ptr next...