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 宁夏党性培训 www.ahganxun.cn * 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 ",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 }