typedef
struct dulnode
dulnode,
*dulinklist;
//鍊錶初始化
void
initdulinklist
(dulinklist plist)
plist->prior = plist->next =
null
;}
為了實現以下插入,刪除等一系列操作,先封裝以下功能:
int
getlength
(dulinklist plist)
int length =0;
dulinklist p = plist->next;
while
(p !=
null
)return length;
}
dulinklist findnodeofpos
(dulinklist plist,
int pos)
dulinklist p = plist;
while
(pos && p !=
null
)return p;
}
(
int val,dulinklist prior,dulinklist next)
s->data = val;
s->prior = prior;
s->next = next;
return s;
}1.新節點的prior和next
2.pos位置下乙個節點的prior(特殊處理pos是最後乙個節點)
3.pos未知節點的next
int
insert
(dulinklist plist,
int val,
int pos)
if(pos <
0|| pos >
getlength
(plist)
) dulinklist p =
findnodeofpos
(plist, pos)
; dulinklist s =
(val, p, p->next);if
(s ==
null
)return-1
;if(p->next !=
null
) p->next = s;
return1;
}
int
insert_head
(dulinklist plist,
int val)
int
insert_tail
(dulinklist plist,
int val)
1.pos位置的前乙個節點的next
2.pos位置的後乙個結點的prior,如果pos是最後乙個結點,則不需要處理
3.將pos位置釋放
void
delete
(dulinklist plist ,
int pos)
dulinklist p =
findnodeofpos
(plist,pos);if
(p ==
null
|| p == plist)
return
; p->prior->next=p->next;
if(p->next !=
null
)free
(p);
}
void
delete_head
(dulinklist plist )
void
delete_tail
(dulinklist plist)
int
listempty
(dulinklist plist)
if(plist->next ==
null
)return0;
}
void
clear
(dulinklist plist)
while(!
listempty
(plist)
)}
void
show
(dulinklist plist)
dulinklist p = plist->next;
while
(p)printf
("null\n");
}
資料結構 帶頭結點鍊錶和不帶頭結點鍊錶操作比較
帶頭結點的鍊錶和不帶頭結點的鍊錶主要不同點在插入和刪除操作上。同時要注意,帶頭結點的鍊錶初始化操作時建立頭結點。下面我們來看一下 中的異同 include include includetypedef int elemtype typedef struct nodenode int insertla...
資料結構 帶頭結點的鍊錶操作
最近在學習資料結構,對鍊錶的理解也僅僅停留在書本上。現就鍊錶的手寫 記錄如下,新手上路避免不了錯誤的出現,還望批評指正。帶頭結點的優點 對帶頭結點對鍊錶進行以下的處理 帶頭結點與不帶頭結點的操作相類似,只是在考慮是否為空表上的處理略有差異 1 插入 頭插法 public void headadd s...
資料結構 雙向迴圈帶頭結點鍊錶
前面我們寫過了不帶頭結點的單鏈表,由於沒有頭結點,在對單鏈表進行頭插 刪的時候需要傳入二級指標 在需要進行尾插 刪的時候,需要先根據頭指標找到頭結點,然後從頭往後遍歷找到最後乙個結點再進行相應操作。而我們今天要寫的雙向迴圈帶頭結點鍊錶,相對於不帶頭結點的單鏈表做增刪時,將會方便許多。typedef ...