一、迴圈鍊錶的定義:將單鏈表中最後乙個資料元素的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的查詢方式有兩種 查詢方法和查詢語句。查詢方法就...