迴圈鍊錶的理論知識與api的設計實現

2021-08-20 19:34:28 字數 3846 閱讀 2019

一、迴圈鍊錶的定義:將單鏈表中最後乙個資料元素的next指標指向第乙個元素。

二、迴圈鍊錶的操作:迴圈鍊錶擁有單鏈表的所有操作。

1. 建立鍊錶

2. 銷毀鍊錶

3. 獲取鍊錶的長度

4. 清空鍊錶

5. 獲取pos位置的元素

6. 插入元素到pos位置

7. 刪除pos位置的元素

三、游標的定義(新增的功能)

在迴圈鍊錶中可以定義乙個「當前指標」,通常將這個指標稱為游標,可以通過這個游標來遍歷迴圈鍊錶中的所有元素。

四、迴圈鍊錶的新操作

1. 獲取迴圈鍊錶當前游標指向的資料元素

2. 將游標重置指向鍊錶中的第乙個資料元素

3. 將游標移動指向到鍊錶中的下乙個資料元素

4. 直接指定刪除鍊錶中的某個資料元素

五、插入元素分析,分為第一次插入元素、普通位置插入和特殊位置插入(頭插、尾插)。

六、刪除元素分析

七、迴圈鍊錶的優缺點

優點:迴圈鍊錶在功能上比單鏈表強,迴圈鍊錶完全可以取代單鏈表,迴圈鍊錶可以高效的遍歷表中的元素。

缺點:**實現的複雜度提高了

八、迴圈鍊錶的典型應用

約瑟夫問題:n 個人圍成乙個圓圈,首先第 1 個人從 1 開始乙個人乙個人順時針報數,報到第 m 個人,令其出列。然後再從下乙個人開始從 1 順時針報數,報到第 m 個人,再令其出列,…,如此下去,求出列順序。

九、迴圈鍊錶的api設計

//標頭檔案

#ifndef _zch_circlelist_h_

#define _zch_circlelist_h_

typedef void circlelist //資料封裝

//迴圈鍊錶的指標域

typedef struct _tag_circlelistnode

circlelistnode;

circlelist* create();

void destroy(circlelist* list);

void clear(circlelist* list);

int length(circlelist* list);

int insert(cieclelist* list, circlelistnode* node, int pos);

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

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

//增加功能

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

circlelistnode* reset(circlelist* list);

circlelistnode* current(circlelist* list);

circlelistnode* next(circlelist* list);

#endif

十、迴圈鍊錶api的實現

#include "zch_circlelist.h"

//迴圈鍊錶的抽象

typedef struct _tag_circlelist

tcirclelist;

circlelist* create()

clist->length = 0;

clist->header.next = null;

clist->slider = null;

return clist;

}void destroy(circlelist* list)

free(list);

}void clear(circlelist* list)

clist->length = 0;

clist->hender.next = null;

clist->slider = null;

}int length(circlelist* list)

return clist->length;

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

if(pos >= clist->length)

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

node->next = current->next;

current->next = node;

//若是第一次插入節點

if(clist->length == 0)

clist->length++;

//若是頭插法

if(current == (circlelistnode*)clist)

return 0;

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

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

return current->next;

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

//若刪除第乙個元素

if(current == (circlelistnode*)clist)

//先將要刪除的元素儲存下來

ret = current->next;

current->next = ret->next;

clist->length--;

//頭刪

if(last)

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

if(clist->slider == ret)

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

if(clist->length == 0)

}return ret;

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

current = current->next;

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

if(ret != null)

}return ret;

}circlelistnode* reset(circlelist* list)

return ret;

}circlelistnode* current(circlelist* list)

return ret;

}circlelistnode* next(circlelist* list)

return ret;

}

Linq的理論知識

前面的部落格中寫到過關於linq的一些知識,但是,沒有詳細的說linq,本篇部落格將會說一下linq。linq是乙個概念,它實現了資料查詢使用同一方式,即,它使我們程式設計師通過使用它,來實現用同一方式操作不同的資料來源 資料庫,集合,xml檔案 linq的查詢方式有兩種 查詢方法和查詢語句。查詢方...

堆疊的理論知識

堆和棧的理論知識 1.申請方式 棧 由系統自動分配和 例如,宣告在函式中的乙個區域性變數int b,系統自動在棧中為b開闢空間。堆 需要程式設計師自己申請,並指明大小,在c語言中用malloc等函式申請。例如 p1 char malloc 10 sizeof char 在c 中使用new運算子進行,...

Linq的理論知識

前面的部落格中寫到過關於linq的一些知識,可是,沒有具體的說linq,本篇部落格將會說一下linq。linq是乙個概念,它實現了資料查詢使用同一方式,即,它使我們程式猿通過使用它,來實現用同一方式操作不同的資料來源 資料庫,集合,xml檔案 linq的查詢方式有兩種 查詢方法和查詢語句。查詢方法就...