今天我們來實現下迴圈鍊錶的相關演算法。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 ...