迴圈鍊錶的學習

2021-07-14 05:15:03 字數 3492 閱讀 9440

迴圈鍊錶最合適的乙個場景就是約瑟夫問題

#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...

鍊錶之迴圈鍊錶

單向鍊錶 鍊錶之單向鍊錶 迴圈鍊錶是單向鍊錶的變化形式。單向鍊錶的尾部的指標域是空的,而迴圈鍊錶的尾部指標是指向鍊錶的頭結點的,其結構如圖一所示。圖 一循 環鏈表結 構圖一 迴圈鍊錶結構 圖一迴圈鍊錶 結構從上面結構可以看出,迴圈鍊錶的節點形成了乙個圈。在進行遍歷時,可以從任意節點開始。如果記錄了尾...