10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树
本节先对单向链表的学习(主要是使用代码进行实现)
1:单向链表的理论介绍:
链表原理如下图所示:
上面展示的是一个单链表的存储原理图,简单易懂,head为头节点,他不存放任何的数据,只是充当一个指向链表中真正存放数据的第一个节点的作用,而每个节点中都有一个next引用,指向下一个节点,就这样一节一节往下面记录,直到最后一个节点,其中的next指向null。
链表有很多种,比如单链表,双链表等等。我们就对单链表进行学习,其他的懂了原理其实是一样的。
(上面的理论也是粘贴复制的因为有太多的理论介绍了。)
2:单向链表的代码实现
1 #include <stdio.h> 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 }