数据结构---单向链表的实现(内含c代码,已调试,可用)


10 个数据结构:数组链表队列散列表二叉树跳表Trie 树

本节先对单向链表的学习(主要是使用代码进行实现

1:单向链表的理论介绍:

链表原理如下图所示:

  上面展示的是一个单链表的存储原理图,简单易懂,head为头节点,他不存放任何的数据,只是充当一个指向链表中真正存放数据的第一个节点的作用,而每个节点中都有一个next引用,指向下一个节点,就这样一节一节往下面记录,直到最后一个节点,其中的next指向null。

 链表有很多种,比如单链表,双链表等等。我们就对单链表进行学习,其他的懂了原理其实是一样的。

(上面的理论也是粘贴复制的因为有太多的理论介绍了。)

2:单向链表的代码实现

 1 #include 
 2 #include <malloc.h>
 3 #include <string.h>
 4 
 5 #define false 0
 6 #define true  1
 7 //单向链表
 8 typedef struct node{
 9     struct node * next;
10     int data;
11 }my_signal_list;
12 
13 //单向链表初始化
14 my_signal_list* init_signal_list(void)
15 {
16     //定义一个链表头指针
17     my_signal_list* list_head = NULL;
18 
19     //申请链表堆空间
20     list_head = (my_signal_list*)malloc(sizeof(my_signal_list));
21     if(NULL == list_head)
22     {
23         return NULL;
24     }
25 
26     memset(list_head, 0, sizeof(my_signal_list));
27     return list_head;
28 }
29 
30 //单向链表的插入(此处采用尾插法)
31 bool insert_signal_list(my_signal_list* list_head, int insert_data)
32 {
33     my_signal_list* tmp_list_ptr = NULL;
34     my_signal_list * insert_list_data = NULL;
35 
36     if(NULL == list_head)
37     {
38         return false;
39     }
40     tmp_list_ptr = list_head;
41 
42     while(NULL != tmp_list_ptr->next)
43     {
44         //获取最后一个节点
45         tmp_list_ptr = tmp_list_ptr->next;
46     }
47 
48     //申请链表节点堆空间
49     insert_list_data = (my_signal_list*)malloc(sizeof(my_signal_list));
50     if(NULL == list_head)
51     {
52         return false;
53     }
54 
55     insert_list_data->data = insert_data;
56     insert_list_data->next = NULL;
57     tmp_list_ptr->next = insert_list_data;
58     return true;
59 }
60 
61 //单向链表的插入(此处采用尾插法)
62 void print_signal_list(my_signal_list* list_head)
63 {
64     //申请一个临时的head指针。避免对head指针的直接操作,丢失头指针的位置
65     my_signal_list* tmp_list_ptr = NULL;
66 
67     tmp_list_ptr = list_head;
68     while(NULL != tmp_list_ptr && NULL != tmp_list_ptr->next)
69     {
70         //获取下一个节点
71         tmp_list_ptr = tmp_list_ptr->next;
72         printf("%d\n",tmp_list_ptr->data);
73     }
74     return;
75 }
76 int main(void)
77 {
78     //使用
79     my_signal_list * list_head = init_signal_list();
80     if(NULL != list_head)
81     {
82         insert_signal_list(list_head,2);
83         insert_signal_list(list_head,4);
84         insert_signal_list(list_head,5);
85         insert_signal_list(list_head,6);
86     }
87     print_signal_list(list_head);
88     return 0;
89 }