zoukankan      html  css  js  c++  java
  • Doubly Linked List&DLL(双向链表)

    双向链表

    优点

    1. 可以从两个方向遍历链表(从前到后,从后到前);
    2. 删除节点方面效率很高(不像单链表和循环链表需要遍历链表);
    3. 可以插入元素在给定节点之前(单链表和循环链表只能插在给定节点后面,除了插在头结点之前);

    缺点

    1. 一个双向链表节点要存储两个指针,一个指向下一个节点next,一个指向上一个节点previous,耗费空间资源比较大相较于单链表和循环链表。(这个有XOR链表解决这个问题)
      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 
      4 struct node
      5 {
      6     int data;
      7     struct node * pre;
      8     struct node * next;
      9 };
     10 
     11 void push(struct node ** head_ref, int new_data)
     12 {
     13     struct node * new_node = (struct node *)malloc(sizeof(struct node));
     14     new_node->data = new_data;
     15     new_node->next = (*head_ref);
     16     new_node->pre = NULL;
     17     //如果链表不为空的话,将上一个头结点的pre指向新的头结点
     18     if(NULL != (*head_ref))
     19     {
     20         (*head_ref)->pre = new_node;
     21     }
     22 
     23     (*head_ref) = new_node;
     24 }
     25 void insertAfter(struct node * pre_node, int new_data)
     26 {
     27     if(NULL == pre_node)
     28     {
     29         printf("
    ERROR");
     30         return ;
     31     }
     32     struct node * new_node = (struct node *)malloc(sizeof(struct node));
     33 
     34     new_node->data = new_data;
     35 
     36     new_node->next = pre_node->next;
     37     pre_node->next = new_node;
     38 
     39     new_node->pre = pre_node;
     40     //如果pre_node不是尾节点的话
     41     if(NULL != new_node->next)
     42     {
     43         new_node->next->pre = new_node;
     44     }
     45 }
     46 void insertBefore(struct node * next_node, int new_data)
     47 {
     48     if(NULL == next_node)
     49     {
     50         printf("
    ERROR");
     51         return ;
     52     }
     53     struct node * new_node = (struct node *)malloc(sizeof(struct node));
     54 
     55     new_node->data = new_data;
     56     new_node->pre = next_node->pre;
     57     next_node->pre = new_node;
     58     new_node->next = next_node;
     59     //若果next_node不是头结点
     60     if(NULL != new_node->pre)
     61     {
     62         new_node->pre->next = new_node;
     63     }
     64 }
     65 void append(struct node ** head_ref, int new_data)
     66 {
     67     struct node * new_node = (struct node *)malloc(sizeof(struct node));
     68     struct node * last_node = (*head_ref);
     69     new_node->data = new_data;
     70     new_node->next = NULL;
     71 
     72     if(NULL == (*head_ref))
     73     {
     74         new_node->pre = NULL;
     75         (*head_ref) = new_node;
     76         return;
     77     }
     78     while(NULL != last_node)
     79     {
     80         last_node = last_node->next;
     81     }
     82     last_node->next = new_node;
     83     new_node->pre = last_node;
     84 }
     85 void deleteElement(struct node ** head_ref, struct node * del)
     86 {
     87     if(NULL == head_ref && NULL == del)
     88     {
     89         printf("
    ERROR");
     90         return ;
     91     }
     92     //若删除节点为头结点的next节点
     93     if((*head_ref)->next == del)
     94     {
     95         (*head_ref)->next = del->next;
     96         del->next->pre = (*head_ref);
     97     }
     98     //删除节点不是尾节点的时候
     99     if(NULL != del->next)
    100     {
    101         del->next->pre = del->pre;
    102     }
    103     //删除节点不是头结点的时候
    104     if(NULL != del->pre)
    105     {
    106         del->pre->next = del->next;
    107     }
    108 
    109     free(del);
    110 }
    111 void printList(struct node * node)
    112 {
    113     if(NULL == node)
    114     {
    115         printf("
    ERROR");
    116         return ;
    117     }
    118 
    119     struct node * last = NULL;
    120     printf("Traversal the list forward direction
    ");
    121     while(NULL != node)
    122     {
    123         printf("%d  ", node->data);
    124         last = node;
    125         node = node->next;
    126     }
    127     printf("
    Traversal the list reverse direction
    ");
    128     while(NULL != last)
    129     {
    130         printf("%d  ", last->data);
    131         last = last->pre;
    132     }
    133 }
    134 int main(void)
    135 {
    136     struct node * head = NULL;
    137 
    138     push(&head, 1);
    139     push(&head, 4);
    140     push(&head, 5);
    141     push(&head, 2);
    142 
    143     deleteElement(&head, head->next->next);
    144     printList(head);
    145 
    146     return 0;
    147 }

    感受颇多

  • 相关阅读:
    流程控制值while 循环
    编程语言和变量
    计算机1&操作系统硬件
    使用 Cygwin 在 Windows 中使用 Linux 命令
    windows系统安装mysql及导库
    linux报错 OSError: [Errno 24] Too many open files
    python3报错ModuleNotFoundError: No module named 'Queue'
    mac版本intellij idea默认快捷键
    mysql初设密码及允许远程访问
    PyCharm 图标 c、m、F、f、v、p 分别代表什么含义?
  • 原文地址:https://www.cnblogs.com/AI-Cobe/p/9348571.html
Copyright © 2011-2022 走看看