• 数据结构双向链表的实现(内含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 }
  • 相关阅读:
    【竞赛笔记】飞思卡尔智能车竞赛
    【实习笔记】智能广场健身设备总结
    RabbitMQ之安装
    数据结构与算法之队列
    joda-time时间操作组件
    JavaScript中的跨域问题
    数据结构与算法之链表
    Jedis集成到项目中
    ICMP协议和ping命令
    jedis的使用
  • 原文地址:https://www.cnblogs.com/Jlord/p/15980133.html
Copyright © 2020-2023  润新知