迴圈鍊錶最合適的乙個場景就是約瑟夫問題
#ifndef _circlelist_h_
#define _circlelist_h_
typedef void circlelist;
/*typedef struct _tag_circlelistnode circlelistnode;
struct _tag_circlelistnode;*/
typedef struct _tag_circlelistnode
circlelistnode;
circlelist* circlelist_create();
void circlelist_destroy(circlelist* list);
void circlelist_clear(circlelist* list);
int circlelist_length(circlelist* list);
int circlelist_insert(circlelist* list, circlelistnode* node, int pos);
circlelistnode* circlelist_get(circlelist* list, int pos);
circlelistnode* circlelist_delete(circlelist* list, int pos);
//add
circlelistnode* circlelist_deletenode(circlelist* list, circlelistnode* node);
circlelistnode* circlelist_reset(circlelist* list);
circlelistnode* circlelist_current(circlelist* list);
circlelistnode* circlelist_next(circlelist* list);
#endif
#include #include #include "circlelist.h"
typedef struct _tag_circlelist
tcirclelist;
circlelist* circlelist_create() // o(1)
ret->length = 0;
ret->header.next = null;
ret->slider = null;
return ret;
}void circlelist_destroy(circlelist* list) // o(1)
free(list);
}void circlelist_clear(circlelist* list) // o(1)
slist->length = 0;
slist->header.next = null;
slist->slider = null;
}int circlelist_length(circlelist* list) // o(1)
ret = slist->length;
return ret;
}int circlelist_insert(circlelist* list, circlelistnode* node, int pos) // o(n)
//if( ret )
//current->next 0號節點的位址
node->next = current->next; //1
current->next = node; //2
//若第一次插入節點
if( slist->length == 0 )
slist->length++;
//若頭插法
if( current == (circlelistnode*)slist )
}return ret;
}circlelistnode* circlelist_get(circlelist* list, int pos) // o(n)
//if( (slist != null) && (pos >= 0) && (slist->length > 0) )
ret = current->next;
} return ret;
}circlelistnode* circlelist_delete(circlelist* list, int pos) // o(n)
//若刪除第乙個元素
if( current == (circlelistnode*)slist )
//求要刪除的元素
ret = current->next;
current->next = ret->next;
slist->length--;
//判斷鍊錶是否為空
if( last != null )
//若刪除的元素為游標所指的元素
if( slist->slider == ret )
//若刪除元素後,鍊錶長度為0
if( slist->length == 0 )
}return ret;
}circlelistnode* circlelist_deletenode(circlelist* list, circlelistnode* node) // o(n)
current = current->next;
} //如果ret找到,根據i去刪除
if( ret != null )
}return ret;
}circlelistnode* circlelist_reset(circlelist* list) // o(1)
return ret;
}circlelistnode* circlelist_current(circlelist* list) // o(1)
return ret;
}circlelistnode* circlelist_next(circlelist* list) // o(1)
return ret;
}
#include #include #include "circlelist.h"
struct value
;void main()
printf("\n");
//重置游標
circlelist_reset(list);
while( circlelist_length(list) > 0 )
pv = (struct value*)circlelist_current(list);
printf("%d\n", pv->v);
circlelist_deletenode(list, (circlelistnode*)pv);
} circlelist_destroy(list);
system("pause");
return ;
}
雙向迴圈鍊錶的學習總結
雙向迴圈鍊錶有兩個指標節點,乙個指向前驅,乙個指向後繼,可以向前和向後訪問任何資料。實現建立 刪除 新增 輸出雙向迴圈鍊錶的資料的c語言 雙向鍊錶的建立及插入乙個資料及輸出所有的資料 include includestruct node t node int main int ar char arg...
迴圈鍊錶,雙向鍊錶
迴圈鍊錶 迴圈鍊錶與順序鍊錶之間的區別 迴圈鍊錶最後乙個資料的next指標域不為空,而是指向頭結點,其他基本操作大體相同,只是在判斷表結束的條件變為判斷節點的引用域是否為頭引用 雙向鍊錶 author neosong date oct 10,2017 4 43 01 pm program of in...
鍊錶之迴圈鍊錶
單向鍊錶 鍊錶之單向鍊錶 迴圈鍊錶是單向鍊錶的變化形式。單向鍊錶的尾部的指標域是空的,而迴圈鍊錶的尾部指標是指向鍊錶的頭結點的,其結構如圖一所示。圖 一循 環鏈表結 構圖一 迴圈鍊錶結構 圖一迴圈鍊錶 結構從上面結構可以看出,迴圈鍊錶的節點形成了乙個圈。在進行遍歷時,可以從任意節點開始。如果記錄了尾...