//定義結點結構
typedef
struct dcnode
dcnode,
*dclinklist;
//鍊錶初始化
void
initdclinklist
(dclinklist plist)
plist->prior = plist ->next = plist;
}
為了實現以下插入,刪除等一系列操作,先封裝以下功能:
int
getlength
(dclinklist plist)
int length =0;
dclinklist p = plist->next;
while
(p != plist)
return length;
}
dclinklist findnode
(dclinklist plist,
int pos)
if(pos <0)
dclinklist p =plist;
while
(pos && p ->next != plist)
if(pos ==0)
return
null
;}
(
int val,dclinklist prior,dclinklist next)
s->data = val;
s->prior = prior;
s->next = next;
return s;
}
void
insert
(dclinklist plist,
int val,
int pos)
dclinklist p =
findnode
(plist,pos);if
(p ==
null
)//完成插入結點的銜接
dclinklist t =
(val ,p, p->next);if
(t ==
null
)//pos位置下乙個節點的prior和pos位置的next
p->next->prior = t;
p->next = t;
}
void
insert_head
(dclinklist plist,
int val)
void
insert_tail
(dclinklist plist,
int val)
dclinklist t =
(val ,plist->prior, plist);if
(t ==
null
) plist->prior->next = t;
plist->prior= t;
}
void
delete
(dclinklist plist,
int pos)
dclinklist p =
findnode
(plist,pos);if
(p == plist || p ==
null
) p->prior->next=p->next;
p->next->prior = p->prior;
free
(p);
}
void
delete_head
(dclinklist plist)
void
delete_tail
(dclinklist plist)if(
listempty
(plist)
)//鍊錶為空不需要刪除
dclinklist p = plist->prior;
p->prior->next=p->next;
p->next->prior = p->prior;
free
(p);
}
int
listempty
(dclinklist plist)
return0;
}
void
clear
(dclinklist plist)
while(!
listempty
(plist)
)}
void
show
(dclinklist plist)
dclinklist p = plist ->next;
while
(p != plist)
printf
("null\n");
}
資料結構 雙向迴圈帶頭結點鍊錶
前面我們寫過了不帶頭結點的單鏈表,由於沒有頭結點,在對單鏈表進行頭插 刪的時候需要傳入二級指標 在需要進行尾插 刪的時候,需要先根據頭指標找到頭結點,然後從頭往後遍歷找到最後乙個結點再進行相應操作。而我們今天要寫的雙向迴圈帶頭結點鍊錶,相對於不帶頭結點的單鏈表做增刪時,將會方便許多。typedef ...
資料結構C 描述 帶頭結點的雙向迴圈鍊錶
執行展示 鍊錶是線性表的一種實現形式,它的核心是指標,主要特點是增加與刪除不需要移動大量元素,查詢某一特定元素較慢,邏輯上相鄰的元素物理上不一定相鄰。鍊錶主要分為單鏈表,雙向鍊錶與迴圈鍊錶。每種鍊錶又可分為帶頭結點的和不帶頭結點的。本篇主要介紹帶頭結點的雙向迴圈鍊錶的基本操作。雙向迴圈鍊錶的每個結點...
資料結構 帶頭雙向迴圈鍊錶的實現
在實際工作中用雙向鍊錶又更多一點,因為雙向鍊錶比單鏈表效率更高,雙鏈表結構複雜,但是使用 實現以後會發現結構會帶來 很多優勢,實現反而簡單了 其實寫了單鏈表之後再看雙鏈表其實非常簡單,只不過就是多了乙個指標域而已,再沒有什麼特別難的地方.我們就直接上 吧 dlist.h pragma once in...