首页 > 代码库 > 02 单链表

02 单链表

线性表之链式存储---单链表

技术分享

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 
  5 // 数据结构
  6 typedef struct node
  7 {
  8     int data;
  9     struct node *next;
 10 }linkList;
 11 
 12 // 创建单链表,并初始化
 13 linkList *linkList_init(void)
 14 {
 15     linkList *list = (linkList *)malloc(sizeof(linkList));
 16 
 17     if (list == NULL)
 18     {
 19         return NULL; 
 20     }
 21 
 22     list->next = NULL;
 23 
 24     return list;
 25 }
 26 
 27 // 添加到链表头
 28 int linkList_add_head(linkList *list, int data)
 29 {
 30     // 参数检查
 31     if (list == NULL)
 32     {
 33         return -1; 
 34     }
 35 
 36     linkList *node = (linkList *)malloc(sizeof(linkList));
 37     if (node == NULL)
 38     {
 39         return -2; 
 40     }
 41 
 42     node->data =http://www.mamicode.com/ data;
 43     node->next = list->next;
 44     list->next = node;
 45 
 46     return 0;
 47 }
 48 
 49 // 添加到链表尾 
 50 int linkList_add_tail(linkList *list, int data)
 51 {
 52     // 参数检查
 53     if (list == NULL)
 54     {
 55         return -1; 
 56     }
 57 
 58     linkList *node = (linkList *)malloc(sizeof(linkList));
 59     if (node == NULL)
 60     {
 61         return -2; 
 62     }
 63 
 64     node->data =http://www.mamicode.com/ data;
 65     node->next = NULL;
 66 
 67     // 找到最后一个节点
 68     linkList *tmp = NULL;
 69     for (tmp = list; tmp->next != NULL; tmp = tmp->next)
 70     {
 71         ;
 72     }
 73 
 74     tmp->next = node;
 75 
 76     return 0;
 77 }
 78 
 79 // 从头开始删除第一个节点,并保存到node中
 80 int linkList_del_head(linkList *list, linkList **node)
 81 {
 82     // 参数检查
 83     if (list == NULL || list->next == NULL)
 84     {
 85         return -1; 
 86     }
 87 
 88     *node = list->next;
 89 
 90     list->next = list->next->next;
 91 
 92     (*node)->next = NULL;
 93     return 0;
 94 }
 95 
 96 // 从尾部开始删除第一个节点,并保存到node中
 97 int linkList_del_tail(linkList *list, linkList **node)
 98 {
 99     // 参数检查
100     if (list == NULL || list->next == NULL)
101     {
102         return -1; 
103     }
104 
105     // 记录最后一个节点的前一个节点
106     linkList *tmp = NULL;
107     for (tmp = list; tmp->next->next != NULL; tmp = tmp->next)
108     {
109         ;
110     }
111 
112     *node = tmp->next;
113     (*node)->next = NULL;
114 
115     tmp->next = NULL;
116 
117     return 0;
118 }
119 
120 int linkList_printf(linkList *list)
121 {
122     // 参数检查
123     if (list == NULL || list->next == NULL)
124     {
125         return -1; 
126     }
127 
128     linkList *tmp = NULL;
129     for (tmp = list->next; tmp != NULL; tmp = tmp->next)
130     {
131         printf("%d-", tmp->data);
132     }
133     printf("\n");
134 
135     return 0;
136 }
137 
138 int linkList_destroy(linkList *list)
139 {
140     linkList *tmp = NULL;
141 
142     while (list != NULL)
143     {
144         tmp = list;
145         list = list->next;
146         free(tmp);
147         tmp = NULL;
148     }
149 
150     return 0;
151 }
152 
153 int main(void)
154 {
155     int i = 0;
156     linkList *list = NULL;
157     linkList *node = NULL;
158 
159     list = linkList_init();
160 
161     for (i = 0; i < 10; i++)
162     {
163         linkList_add_head(list, i); 
164     }
165 
166     linkList_printf(list);
167 
168     for (i = 0; i < 10; i++)
169     {
170         linkList_add_tail(list, i); 
171     }
172 
173     linkList_printf(list);
174 
175     linkList_del_head(list, &node);
176     printf("node:%d\n", node->data);
177     free(node);
178     node = NULL;
179 
180     linkList_printf(list);
181 
182     linkList_del_tail(list, &node);
183     printf("node:%d\n", node->data);
184     free(node);
185     node = NULL;
186 
187     linkList_printf(list);
188 
189     linkList_destroy(list);
190 
191     return 0;
192 }

 

02 单链表