資料結構學習 迴圈鍊錶的實現(非常詳細)

2021-08-14 12:53:53 字數 4089 閱讀 6987

今天我們來實現下迴圈鍊錶的相關演算法。lz今天非常用心的寫這個部落格,一切解釋說明都在**中。

認真寫篇部落格還是挺費時間的,但是寫部落格不但是對我們學習成長的乙個見證,而且會提高我們向別人解釋問題的能力對面試非常有幫助,分享也是一件非常快樂的事情嘛

下面貼**:

#define _crt_secure_no_warnings

#include #define error 0

#define ok 1

typedef int eletype;

/*迴圈鍊錶的結構和單鏈表結構一樣,不過對於單鏈表,每個結點只儲存了向後的指標,

到了尾標誌就停止了向後鏈的操作,這樣知道某個結點卻無法找到它的前驅結點。

將單鏈表中的終端點的指標由空指標改為指向頭結點,就使整個單鏈表形成乙個環,

這種頭尾相接的單鏈表稱為迴圈單鏈表,簡稱迴圈鍊錶。

*/typedef struct clinknode

clinknode,*clinklist;

/*初始化迴圈鍊錶

*/int initclinklist(clinklist *list)

int data = 0;

clinknode* target = null;

clinknode* head_node = null;

printf("請輸入結點資料,0代表結束初始化:\n");

//這裡採用使用者控制台輸入資料,你也可以隨機生成資料進行初始化

while (1)

/*判斷初始化的鍊錶有沒有結點

沒有結點 先建立頭結點 然後插入資料

有結點 將結點用尾插法插入到鍊錶中

最後 尾結點的 指標域 指向頭結點 這樣形成乙個環

*/if (*list == null)

*list = head;//鍊錶指向頭結點

clinknode* node = (clinknode*)malloc(sizeof(clinknode));

if (node == null)

node->data = data;

node->next = head;

head->next = node;

} else

node->data = data;

node->next = head_node;

target->next = node;//將新結點插入尾部

} }return ok;}/*

往鍊錶指定位置插入資料

list 迴圈鍊錶

loc 第loc位置插入元素,loc 從1 開始計數

data 插入元素的資料域

*/int insertclinknode(clinklist list,int loc, eletype data)

/* 這裡while迴圈比較難理解,我們拿 3個元素迴圈鍊錶 來講解

loc = 1 時 往第1個位置插入元素

不進入迴圈 node 指向頭結點 i == loc == 1 插入合法

loc = 2 時

node 指向 第1個結點,i = 2 跳出迴圈

loc = 3 時

node 指向 第1個結點,i = 2 迴圈繼續

node 指向 第2個結點,i = 3 跳出迴圈

loc = 4 時 注意:如果有3個元素 往第4位置插入元素 是合法!等於往鍊錶尾部插入元素。

node 指向 第1個結點,i = 2 迴圈繼續

node 指向 第2個結點,i = 3 迴圈繼續

node 指向 第3個結點,i = 4 跳出繼續

迴圈結束時 i==loc 才合法! 此時node 指向 第 loc-1 位置的結點

將 新結點的指標域 指向 第loc-1位置的後繼結點

將 第loc-1位置的指標域 指向 新結點,這樣新結點就插入到 迴圈鍊錶的 第loc位置了!

*/ /*

迴圈結束時 i==loc 才合法! 此時node 指向 第 loc-1 位置的結點

將 新結點的指標域 指向 第loc-1位置的後繼結點

將 第loc-1位置的指標域 指向 新結點,這樣新結點就插入到 迴圈鍊錶的 第loc位置了!

*/ if (i == loc)

new_node->data = data;

new_node->next = node->next;//新結點指標域 指向前驅結點的後繼結點

node->next = new_node;//將新結點加入鍊錶

} else

return ok;}/*

刪除指定結點,通過指標返回刪除結點的資料

*/int delclinknode(clinklist list,int loc, eletype* data)

//迴圈結束 node 指向 loc-1 位置 且 node 不能為尾結點,為什麼不能為尾結點?因為不能刪除 位置上沒有元素的結點!

if (i == loc && node->next != list)

return ok;}/*

展示迴圈鍊錶元素

*/int showclinklist(clinklist list)

clinknode* target = null;

printf("--------迴圈鍊錶元素------\n");

for (target = list->next; target != list; target = target->next)

printf("%d \t",target->data);

printf("\n");

return ok;}/*

獲取鍊錶元素個數

*/int lengthclinklist(clinklist list)

clinknode* target = null;

int length = 0;

for (target = list->next; target != list; target = target->next)

length++;

printf("迴圈鍊錶元素個數:%d\n", length);

return ok;}/*

獲取根據資料獲取結點的位置

*/int indexclinklist(clinklist list,int data)

clinknode* target = null;

int length = 0;

int index = -1;

for (target = list->next; target != list; target = target->next) }

if (index == -1)

else

return index;}/*

獲取第i個結點的資料內容

*/int indexofclinklist(clinklist list, int index)

clinknode* target = null;

int length = 0;

int data = -1;

for (target = list->next; target != list; target = target->next) }

if (index > length)

else

return data;

}int main(int argc, char *argv)

else if(flag == 2)

else if (flag == 3)

else if (flag == 4)

else if (flag == 5)

else if (flag == 6)

else if (flag == 7)

}return 0;

}

驗證結果截圖:

資料結構學習 鍊錶

將從下面4部分進行介紹 首先介紹鍊錶是什麼,然後介紹為什麼定義鍊錶,接著是鍊錶的分類,最後簡單介紹一下鍊錶結點的插入與刪除方法。首先,在介紹鍊錶之前,我們先介紹一下什麼是順序儲存結構。我們知道資料在計算機中的儲存就像貨物在倉庫中的儲存一樣,不但占用一定的空間,還要有乙個標示儲存位置的位址。計算機通過...

資料結構學習 鍊錶

由於不必須按順序儲存,鍊錶在插入的時候可以達到o 1 的複雜度,比另一種線性表順序表快得多,但是查詢乙個節點或者訪問特定編號的節點則需要o n 的時間,而線性表和順序表相應的時間複雜度分別是o logn 和o 1 使用鍊錶結構可以克服陣列鍊錶需要預先知道資料大小的缺點,鍊錶結構可以充分利用計算機記憶...

資料結構學習 鍊錶結構

儲存結構定義 struct node typedef struct node ptrtonode typedef ptrtonode list typedef ptrtonode position struct node 書寫 package thedatastructureaboutlinked ...