迴圈鍊錶的實現

2021-09-26 08:52:01 字數 3686 閱讀 8185

1.標準的迴圈鍊錶與一般鍊錶多了個游標,多了3個游標操作函式。

2.迴圈鍊錶api的寫法與一般鍊錶大致一樣,只有0號節點的增加和刪除需要注意,還有一次節點的插入和最後乙個節點的刪除需要注意,刪除時光標的移動需要注意。

3.迴圈鍊錶相對於一般鍊錶並無多大效能上的增強,只是讓鍊錶解決約瑟夫問題十分方便。

circlelist.**件

#pragma once

#include "stdio.h"

#include "stdlib.h"

#include "string.h"

typedef void circlelist;

typedef struct _tag_circlelistnode

circlelistnode;

typedef struct _tag_circlelist

tcirclelist;

circlelist* circlelist_create();

int circlelist_destroy(circlelist* list);

int circlelist_length(circlelist* list);

void circlelist_clear(circlelist* list);

circlelistnode* circlelist_get(circlelist* list,int pos);

circlelistnode* circlelist_insert(circlelist* list, circlelistnode* node,int pos);

int circlelist_delete(circlelist* list,int pos);

circlelistnode* circlelist_deletenode(circlelist* list, circlelistnode* node);

circlelistnode* circlelist_reset(circlelist* list);

circlelistnode* circlelist_current(circlelist* list);

circlelistnode* circlelist_next(circlelist* list);

circlelist.c檔案

#include "circlelist.h"

circlelist* circlelist_create()

int circlelist_destroy(circlelist* list)

return 0;

}int circlelist_length(circlelist* list)

rlist = (tcirclelist*)list;

return rlist->length;

}void circlelist_clear(circlelist* list)

rlist = (tcirclelist*)list;

rlist->length = 0;

rlist->header.next = null;

rlist->slider = null;

return ;

}circlelistnode* circlelist_get(circlelist* list,int pos)

rlist = (tcirclelist*)list;

current = &(rlist->header);

for (i = 0;i < pos;i++)

return current->next;

}circlelistnode* circlelist_insert(circlelist* list, circlelistnode* node, int pos)

rlist = (tcirclelist*)list;

current = &(rlist->header);

for (i = 0; (i < pos) && (current->next != null); i++)

node->next = current->next;

current->next = node;

//若第一次插入節點

if (rlist->length == 0)

rlist->length++;

//若為頭插法

if (current == &(rlist->header))

return node;

}int circlelist_delete(circlelist* list, int pos)

rlist = (tcirclelist*)list;

current = &(rlist->header);

if (pos >= 0 && rlist->length > 0)

//若刪除第乙個元素

if (current == &(rlist->header))

//求要刪除的元素

node = current->next;

current->next = node->next;

rlist->length--;

//判斷鍊錶是否為空

if (last != null)

//若刪除的元素為游標所指的元素

if (rlist->slider == node)

//若刪除元素後鍊錶長度為0

if (rlist->length == 0)

}return 0;

}circlelistnode* circlelist_deletenode(circlelist* list, circlelistnode* node)

current = current->next;

} //如果ret找到,根據i去刪除

if (ret != null)

}return ret;

}circlelistnode* circlelist_reset(circlelist* list)

return ret;

}circlelistnode* circlelist_current(circlelist* list)

return ret;

}//把當前位置返回,並且游標下移

circlelistnode* circlelist_next(circlelist* list)

return ret;

}

main.c檔案

#include "circlelist.h"

struct value

;int main()

printf("\n");

for (i=0;iv);

} 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 0;

}

關於迴圈鍊錶概念,請看:

迴圈鍊錶的實現

模擬單鏈表的實現方法,這裡我用乙個簡單案例來實現一下迴圈鍊錶的基本功能 1.用前插法建立乙個迴圈鍊錶 假設依次放入 1,2,3,4,5,那麼其內部儲存方式應為 5,4,3,2,1 後插法我就不寫了,和前插法一樣的,只是儲存方式是正序,可以自己實現一下。2.在第1個位置插入 6 3.查詢 3和 7是否...

雙向迴圈鍊錶的實現

其實雙向迴圈鍊錶與單鏈表的區別在於每個節點的結構發生了改變,具體的說是,每個節點多了乙個指標域,用於指向上乙個節點。其他的如鍊錶物件就不需要進行改變了。新的節點類 class lnode def init self,elem 0,prev none,next none self.prev prev ...

迴圈鍊錶的簡單實現

這裡實現的是設定尾指標的迴圈鍊錶,並帶有頭節點。include include include typedef int celemtype using namespace std typedef struct cnode cnode,clinklist 初始化迴圈鍊錶,設立尾指標c bool ini...