1.標準的迴圈鍊錶與一般鍊錶多了個游標,多了3個游標操作函式。
2.迴圈鍊錶api的寫法與一般鍊錶大致一樣,只有0號節點的增加和刪除需要注意,還有一次節點的插入和最後乙個節點的刪除需要注意,刪除時光標的移動需要注意。
3.迴圈鍊錶相對於一般鍊錶並無多大效能上的增強,只是讓鍊錶解決約瑟夫問題十分方便。
circlelist.**件
circlelist.c檔案#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);
main.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;
}
關於迴圈鍊錶概念,請看:#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...