含有头结点双向循环链表
2017-05-21 18:36
288 查看
1 #include <stdio.h> /*含有头结点双向循环链表*/ 2 #include <stdlib.h> 3 4 #define T 1 5 #define F 2 6 7 typedef int ElementType; 8 typedef int Boolean; 9 10 struct Node 11 { 12 struct Node* prior; 13 ElementType value; 14 struct Node* next; 15 }; 16 17 typedef struct Node* node; 18 19 Boolean insert_tail(node head, ElementType value); /*尾插*/ 20 Boolean insert_head(node head, ElementType value); /*头插*/ 21 Boolean insert_index(node head, ElementType value, int index); /*指定位置插入新值*/ 22 Boolean delete_index(node head, int index); /*指定位置删除*/ 23 Boolean delete_value(node head, ElementType value); /*指定数据删除*/ 24 Boolean update_index(node head, ElementType value, int index); /*指定位置修改数据*/ 25 Boolean update_value(node head, ElementType old_value, ElementType new_value); /*将数据修改*/ 26 Boolean quary_index(node head, int index); /*指定位置察值*/ 27 Boolean quary_value(node head, ElementType value); /*指定数据的位置*/ 28 29 Boolean init(node* head); /*初始化*/ 30 int length(node head); /*除去头结点的总长度*/ 31 void printP(node head); /*前驱打印*/ 32 void printN(node head); /*后驱打印*/ 33 34 int main() 35 { 36 int i; 37 node head = NULL; 38 39 init(&head); 40 for (i = 0; i < 10; i++) 41 { 42 insert_head(head, i); 43 } 44 printN(head); 45 printP(head); 46 47 for (i = 0; i < 10; i++) 48 { 49 insert_tail(head, i); 50 } 51 printN(head); 52 printP(head); 53 printf("length = %d\n", length(head)); 54 55 insert_index(head, 99, 0); 56 insert_index(head, 99, 11); 57 insert_index(head, 99, length(head)); 58 printN(head); 59 printP(head); 60 61 delete_index(head, 0); 62 delete_index(head, 10); 63 delete_index(head, length(head)-1); 64 printN(head); 65 printP(head); 66 67 delete_value(head, 0); 68 printN(head); 69 printP(head); 70 71 update_index(head, 88 , 1); 72 update_index(head, 88 , length(head)-2); 73 printN(head); 74 75 update_value(head, 88 , 888); 76 printN(head); 77 78 quary_index(head, 1); 79 quary_index(head, length(head)-2); 80 81 quary_value(head, 88); 82 quary_value(head, 888); 83 84 return 0; 85 } 86 87 Boolean quary_index(node head, int index) 88 { 89 if (index < 0 || index > length(head)) 90 { 91 return F; 92 } 93 int i; 94 for (i = 0; i < index; i++) 95 { 96 head = head->next; 97 } 98 printf("find = %d index =%d\n", head->next->value, index); 99 100 return T; 101 } 102 103 Boolean quary_value(node head, ElementType value) 104 { 105 node temp = head; 106 int i = 0; 107 int count = 0; 108 while (temp->next != head) 109 { 110 if (temp->next->value == value) 111 { 112 i++; 113 printf("find = %d index = %d\n", value, count ); 114 } 115 count++; 116 temp = temp->next; 117 } 118 if (0 == i) 119 { 120 printf("no this value\n"); 121 } 122 return T; 123 } 124 125 Boolean update_index(node head, ElementType value, int index) 126 { 127 if (index < 0 || index > length(head)) 128 { 129 return F; 130 } 131 int i; 132 for (i = 0; i < index; i++) 133 { 134 head = head->next; 135 } 136 head->next->value = value; 137 138 return T; 139 } 140 141 Boolean update_value(node head, ElementType old_value, ElementType new_value) 142 { 143 node temp = head; 144 while (temp->next != head) 145 { 146 if (temp->next->value == old_value) 147 { 148 temp->next->value = new_value; 149 } 150 temp = temp->next; 151 } 152 return T; 153 } 154 Boolean delete_index(node head, int index) 155 { 156 if (index < 0 || index > length(head)) 157 { 158 return F; 159 } 160 int i; 161 for (i = 0; i < index; i++) 162 { 163 head = head->next; 164 } 165 166 node temp = head->next->next; 167 free(head->next); 168 head->next = temp; 169 temp->prior = head; 170 171 return 0; 172 173 } 174 175 Boolean delete_value(node head, ElementType value) 176 { 177 node temp = head; 178 while (temp->next != head) 179 { 180 if (temp->next->value == value) 181 { 182 node temp2 = temp->next->next; 183 free(temp->next); 184 temp->next = temp2; 185 temp2->prior = temp; 186 } 187 else 188 { 189 temp = temp->next; 190 } 191 } 192 return T; 193 } 194 195 Boolean insert_index(node head, ElementType value, int index) 196 { 197 node temp = head; 198 node newnode = (node)malloc(sizeof(struct Node)); 199 if (NULL == newnode) 200 { 201 return F; 202 } 203 if (index < 0 || index > length(head)) 204 { 205 return F; 206 } 207 newnode->value = value; 208 int i; 209 for (i = 0; i < index; i++) 210 { 211 temp = temp->next; 212 } 213 newnode->next = temp->next; 214 temp->next = newnode; 215 newnode->next->prior = newnode; 216 newnode->prior = temp; 217 218 return T; 219 220 } 221 222 Boolean insert_head(node head, ElementType value) 223 { 224 node newnode = (node)malloc(sizeof(struct Node)); 225 if (NULL == newnode) 226 { 227 return F; 228 } 229 newnode->value = value; 230 231 newnode->next = head->next; 232 head->next = newnode; 233 newnode->next->prior = newnode; 234 newnode->prior = head; 235 236 return T; 237 } 238 239 Boolean insert_tail(node head, ElementType value) 240 { 241 node newnode = (node)malloc(sizeof(struct Node)); 242 if (NULL == newnode) 243 { 244 return F; 245 } 246 newnode->value = value; 247 248 head->prior->next = newnode; 249 newnode->next = head; 250 newnode->prior = head->prior; 251 head->prior = newnode; 252 253 return T; 254 } 255 int length(node head) 256 { 257 int count = 0; 258 node temp = head; 259 while (temp->next != head) 260 { 261 count++; 262 temp = temp->next; 263 } 264 return count; 265 } 266 267 Boolean init(node* head) 268 { 269 node newnode = (node)malloc(sizeof(struct Node)); 270 if (NULL == newnode) 271 { 272 return F; 273 } 274 newnode->next = newnode; 275 newnode->prior = newnode; 276 277 *head = newnode; 278 279 return T; 280 } 281 282 void printP(node head) 283 { 284 node temp = head; 285 while (temp->prior != head) /*temp->prior->prior */ 286 { 287 printf("%d ", temp->prior->value); 288 temp = temp->prior; 289 } 290 printf("\n"); 291 292 } 293 void printN(node head) 294 { 295 node temp = head; 296 while (temp->next != head) /*temp->next->next */ 297 { 298 printf("%d ", temp->next->value); 299 temp = temp->next; 300 } 301 printf("\n"); 302 303 }
相关文章推荐
- 带有头结点的双向循环链表
- 数据结构:带头结点的双向循环链表
- 带头结点的双向循环链表
- 判断带头结点的双向循环链表L是否对称相等的算法
- 编写算法实现建立一个带头结点的含n个元素的双向循环链表H,并在链表H中的第i个位置插入一个元素e
- 雅虎面试题─将两个双向循环链表中data值相同的结点删除
- 双向循环链表的建立,插入,删除(不带头结点)
- 双向循环链表经典案例,20孩子报数,7的倍数或数字中含有7,不出声,数数的方向逆转
- C++模板实现双向循环链表(有带头结点)
- 设以带头结点的双向循环链表表示的线性表L=(a1,a2,……,an)。
- 带头结点的双向循环链表
- 【C++数据结构学习笔记---线性表】带头结点的双向循环链表
- 带表头结点的双向循环链表
- 线性表和带头结点的双向循环链表
- 带表头结点的双向循环链表
- 设以带头结点的双向循环链表表示的线性表L= (a1,a2,…,an),试写一时间复杂度O(n)的算法,将L改造为 (a1,a3,…,an,…,a4,a2)。
- 双向+头结点+循环的链表
- 带表头结点的双向循环链表
- 用模板实现顺序表和带头结点的双向循环链表
- 带表头结点的双向循环链表