C語言單迴圈鍊錶的表示與實現例項詳解

2022-10-07 10:51:08 字數 2564 閱讀 6415

1.概述:

對於乙個迴圈鍊錶來說,其首節點和末節點被連線在一起。這種方式在單向和雙向鍊錶中皆可實現。要轉換乙個迴圈鍊錶,可以選擇開始於任意乙個節點然後沿著列表的任一方向直到返回開始的節點。再來看另一種方法,迴圈鍊錶可以被視為「無頭無尾」。這種列表很利於節約資料儲存快取, 假定你在乙個列表中有乙個物件並且希望所有其他物件迭代在乙個非特殊的排列下。

指向整個列表的指標可以被稱作訪問指標。

用單向鍊錶構建的迴圈鍊錶

迴圈鍊錶中第乙個節點之前就是最後乙個節點,反之亦然。迴圈鍊錶的無邊界使得在這樣的鍊錶上設計演算法會比普通鍊錶更加容易。對於新加入的節點應該是在第乙個節點之前還是最後乙個節點之後可以根據實際要求靈活處理,區別不大(詳見下面例項**)。當然,如果只會在最後插入資料(或者只會在之前),處理也是很容易的。

另外有一種模擬的迴圈鍊錶,就是在訪問到最後乙個節點之後的時候,手工的跳轉到第乙個節點。訪問到第乙個節點之前的時候也一樣。這樣也可以實現迴圈鍊錶的功能,在直接用迴圈鍊錶比較麻煩或者可能會出現問題的時候可以用。

2.程式實現:

/* c2-2.h 線性表的單鏈表儲存結構 */

struct lnode

; typedef struct lnode *linklist; /* 另一種定義linklist的方法 */

/* bo2-4.c 設立尾指標的單迴圈鍊錶(儲存結構由c2-2.h定義)的12個基本操作 */

status initlist_cl(linklist *l)

status destroylist_cl(linklist *l)

free(*l);

*l=null;

return ok;

} status clearlist_cl(linklist *l) /* 改變l */

(*l)->next=*l; /* 頭結點指標域指向自身 */

return ok;

} status listempty_cl(linklist l)

int listlength_cl(linklist l)

return i;

} status getelem_cl(linklist l,int i,elemtype *e)

*e=p->data; /* 取第i個元素 */

return ok;

} int locateelem_cl(linklist l,elemtype e,status(*compare)(elemtype,elemtype))

return 0;

} status priorelem_cl(linklist l,elemtype cur_e,elemtype *pre_e)

p=q;

q=q->next;

} return false;

} status nextelem_cl(linklist l,elemtype cur_e,elemtype *next_e)

p=p->next;

} return false;

} status listinsert_cl(linklist *l,int i,elemtype e) /* 改變l */

s=(linklist)malloc(sizeof(str lnode)); /* 生成新結點 */

s->data=e; /* 插入l中 */

s->next=p->next;

p->next=s;

if(p==*l) /* 改變尾結點 */

*l=s;

return ok;

} status listdelete_cl(linklist *l,int i,elemtype *e) /* 改變l */

q=p->next; /* q指向待刪除結點 */

p->next=q->next;

*e=q->data;

if(*l==q) /* 刪除的是表尾元素 */

*l=p;

free(q); /* 釋放待刪除結點 */

return ok;

} status listtr**erse_cl(linklist l,void(*vi)(elemtype))

printf("\n");

return ok;

}/* main2-4.c 單迴圈鍊錶,檢驗bo2-4.c的主程式 */

#include"c1.h"

typedef int elemtype;

#include"c2-2.h"

#include"bo2-4.c"

status compare(elemtype c1,elemtype c2)

void visit(elemtype c)

void main()

else

printf("刪除不成功!\n");

printf("清空l:%d(1: 成功)\n",clearlist_cl(&l));

printf("清空l後,l是否空:%d(1:空 0:否)\n",listempty_cl(l));

printf("銷毀l:%d(1: 成功)\n",destroylist_cl(&l));

}本文標題: c語言單迴圈鍊錶的表示與實現例項詳解

本文位址:

單迴圈鍊錶 C語言

include include typedef int elemtype typedef int status typedef struct node listnode typedef listnode linklist 初始化單向迴圈鍊錶 void initlist linklist l 判斷單向...

c語言單迴圈鍊錶

ifndef sclist h define sclist h include include include define elemtype int typedef struct node node,pnode typedef struct list list node buynode elemt...

單向迴圈鍊錶的表示與實現(C語言)

include include 單向迴圈鍊錶的表示與實現 該鍊錶帶頭結點head typedef int elemtype typedef struct nodeslink 建立鍊錶 slink creasclink int n p next head return head 遍歷鍊錶 slink ...