同單鏈表相似,迴圈鍊錶中的每個元素也包含兩個部分:乙個資料域指標和乙個指向後繼元素的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 靜態鍊錶主要是根據游標來遍歷,以前沒有指標用的思想 假如我要...