C 演算法精介 鍊錶 迴圈鍊錶

2021-06-28 13:20:49 字數 2236 閱讀 1609

前面對單鏈表和雙鏈表的定義和抽象資料型別進行簡單的介紹。下面介紹另外一種鍊錶,迴圈鍊錶。他提供了一種更靈活的遍歷鍊錶元素的能力,迴圈鍊錶可以是單向的也可以是雙向的。區分鍊錶是迴圈鍊錶的主要看他最後乙個元素的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...