zoukankan      html  css  js  c++  java
  • 带头结点的双向循环链表C语言

      1 /*****************************************************
      2 Author:Simon_Kly    Version:0.1    Date: 20170520
      3 Description:带头结点的双向循环链表
      4 Mail: degaullekong@gmail.com
      5 Funcion List: 
      6 *****************************************************/
      7 
      8 #include <stdio.h>
      9 #include <stdlib.h>
     10 
     11 typedef struct node
     12 {
     13     int data;
     14     struct node *prior, *next;
     15 }Node, *Link;
     16 
     17 void is_malloc_ok(Link head)
     18 {
     19     if (head == NULL)
     20     {
     21         printf("malloc is error!\n");
     22         exit(-1);
     23     }
     24 }
     25 
     26 /*创建链表*/
     27 void create_link(Link * head)
     28 {
     29     *head = (Link)malloc(sizeof(Node));
     30 
     31     is_malloc_ok(*head);
     32 
     33     (*head)->next = (*head)->prior = *head;//让其指向自己
     34 }
     35 
     36 /*创建节点*/
     37 void create_node(Link * new_node)
     38 {
     39     *new_node = (Link)malloc(sizeof(Node));
     40     is_malloc_ok(*new_node);
     41 }
     42 
     43 /*插入节点(头插)*/
     44 void insert_node_head(Link head, Link new_node)
     45 {
     46     new_node->prior = head;
     47     new_node->next = (head)->next;
     48     (head)->next->prior = new_node;
     49     (head)->next = new_node;
     50 }
     51 
     52 
     53 /*插入节点(尾插)*/
     54 void insert_node(Link * head, Link new_node)
     55 {
     56     Link p = NULL;
     57 
     58     p = *head;
     59     while (p->next != *head)
     60     {
     61         p = p->next;
     62     }
     63 
     64     new_node->prior = p;
     65     new_node->next = p->next;
     66     p->next->prior = new_node;
     67     p->next = new_node;
     68 }
     69 
     70 /*输出链表*/
     71 void out_link(Link head)
     72 {
     73     Link p = NULL;
     74 #if 0
     75     if (head->next == head)
     76     {
     77         printf("link is empty\n");
     78         return ;
     79     }
     80 #endif
     81 
     82     if (head == NULL)
     83     {
     84         printf("link is empty\n");
     85         return ;
     86     }
     87 
     88     p = (head)->next;
     89 
     90     while (p != head)
     91     {
     92         printf("%d\n", p->data);
     93         p = p->next;
     94     }
     95     putchar(10);
     96 }
     97 
     98 /*变成空链*/
     99 void make_empty(Link * head)
    100 {
    101     Link p = NULL;
    102 
    103     p = (*head)->next;
    104 
    105     while (*head != (*head)->next)
    106     {
    107         (*head)->next = p->next;//head移动
    108         free(p);//释放head之前的节点
    109         p = (*head)->next;
    110     }
    111 }
    112 
    113 /*释放链表*/
    114 void release_link(Link * head)
    115 {
    116     make_empty(head);
    117 
    118     free(*head);
    119 
    120     *head = NULL;
    121 }
    122 
    123 /*删除节点*/
    124 void delete_node(Link * head, int data)
    125 {
    126     Link p = NULL;
    127 
    128     p = (*head)->next;
    129 
    130     if (p == *head)//空链
    131     {
    132         printf("link is empty!\n");
    133         return ;
    134     }
    135 
    136     /*非空链*/
    137     while (p != *head && p->data != data)
    138     {
    139         p = p->next;//找那个节点
    140     }
    141 
    142     if (p == *head)//找一圈没找到
    143     {
    144         printf("No such node!\n");
    145         return ;
    146     }
    147     else//找到并改变指向
    148     {
    149         p->prior->next = p->next;
    150         p->next->prior = p->prior;
    151         
    152         free(p);
    153     }
    154 }
    155 
    156 void insert_node_seq(Link * head, Link new_node)
    157 {
    158     Link p = NULL;
    159 
    160     p = (*head);
    161 
    162     while (p->next != *head && new_node->data < p->next->data)//找到该位置的前一个位置
    163     {
    164         p = p->next;
    165     }
    166 #if 0
    167     if (p == *head)//找到尾部
    168     {
    169         new_node->prior = p->prior;
    170         new_node->next = p;
    171         p->prior->next = new_node;
    172         p->prior = new_node;
    173         return ;
    174     }
    175 #endif
    176     new_node->prior = p;
    177     new_node->next = p->next;
    178     p->next->prior = new_node;
    179     p->next = new_node;
    180 
    181 }
    182 
    183 int main()
    184 {
    185     int i;
    186     Link head = NULL;
    187     Link new_node = NULL;
    188     create_link(&head);
    189     
    190     out_link(head);
    191     
    192     for (i = 0; i < 10; i++)
    193     {
    194         create_node(&new_node);
    195         new_node->data = i + 1;
    196     //    insert_node(&head, new_node);
    197         insert_node_head(head, new_node);
    198     }
    199     
    200     out_link(head);
    201     
    202 #if 1
    203     printf("please input i\n");
    204     scanf("%d", &i);
    205     putchar(10);
    206     create_node(&new_node);
    207     new_node->data = i;
    208     insert_node_seq(&head, new_node);
    209     out_link(head);
    210 #endif
    211     
    212 #if 0
    213     delete_node(&head, 2);
    214     out_link(head);
    215 #endif
    216     release_link(&head);
    217     out_link(head);
    218     return 0;
    219 }
  • 相关阅读:
    excel上传和下载
    SublimeText快捷键大全(附GIF演示图)
    JS求多个数组的重复数据
    js各种宽高(3)
    js各种宽高(2)
    js各种宽高(1)
    echarts简单使用案例
    js小技巧
    原生jdbc执行存储过程
    Cron和Spring定时任务
  • 原文地址:https://www.cnblogs.com/SimonKly/p/6890498.html
Copyright © 2011-2022 走看看