演算法精解 C語言描述 鍊錶 迴圈鍊錶的實現與分析

2021-08-10 15:48:57 字數 1679 閱讀 1666

同單鏈表相似,迴圈鍊錶中的每個元素也包含兩個部分:乙個資料域指標和乙個指向後繼元素的next指標。

資料結構clistelmt代表迴圈鍊錶中的單獨元素。該結構體擁有兩個成員,如上面所述。

資料結構clist代表迴圈鍊錶。這個結構體同單鏈表相似,但它不包含tail成員。

/*clist.h*/

#ifndef clist_h

#define clist_h

#include /*定義迴圈鍊錶中元素的資料結構*/

typedef struct clistelmt_

clistelmt;

/*定義迴圈鍊錶的資料結構*/

typedef struct clist_

clist;

/*public inte***ce*/

void clist_init(clist *list,void (*destroy)(void *data));

void clist_destroy(clist *list);

int clist_ins_next(clist *list,clistelmt *element,const void *data);

int clist_rem_next(clist *list,clistelmt *element,void **data);

#define clist_size(list)((list)->size)

#define clist_head(list)((list)->head)

#define clist_data(element)((element)->data)

#define clist_next(element)((element)->next)

#endif // clist_h

介面定義的相關描述,請參閱迴圈鍊錶介面定義

/*clist.c*/

#include #include #include "clist.h"

/*clist_init 初始化迴圈鍊錶*/

void clist_init(clist *list,void (*destroy)(void *data))

/*clist_destroy 銷毀迴圈鍊錶*/

void clist_destroy(clist *list)

}/*鍊錶不允許再有任何操作,清空鍊錶結構*/

memset(list,0,sizeof(clist));

return ;

}/*clist_ins_next  向迴圈鍊錶中插入元素*/

int clist_ins_next(clist *list,clistelmt *element,const void *data)

else

/*變更鍊錶的元素數量*/

list->size++;

return 0;

}/*clist_rem_next  移除鍊錶中的元素*/

int clist_rem_next(clist *list,clistelmt *element,void **data)

else

/*釋放空間*/

free(old_element);

/*變更鍊錶中元素的數量*/

list->size--;

return 0;

}

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

前面對單鏈表和雙鏈表的定義和抽象資料型別進行簡單的介紹。下面介紹另外一種鍊錶,迴圈鍊錶。他提供了一種更靈活的遍歷鍊錶元素的能力,迴圈鍊錶可以是單向的也可以是雙向的。區分鍊錶是迴圈鍊錶的主要看他最後乙個元素的next指標是不是指向的頭元素 或者說 如果乙個鍊錶沒有尾部元素則是迴圈鍊錶 下面是以單向鍊錶...

演算法精解(三) C語言描述(鍊錶常見問題)

如果兩個單鏈表相交,那應該呈 y 字形,則交點之後的節點是相同的。所以判斷是否相交,只需看兩個鍊錶的最後乙個節點是否為同乙個即可。假設兩個單鏈表的長度分別為l1 l2 l1 l2 則 l1 l2 的值就是交匯之前兩個鍊錶的長度差 因此,只有讓更長的鍊錶先走l1 l2步,然後兩個鍊錶開始一起走,如果某...

靜態鍊錶 C語言描述

靜態鍊錶 1.下標為0的游標存放最後存放資料節點的游標,即是第乙個沒有存放元素 備用鍊錶 的下標 2.最後乙個的節點存放第乙個由數值得下標 3.第乙個和最後乙個都不存放資料 即是備用鍊錶的第乙個的下標 4.最後乙個儲存資料的節點的游標為0 靜態鍊錶主要是根據游標來遍歷,以前沒有指標用的思想 假如我要...