啥是循環鏈表:
循環鏈表是一種鏈式的存儲結構,與單鏈表不同的是,循環鏈表的最后一個結點的指針是指向該循環鏈表的第一個結點或者頭結點,從而構成一個環形的鏈。
循環鏈表的運算與單鏈表的運算基本一致,所不同的有以下幾點:
- 在建立一個循環鏈表時,必須使其最后一個結點的指針指向表頭結點,而不是像單鏈表那樣置為NULL。此種情況還使用於在最后一個結點后插入一個新的結點。
- 在判斷是否到表尾時,是判斷該結點指針域的值是否是表頭結點,當指針域等於表頭指針時,說明已到表尾。而非像單鏈表那樣判斷鏈域值是否為NULL。
思路:
就是跟單鏈表插入沒啥區別,就是注意如果是頭尾插入,需要保持最后一個結點指向頭結點。
1 #include <iostream> 2 #include <cstdlib> 3 using namespace std; 4 #define NULL 0 5 typedef struct ListNode* CList; 6 struct ListNode { 7 int data; 8 CList next; 9 }; 10 11 //創建空循環鏈表 12 CList Create() { 13 CList L; 14 L = (CList)malloc(sizeof(ListNode)); 15 L->next = L; 16 return L; 17 } 18 19 //尋找第k個與元素 20 CList FindKth(CList L, int k) { 21 CList p = L; 22 int i = 1; 23 while (p->next != L && i < k) { 24 p = p->next; 25 i++; 26 } 27 if (i == k) 28 return p; 29 else 30 return NULL; 31 } 32 33 //插入 34 void InsertKth(CList L, int k, int item) 35 { 36 CList tmp = (CList)malloc(sizeof(ListNode)); 37 tmp->data = item; 38 //如果在第一個位置插入 39 if (k == 1) { 40 tmp->next = L->next; 41 L->next = tmp; 42 } 43 else { 44 CList node;//當前第k-1個結點 45 node=FindKth(L, k - 1); 46 if (!node) { 47 cout << "結點錯誤"; 48 return; 49 } 50 tmp->next = node->next; 51 node->next = tmp; 52 } 53 }