算法和数据结构_13_小算法_双链表
Posted volcanol ---- View OF Linux Ca
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法和数据结构_13_小算法_双链表相关的知识,希望对你有一定的参考价值。
没什么新的内容,把自己写的练习代码贴出来,供大家批判。
1 /* 2 本程序用来测试非线性存储结构:双链表 3 */ 4 5 6 #include <stdio.h> 7 #include <stdlib.h> 8 9 10 //**************************************************0 11 // 定义双链表数据结构 12 struct dbllink 13 { 14 char data; 15 struct dbllink* preNode; 16 struct dbllink* postNode; 17 }; 18 19 typedef struct dbllink DBLLINK; 20 typedef DBLLINK* PDBLLINK; 21 //**************************************************1 22 23 24 25 //**************************************************0 26 // 定义BOOL数据类型 27 typedef enum {FALSE,TRUE} BOOL ; 28 //**************************************************1 29 30 31 32 //**************************************************0 33 // 定义申请存储空间宏 34 #define MALLOC(pNode,type,size) if(NULL== 35 (pNode=(type *)malloc(size*sizeof(type)))) 36 { 37 return FALSE; 38 } 39 //**************************************************1 40 41 42 43 //**************************************************0 44 // 定义申请表头宏 45 #define MALLOCH(pNode,type,size) if(NULL== 46 (pNode=(type *)malloc(size*sizeof(type)))) 47 { 48 return NULL; 49 }else 50 { 51 pNode->data=‘\0‘; 52 pNode->preNode=NULL; 53 pNode->postNode=NULL; 54 return pNode; 55 } 56 //**************************************************1 57 58 59 60 61 PDBLLINK CreateDblLink(void); 62 BOOL InitDblLink(PDBLLINK head,char element[]); 63 void EchoDblLink(PDBLLINK head); 64 PDBLLINK GetDblLinkEnd(PDBLLINK head); 65 PDBLLINK GetDblLinkEnd(PDBLLINK head); 66 BOOL AppendDblLink(PDBLLINK head,char element); 67 PDBLLINK SearchDblLink(PDBLLINK head,char element); 68 BOOL DenodeDblLink(PDBLLINK head,char element); 69 BOOL InsertDblLink(PDBLLINK head,char elePos,char element); 70 71 int main(int argc,char* argv[]) 72 { 73 PDBLLINK head; 74 75 head=CreateDblLink(); 76 if(head) 77 puts("Yes."); 78 79 if(InitDblLink(head,"hello world")) 80 EchoDblLink(head); 81 AppendDblLink(head,‘A‘); 82 EchoDblLink(head); 83 84 if(SearchDblLink(head,‘A‘)) 85 puts("Yes"); 86 else 87 puts("No"); 88 89 if(DenodeDblLink(head,‘l‘)) 90 EchoDblLink(head); 91 92 if(InsertDblLink(head,‘l‘,‘l‘)) 93 EchoDblLink(head); 94 95 getchar(); 96 getchar(); 97 return 0; 98 } 99 100 101 102 103 //**************************************************0 104 /* 105 函数功能: 106 创建双链表表头 107 函数原型 108 PDBLLINK CreateDblLink(void) 109 函数参数: 110 无 111 返回值: 112 创建成功返回表头指针,否则返回NULL 113 异常 114 无 115 */ 116 PDBLLINK CreateDblLink(void) 117 { 118 PDBLLINK head; 119 120 MALLOCH(head,DBLLINK,1); 121 } 122 //**************************************************1 123 124 125 126 127 //**************************************************0 128 /* 129 函数功能: 130 初始化双链表 131 函数原型: 132 BOOL InitDblLink(PDBLLINK head,char element[]) 133 函数参数: 134 PDBLLINK head: 链表头指针 135 char element[]:初始化字符串 136 返回值: 137 如果初始化成功,返回TRUE,否则返回FALSE 138 异常: 139 无 140 */ 141 BOOL InitDblLink(PDBLLINK head,char element[]) 142 { 143 PDBLLINK temp, 144 end; 145 int i; 146 147 if(!head) 148 { 149 return FALSE; 150 } 151 152 end=head; 153 for(i=0;element[i]!=0;i++) 154 { 155 MALLOC(temp,DBLLINK,1); 156 157 temp->data=‘\0‘; 158 temp->postNode =NULL; 159 temp->preNode=end; 160 161 end->data=element[i]; 162 end->postNode =temp; 163 end=end->postNode ; 164 } 165 return TRUE; 166 } 167 168 //**************************************************1 169 170 171 172 173 174 //**************************************************0 175 /* 176 函数功能: 177 打印链表 178 函数原型: 179 void EchoDblLink(PDBLLINK head) 180 函数参数: 181 PDBLLINK head:链表头指针 182 返回值: 183 无 184 异常: 185 无 186 */ 187 void EchoDblLink(PDBLLINK head) 188 { 189 PDBLLINK temp; 190 191 if(temp=head) 192 { 193 while(temp->postNode) 194 { 195 printf("%c",temp->data ); 196 temp=temp->postNode ; 197 } 198 putchar(‘\n‘); 199 return ; 200 } 201 else 202 { 203 return ; 204 } 205 } 206 //**************************************************1 207 208 209 210 211 //**************************************************0 212 /* 213 函数功能: 214 获取最后的节点 215 函数原型: 216 PDBLLINK GetDblLinkEnd(PDBLLINK head) 217 函数参数: 218 PDBLLINK head:链表头指针 219 返回值: 220 如果获取成功,则返回链表尾节点指针,否则返回NULL 221 异常: 222 无 223 */ 224 PDBLLINK GetDblLinkEnd(PDBLLINK head) 225 { 226 PDBLLINK temp; 227 if(!head) 228 { 229 return NULL; 230 } 231 232 if(head->postNode) 233 { 234 temp=head; 235 while(temp->postNode) 236 { 237 temp=temp->postNode; 238 } 239 return temp; 240 } 241 else 242 { 243 //仅有头指针 244 return head; 245 } 246 } 247 //**************************************************1 248 249 250 251 252 253 //**************************************************0 254 /* 255 函数功能: 256 在链表尾增加节点 257 函数原型: 258 BOOL AppendDblLink(PDBLLINK head,char element) 259 函数参数: 260 PDBLLINK head:链表头指针 261 char element: 要插入的字符 262 返回值: 263 如果增加成功,返回TRUE;否则返回FALSE 264 异常: 265 无 266 */ 267 BOOL AppendDblLink(PDBLLINK head,char element) 268 { 269 PDBLLINK end, 270 NewNode; 271 272 if(head) 273 { 274 end=GetDblLinkEnd(head); 275 276 MALLOC(NewNode,DBLLINK,1); 277 278 NewNode->data=‘\0‘; 279 NewNode->postNode=NULL; 280 NewNode->preNode =end; 281 282 end->data=element; 283 end->postNode=NewNode; 284 285 return TRUE; 286 } 287 else 288 { 289 return FALSE; 290 } 291 } 292 //**************************************************1 293 294 295 296 297 298 //**************************************************0 299 /* 300 函数功能: 301 查找指定元素 302 函数原型: 303 PDBLLINK SearchDblLink(PDBLLINK head,char element) 304 函数参数: 305 PDBLLINK head:链表头指针 306 char element: 要查找的字符 307 返回值: 308 如果增加成功,返回元素所在的节点指针;否则返回NULL 309 异常: 310 无 311 */ 312 PDBLLINK SearchDblLink(PDBLLINK head,char element) 313 { 314 PDBLLINK temp; 315 316 if(!head) 317 { 318 return NULL; 319 } 320 else 321 { 322 temp=head; 323 while(temp->postNode) 324 { 325 if(temp->data ==element) 326 return temp; 327 temp=temp->postNode ; 328 } 329 //如果遍历完毕,还没有返回,则查找失败 330 return NULL; 331 } 332 } 333 //**************************************************1 334 335 336 337 338 //**************************************************0 339 /* 340 函数功能: 341 删除指定字符所在的节点 342 函数原型: 343 BOOL DenodeDblLink(PDBLLINK head,char element) 344 函数参数: 345 PDBLLINK head:链表头指针 346 char element: 指定的字符 347 返回值: 348 如果删除成功,返回TRUE,否则返回FALSE; 349 异常: 350 无 351 */ 352 BOOL DenodeDblLink(PDBLLINK head,char element) 353 { 354 PDBLLINK temp, 355 DeNode; 356 357 if(NULL==head || head->postNode == NULL) 358 { 359 return FALSE; 360 } 361 362 temp=SearchDblLink(head,element); 363 364 if(temp==head) 365 { 366 DeNode=head; 367 head->postNode->preNode=NULL; 368 head=head->postNode=NULL; 369 370 DeNode->postNode=NULL; 371 372 return TRUE; 373 } 374 else 375 { 376 temp->preNode->postNode =temp->postNode; 377 temp->postNode->preNode=temp->preNode; 378 free(temp); 379 return TRUE; 380 } 381 } 382 //**************************************************1 383 384 385 386 387 388 //**************************************************0 389 /* 390 函数功能: 391 增加节点 392 1、如果指定的元素存在,则在指定元素之后增加 393 2、如果指定的元素不存在,则在最后增加 394 函数原型: 395 BOOL InsertDblLink(PDBLLINK head,char element) 396 函数参数: 397 PDBLLINK head:链表头指针 398 char elePos:指定的字符 399 char element: 要插入的字符 400 返回值: 401 如果增加成功,返回TRUE,否则返回FALSE; 402 异常: 403 无 404 */ 405 BOOL InsertDblLink(PDBLLINK head,char elePos,char element) 406 { 407 PDBLLINK temp, 408 NewNode; 409 410 if(NULL==head ) 411 { 412 return FALSE; 413 } 414 415 //如果仅有头节点,则必须插入到头节点之后 416 if(head->postNode == NULL) 417 { 418 MALLOC(NewNode,DBLLINK,1); 419 420 NewNode->data=‘\0‘; 421 NewNode->postNode=NULL; 422 NewNode->preNode=head; 423 424 head->data=element; 425 head->postNode=NewNode; 426 return TRUE; 427 } 428 429 temp=SearchDblLink(head,element); 430 MALLOC(NewNode,DBLLINK,1); 431 432 NewNode->data =element; 433 NewNode->postNode =temp->postNode; 434 NewNode->preNode=temp; 435 temp->postNode=NewNode; 436 return TRUE; 437 } 438 //**************************************************1
以上是关于算法和数据结构_13_小算法_双链表的主要内容,如果未能解决你的问题,请参考以下文章