数据结构--双向链表的实现(内含c代码,已调试,可用)
10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树
本节先对双向向链表的学习(主要是使用代码进行实现)
1:双向链表的理论介绍:
链表原理如下图所示:
双链表是链表的一种,由节点组成,每个数据结点中都有两个指针,分别指向直接后继和直接前驱。
(上面的理论也是粘贴复制的因为有太多的理论介绍了。主要是为了记录自己代码实现,增加成就感,O(∩_∩)O哈哈~)
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 struct node * pre; 11 int data; 12 }my_doubly_list; 13 14 //双向链表初始化 15 my_doubly_list* init_signal_list(void) 16 { 17 //定义一个链表头指针 18 my_doubly_list* list_head = NULL; 19 20 //申请链表堆空间 21 list_head = (my_doubly_list*)malloc(sizeof(my_doubly_list)); 22 if(NULL == list_head) 23 { 24 return NULL; 25 } 26 27 memset(list_head, 0, sizeof(my_doubly_list)); 28 list_head->next = NULL; 29 list_head->pre = NULL; 30 return list_head; 31 } 32 33 //双向链表的插入(此处采用头插法) 34 bool insert_signal_list(my_doubly_list* list_head, int insert_data) 35 { 36 my_doubly_list* tmp_list_ptr = NULL; 37 my_doubly_list * insert_list_data = NULL; 38 39 if(NULL == list_head) 40 { 41 return false; 42 } 43 tmp_list_ptr = list_head; 44 45 //申请链表节点堆空间 46 insert_list_data = (my_doubly_list*)malloc(sizeof(my_doubly_list)); 47 if(NULL == list_head) 48 { 49 return false; 50 } 51 52 if(NULL == list_head->next) 53 { 54 //头插法 55 insert_list_data->data = insert_data; 56 insert_list_data->pre = tmp_list_ptr; 57 insert_list_data->next = tmp_list_ptr->next; 58 tmp_list_ptr->next = insert_list_data; 59 } 60 else 61 { 62 my_doubly_list* tmp_next_ptr = list_head->next; 63 //先把后面的节点指向我们新增的节点的位置上 64 tmp_next_ptr->pre = insert_list_data; 65 66 //在将我们的新节点指向头结点之后的节点; 67 insert_list_data->next = tmp_list_ptr->next; 68 //再把新节点pre指向头结点 69 insert_list_data->pre = tmp_list_ptr; 70 71 //再把头结点指向新增的节点。 72 tmp_list_ptr->next = insert_list_data; 73 74 //最后吧数值复制 75 insert_list_data->data = insert_data; 76 } 77 78 return true; 79 } 80 81 //单向链表的插入(此处采用尾插法) 82 void print_signal_list(my_doubly_list* list_head) 83 { 84 //申请一个临时的head指针。避免对head指针的直接操作,丢失头指针的位置 85 my_doubly_list* tmp_list_ptr = NULL; 86 87 tmp_list_ptr = list_head; 88 while(NULL != tmp_list_ptr && NULL != tmp_list_ptr->next) 89 { 90 //获取下一个节点 91 tmp_list_ptr = tmp_list_ptr->next; 92 printf("%d\n",tmp_list_ptr->data); 93 } 94 return; 95 } 96 int main(void) 97 { 98 //使用 99 my_doubly_list * list_head = init_signal_list(); 100 if(NULL != list_head) 101 { 102 insert_signal_list(list_head,2); 103 insert_signal_list(list_head,4); 104 insert_signal_list(list_head,5); 105 insert_signal_list(list_head,6); 106 insert_signal_list(list_head,8); 107 } 108 print_signal_list(list_head); 109 return 0; 110 }