zoukankan      html  css  js  c++  java
  • 19 双向链表

    1,创建一个双向链表,并初始化赋值

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 typedef struct Link {
     5     int data;
     6     struct Link* prior;
     7     struct Link* next;
     8 }link;
     9 
    10 
    11 link* initLink(link* headNode) {
    12     headNode = (link*)malloc(sizeof(link)); //头结点
    13     headNode->prior = NULL;
    14     headNode->next = NULL;
    15     headNode->data = -1; //头结点的数据域给值是 -1
    16 
    17     link* headNode2 = headNode; //复制一个头结点
    18 
    19     for (int i = 1; i <= 5; i++) {
    20         link* new_node= (link*)malloc(sizeof(link));
    21         new_node->data = i;
    22 
    23         new_node->prior = headNode2;
    24         headNode2->next = new_node;
    25         new_node->next = NULL;
    26 
    27         headNode2 = new_node;
    28     }
    29 
    30     return headNode;
    31 }
    32 
    33 void showLink(link* headNode) {
    34     link* temp = headNode;
    35     while (temp!=NULL) {
    36         printf("%d  ", temp->data);
    37         temp = temp->next;
    38     }
    39     printf("
    ");
    40 }
    41 
    42 void main() {
    43     link* head_node = NULL; 
    44     head_node = initLink(head_node); //获取经过初始化后的双向链表的头结点
    45     printf("初始化双向链表是:
    ");
    46     showLink(head_node);
    47     printf("链表中第 2个节点的直接前驱是:%d", head_node->next->next->prior->data);
    48 }

     2,在指定结点前插入一个结点:(这里直接是第三个结点前插入一个结点)

     1 //双向链表在指定结点前插入一个结点,这里在第三个结点前插入
     2 #include <stdio.h>
     3 #include <stdlib.h>
     4 
     5 typedef struct Link {
     6     int data;
     7     struct Link* prior;
     8     struct Link* next;
     9 }link;
    10 
    11 
    12 link* initLink(link* headNode) {
    13     headNode = (link*)malloc(sizeof(link)); //头结点
    14     headNode->prior = NULL;
    15     headNode->next = NULL;
    16     headNode->data = -1;
    17 
    18     link* headNode2 = headNode; //复制一个头结点
    19 
    20     for (int i = 1; i <= 5; i++) {
    21         link* new_node= (link*)malloc(sizeof(link));
    22         new_node->data = i;
    23 
    24         new_node->prior = headNode2;
    25         headNode2->next = new_node;
    26         new_node->next = NULL;
    27 
    28         headNode2 = new_node;
    29     }
    30 
    31     return headNode;
    32 }
    33 
    34 void  insertNode(link* headNode,int num) {
    35     link* node2 = headNode->next->next;
    36     link* node3 = headNode->next->next->next;
    37     link* new_node = (link*)malloc(sizeof(link));
    38     new_node->data = num;
    39 
    40     new_node->prior = node2;
    41     node2->next = new_node;
    42     new_node->next = node3;
    43     node3->prior = new_node;
    44 }
    45 
    46 void showLink(link* headNode) {
    47     link* temp = headNode;
    48     while (temp!=NULL) {
    49         printf("%d  ", temp->data);
    50         temp = temp->next;
    51     }
    52     printf("
    ");
    53 }
    54 
    55 void main() {
    56     link* head_node = NULL; 
    57     head_node = initLink(head_node); //获取经过初始化后的双向链表的头结点
    58     printf("初始化双向链表是:
    ");
    59     showLink(head_node);
    60 
    61     printf("在第三个结点前插入99后的链表是:
    ");
    62     insertNode(head_node, 99);
    63     showLink(head_node);
    64 
    65 
    66     printf("链表中第 3个节点的直接前驱是:%d", head_node->next->next->next->prior->data);
    67 }

     3,在指定结点后插入一个结点,(这里直接是第一个结点后插入新节点)

     1 //双向链表在指定结点后插入一个结点,这里在第一个结点后插入
     2 #include <stdio.h>
     3 #include <stdlib.h>
     4 
     5 typedef struct Link {
     6     int data;
     7     struct Link* prior;
     8     struct Link* next;
     9 }link;
    10 
    11 
    12 link* initLink(link* headNode) {
    13     headNode = (link*)malloc(sizeof(link)); //头结点
    14     headNode->prior = NULL;
    15     headNode->next = NULL;
    16     headNode->data = -1;
    17 
    18     link* headNode2 = headNode; //复制一个头结点
    19 
    20     for (int i = 1; i <= 5; i++) {
    21         link* new_node = (link*)malloc(sizeof(link));
    22         new_node->data = i;
    23 
    24         new_node->prior = headNode2;
    25         headNode2->next = new_node;
    26         new_node->next = NULL;
    27 
    28         headNode2 = new_node;
    29     }
    30 
    31     return headNode;
    32 }
    33 
    34 void  insertNode(link* headNode, int num) {
    35 
    36     link* node1 = headNode->next;
    37     link* node2 = headNode->next->next;
    38     link* new_node = (link*)malloc(sizeof(link));
    39     new_node->data = num;
    40 
    41     new_node->prior = node1;
    42     node1->next = new_node;
    43     new_node->next = node2;
    44     node2->prior = new_node;
    45 }
    46 
    47 void showLink(link* headNode) {
    48     link* temp = headNode;
    49     while (temp != NULL) {
    50         printf("%d  ", temp->data);
    51         temp = temp->next;
    52     }
    53     printf("
    ");
    54 }
    55 
    56 void main() {
    57     link* head_node = NULL;
    58     head_node = initLink(head_node); //获取经过初始化后的双向链表的头结点
    59     printf("初始化双向链表是:
    ");
    60     showLink(head_node);
    61 
    62     printf("在第一个结点后插入99后的链表是:
    ");
    63     insertNode(head_node, 99);
    64     showLink(head_node);
    65 
    66 
    67     printf("链表中第 2个节点的直接前驱是:%d", head_node->next->next->prior->data);
    68 }

     4,删除指定结点(这里直接删除第2个结点)

     1 //双向链表删除指定结点,这里删除第二个结点
     2 #include <stdio.h>
     3 #include <stdlib.h>
     4 
     5 typedef struct Link {
     6     int data;
     7     struct Link* prior;
     8     struct Link* next;
     9 }link;
    10 
    11 
    12 link* initLink(link* headNode) {
    13     headNode = (link*)malloc(sizeof(link)); //头结点
    14     headNode->prior = NULL;
    15     headNode->next = NULL;
    16     headNode->data = -1;
    17 
    18     link* headNode2 = headNode; //复制一个头结点
    19 
    20     for (int i = 1; i <= 5; i++) {
    21         link* new_node = (link*)malloc(sizeof(link));
    22         new_node->data = i;
    23 
    24         new_node->prior = headNode2;
    25         headNode2->next = new_node;
    26         new_node->next = NULL;
    27 
    28         headNode2 = new_node;
    29     }
    30 
    31     return headNode;
    32 }
    33 
    34 void  delNode(link* headNode) {
    35 
    36     link* node1 = headNode->next;
    37     link* node2 = headNode->next->next;
    38     link* node3 = headNode->next->next->next;
    39    
    40     node1->next = node3;
    41     node3->prior = node1;
    42     free(node2);
    43 }
    44 
    45 void showLink(link* headNode) {
    46     link* temp = headNode;
    47     while (temp != NULL) {
    48         printf("%d  ", temp->data);
    49         temp = temp->next;
    50     }
    51     printf("
    ");
    52 }
    53 
    54 void main() {
    55     link* head_node = NULL;
    56     head_node = initLink(head_node); //获取经过初始化后的双向链表的头结点
    57     printf("初始化双向链表是:
    ");
    58     showLink(head_node);
    59 
    60     printf("删除第二个结点后的链表是:
    ");
    61     delNode(head_node);
    62     showLink(head_node);
    63 
    64 
    65     printf("链表中第 2个节点的直接前驱是:%d", head_node->next->next->prior->data);
    66 }

     5,查询指定结点,根据用户的输入值,在链表查找是否存在这个结点,有就返回这个结点的位置,没有就提示没有找到

     1 //双向链表查询指定结点,根据用户输入数据,返回结点位置
     2 #include <stdio.h>
     3 #include <stdlib.h>
     4 
     5 typedef struct Link {
     6     int data;
     7     struct Link* prior;
     8     struct Link* next;
     9 }link;
    10 
    11 
    12 link* initLink(link* headNode) {
    13     headNode = (link*)malloc(sizeof(link)); //头结点
    14     headNode->prior = NULL;
    15     headNode->next = NULL;
    16     headNode->data = -1;
    17 
    18     link* headNode2 = headNode; //复制一个头结点
    19 
    20     for (int i = 1; i <= 5; i++) {
    21         link* new_node = (link*)malloc(sizeof(link));
    22         new_node->data = i;
    23 
    24         new_node->prior = headNode2;
    25         headNode2->next = new_node;
    26         new_node->next = NULL;
    27 
    28         headNode2 = new_node;
    29     }
    30 
    31     return headNode;
    32 }
    33 
    34 int  queryNode(link* headNode,int num) {
    35     link* tmp = headNode;
    36     int count = 0;
    37     while (tmp->next != NULL) {
    38         if (tmp->data == num) {
    39             return count;
    40         }
    41         count++;
    42         tmp = tmp->next;
    43     }
    44     return -1;
    45 }
    46 
    47 void showLink(link* headNode) {
    48     link* temp = headNode;
    49     while (temp != NULL) {
    50         printf("%d  ", temp->data);
    51         temp = temp->next;
    52     }
    53     printf("
    ");
    54 }
    55 
    56 void main() {
    57     link* head_node = NULL;
    58     head_node = initLink(head_node); //获取经过初始化后的双向链表的头结点
    59     printf("初始化双向链表是:
    ");
    60     showLink(head_node);
    61 
    62     int num = 0;
    63     printf("请输入你想要查找的结点: ");
    64     scanf("%d", &num);
    65     int isfind = queryNode(head_node, num);
    66     if (isfind != -1) {
    67         printf("找到这个结点,是第%d个结点
    ", isfind);
    68     }
    69     else {
    70         printf("不存在这个结点
    ");
    71     }
    72 
    73 }

     

  • 相关阅读:
    两数之和
    Go网络编程UDP
    Go网络编程TCP
    Go_json
    Iris_xorm
    Go初始化结构体数组/切片
    Iris_xorm
    pyhon之函数参数
    python之深浅拷贝
    python作业之用户管理程序
  • 原文地址:https://www.cnblogs.com/shanlu0000/p/12516766.html
Copyright © 2011-2022 走看看