算法-单链表
单向链表
单向链表(单链表)是链表的一种,它由节点组成,每个节点都包含下一个节点的指针。
表头为空,表头的后继节点是"节点10"(数据为10的节点),"节点10"的后继节点是"节点20"(数据为10的节点),...
单链表删除节点
删除"节点30"
删除之前:"节点20" 的后继节点为"节点30",而"节点30" 的后继节点为"节点40"。
删除之后:"节点20" 的后继节点为"节点40"。
单链表添加节点
在"节点10"与"节点20"之间添加"节点15"
添加之前:"节点10" 的后继节点为"节点20"。
添加之后:"节点10" 的后继节点为"节点15",而"节点15" 的后继节点为"节点20"。
单链表分类:
按照有头无头(head),有头、无头
按照是否循环(loop), 循环,不循环
按照是否
单链表的特点是:节点的链接方向是单向的;相对于数组来说,单链表的的随机访问速度较慢,但是单链表删除/添加数据的效率很高。
下面是有头循环单链表的例子:
1 /* 2 * description: have head 3 * loop 4 * single list 5 *@istta 6 * Email: hcu5555@hotmail.com 7 */ 8 #include <stdio.h> 9 #include <stdlib.h> 10 #include "single_list.h" 11 12 void list_init(struct node_info * head_node_list) 13 { 14 head_node_list->next = head_node_list; //loop list; 15 head_node_list->type = 0; //set 0 is head_node; 16 } 17 18 void list_delate_one(struct node_info * head_node_list, struct node_info * node_one) 19 { 20 struct node_info * cur = NULL; 21 22 for(cur = head_node_list ; cur != NULL, cur->next != head_node_list; cur->next = cur) 23 { 24 if(cur->next == node_one) 25 { 26 cur->next = node_one->next; 27 node_one->next = NULL; 28 free(node_one); 29 break; 30 } 31 32 } 33 } 34 35 36 void list_add_head(struct node_info * head_node_list, item data) 37 { 38 struct node_info * new_node = NULL; 39 40 new_node= (struct node_info *)malloc(sizeof(struct node_info)); 41 if(new_node ==NULL ) 42 { 43 printf("%s malloc error\n", __FUNCTION__); 44 return ; 45 } 46 47 new_node->next = head_node_list->next; 48 head_node_list->next = new_node; 49 new_node->type = data; 50 dbg("add head %lu\n", data); 51 } 52 53 void list_add_tail(struct node_info * head_node_list, item data) 54 { 55 struct node_info * new_node =NULL; 56 57 new_node= (struct node_info *)malloc(sizeof(struct node_info)); 58 if(new_node ==NULL ) 59 { 60 printf("%s malloc error\n", __FUNCTION__); 61 return ; 62 } 63 64 struct node_info * cur = NULL; 65 66 for(cur =head_node_list->next; 67 cur != NULL && cur ->next != head_node_list; 68 cur = cur->next) 69 ; 70 71 dbg("%s, %d\n", __FUNCTION__, __LINE__); 72 if(cur != NULL) 73 { 74 dbg("%s, %d\n", __FUNCTION__, __LINE__); 75 new_node->next = head_node_list; 76 cur->next = new_node; 77 new_node->type = data; 78 } 79 80 81 } 82 83 int list_is_empty(struct node_info * head_node_list) 84 { 85 return head_node_list->next == head_node_list; 86 } 87 88 void list_destroy(struct node_info * head_node_list) 89 { 90 struct node_info * cur = NULL; 91 92 while(cur->next != head_node_list) 93 { 94 list_delate_one( head_node_list, head_node_list->next); 95 } 96 97 free(head_node_list); //free head node; 98 } 99 100 void list_for_each(struct node_info * node_head_list, void(* todo)(struct node_info * node_head_list, struct node_info * info)) 101 { 102 struct node_info * cur = NULL; 103 104 cur = node_head_list->next; 105 while(cur != node_head_list && cur != NULL) 106 { 107 todo(node_head_list, cur); 108 cur = cur->next; 109 } 110 } 111 112 void print_node(struct node_info * head_node_list, struct node_info * info) 113 { 114 printf("[%lu]", info->type); 115 } 116 117 void print_node_high(struct node_info * head_node_list, struct node_info * info) 118 { 119 printf("==%lu__\n", info->type); 120 }
1 #ifndef __SINGLE_LIST_H__ 2 #define __SINGLE_LIST_H__ 3 4 #ifdef cplusplus 5 extern "C" { 6 #endif 7 8 typedef size_t item; 9 10 struct node_info{ 11 item type; 12 struct node_info *next; 13 }; 14 15 #define DEBUG 16 17 #ifdef DEBUG 18 #define dbg(x...) printf(x) 19 #define err(x...) printf(x) 20 #else 21 #define dbg(x...) do{}while(0) 22 #define ERR_FLAG 1 23 #define err(x...) if(ERR_FLAG) printf(x) 24 #endif 25 26 void list_init(struct node_info * head_node_list); 27 void list_destroy(struct node_info *head_node_list); 28 void list_add_head(struct node_info *head_node_list, item data); 29 void list_add_tail(struct node_info * head_node_list, item data); 30 int list_is_empty(struct node_info *head_node_list); 31 void list_delate_one(struct node_info *head_node_list, struct node_info * node_one); 32 void list_for_each(struct node_info *head_node_list, void (*todo)(struct node_info *head_node_list, struct node_info *info)); 33 34 void print_node(struct node_info * head_node_list, struct node_info * info ); 35 void print_node_high(struct node_info *head_node_list, struct node_info *info); 36 37 #ifdef cplusplus 38 } 39 #endif 40 41 #endif
测试代码:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include "single_list.h" 4 5 int main(void) 6 { 7 // int i; 8 item i; 9 struct node_info* head_list = (struct node_info *)malloc(sizeof(struct node_info)); 10 11 list_init(head_list); 12 13 14 for(i=0; i<10 ;i++) 15 list_add_tail(head_list, i); 16 // list_add_head(head_list, i); 17 18 list_for_each( head_list , print_node_high); 19 printf("\n"); 20 21 22 return 0; 23 }
无头不循环链表
作者:issta hu
出处:http://www.cnblogs.com/hcu5555/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。