数据结构--双向链表的实现(内含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 }

 

posted @ 2022-03-08 14:02  怎因一双媚眼惹尘埃  阅读(99)  评论(0编辑  收藏  举报