算法-单链表

单向链表

单向链表(单链表)是链表的一种,它由节点组成,每个节点都包含下一个节点的指针。

单链表的示意图如下:

表头为空,表头的后继节点是"节点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 }
single_list.c
 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
single_list.h

测试代码:

 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 }
test.c

 

无头不循环链表

 

posted on 2014-04-02 11:59  hcu5555  阅读(233)  评论(0编辑  收藏  举报