前面對單鏈表和雙鏈表的定義和抽象資料型別進行簡單的介紹。下面介紹另外一種鍊錶,迴圈鍊錶。他提供了一種更靈活的遍歷鍊錶元素的能力,迴圈鍊錶可以是單向的也可以是雙向的。區分鍊錶是迴圈鍊錶的主要看他最後乙個元素的next指標是不是指向的頭元素(或者說 :如果乙個鍊錶沒有尾部元素則是迴圈鍊錶)。下面是以單向鍊錶來介紹。
//
// clist.c
// algorithms&data_structures
//// created by ttc on 15-2-2.年//
#include
"clist.h"
#include
#include
//o(1)
void
clist_init(
clist
*clist,
void
(*destroy)(
void
*data))
//o(n)
void
clist_destroy(
clist
*clist)
}//clist
清除memset
(clist, 0,
sizeof
(clist
));}
/* 1: insert
操作*/
/* 插入成功返回
0 ,反之返回
-1 */
/* 將元素插入由
list
指標的迴圈鍊錶中
element
之後,當插入空煉表中時
,element
可能指向
任何位置,為了避免混淆
,element
此時應該設定為
null
。新的元素包含乙個指向
data
的指標,
因此只要該元素仍在鍊錶中,
data
所引用的記憶體空間就應該保持合法
.由呼叫者負責管理
data
所引用的儲存空間.*/
/* o(1)*/
intclist_ins_next(
clist
*clist,
clistelmt
*element,
const
void
*data)
new_element->
data
= (void
*)data;
//空表時候插入操作if(
clist_size
(clist) == 0)
else
//size
自增clist->
size
++;return0;}
/* 1: remove
操作:將移除由引數
list
指定的迴圈表中
element
後面的元素
。2:
返回時候
data
指向已經
移除元素中儲存的資料
3: 由呼叫者負責管理於
data
想關聯的記憶體(儲存空間)
*//*
刪除成功返回
0 ,反之返回
-1 */
/* o(1)*/
intclist_rem_next(
clist
*clist,
clistelmt
*element,
void
**data)
*data = element->
next
->
data;//
自己指向自己
(鍊錶中只有乙個元素的情況)if
(element->
next
== element)
else
}free
(old_element);
clist->
size
--;return0;}
void
cprint_list(
const
clist
*clist)
while
(element !=
clist_head
(clist));}}
演算法精解 C語言描述 鍊錶 迴圈鍊錶的實現與分析
同單鏈表相似,迴圈鍊錶中的每個元素也包含兩個部分 乙個資料域指標和乙個指向後繼元素的next指標。資料結構clistelmt代表迴圈鍊錶中的單獨元素。該結構體擁有兩個成員,如上面所述。資料結構clist代表迴圈鍊錶。這個結構體同單鏈表相似,但它不包含tail成員。clist.h ifndef cli...
鍊錶演算法四之迴圈鍊錶
前面介紹了單鏈表的一些練習題,本節介紹迴圈鍊錶,顧名思義,肯定得迴圈起來,就是表中的最後乙個結點的指標指向頭結點,使整個鍊錶形成乙個環。根據前面單鏈表中介紹的頭插法和尾插法,稍微思考一下,就知道再迴圈鍊錶中應該選擇用尾插法這種方式來建立迴圈鍊錶,因為尾插法每次都是在鍊錶的末尾插入新的元素。和原來的尾...
迴圈鍊錶,雙向鍊錶
迴圈鍊錶 迴圈鍊錶與順序鍊錶之間的區別 迴圈鍊錶最後乙個資料的next指標域不為空,而是指向頭結點,其他基本操作大體相同,只是在判斷表結束的條件變為判斷節點的引用域是否為頭引用 雙向鍊錶 author neosong date oct 10,2017 4 43 01 pm program of in...