zoukankan      html  css  js  c++  java
  • 数据结构C语言>3基本链表>35链表的结点删除

    又重复了链表创建,链表输出,链表结点遍历,

    主角当然是链表结点删除。

    链表结点删除,有三种情况:

    情况1,删除头结点。只要把链表结构指针,指向第二个结点。

    情况2,删除最后结点。只要把倒数第二个结点的next指针指向NULL就行。

    情况3,删除中间结点。只要把中间结点的上一个节点next指针指向中间结点的next指针指向的地方就行。

    链表结点遍历,就是为了找出要删除的结点的上一个节点。

    具体代码如下:

    /* ======================================== */
    /*    程式实例: 3_5.c                     */
    /*    链结串列的节点删除                    */
    /* ======================================== */
    #include 
    <stdlib.h>

    struct llist                       /* 串列结构宣告          */
    {
       
    int num;                       /* 邮寄编号              */
       
    struct llist *next;             /* 指向下一标签          */
    };
    typedef 
    struct llist node;         /* 定义新型态            */
    typedef node 
    *llink;               /* 定义新型态指标        */

    /* ---------------------------------------- */
    /*  链结串列的列印                          */
    /* ---------------------------------------- */
    void printllist(llink ptr)
    {
       
    while ( ptr != NULL )          /* 串列走访回路          */
       {
          printf(
    "[%d]",ptr->num);    /* 列印节点资料          */
          ptr 
    = ptr->next;            /* 指向下一节点          */
       }
       printf(
    "\n");                  /* 换行                  */
    }

    /* ---------------------------------------- */
    /*  键结串列的建立                          */
    /* ---------------------------------------- */
    llink createllist(
    int *array,int len)
    {
       llink head;                     
    /* 串列的开始指标        */
       llink ptr,ptr1;
       
    int i;

       
    /* 建立第一个节点 */
       head 
    = ( llink ) malloc(sizeof(node)); /* 配置记忆体     */
       
    if ( !head )                   /* 检查指标              */
          
    return NULL;
       head
    ->num = array[0];          /* 建立节点内容          */
       head
    ->next = NULL;             /* 设定指标初值          */
       ptr 
    = head;                    /* 将ptr指向串列开始     */
       
    for ( i = 1; i < len; i++ )    /* 建立其它节点回路      */
       {
           ptr1 
    = ( llink ) malloc(sizeof(node));
           
    if ( !ptr1 )
              
    return NULL;
           ptr1
    ->num = array[i];      /* 建立节点内容          */
           ptr1
    ->next = NULL;         /* 设定指标初值          */
           ptr
    ->next = ptr1;          /* 连结节点              */
           ptr 
    = ptr->next;           /* 指向下一节点          */
       }
       
    return head;
    }

    /* ---------------------------------------- */
    /*  链结串列的节点走访                      */
    /* ---------------------------------------- */
    llink findnode(llink head,
    int num)
    {
       llink ptr;

       ptr 
    = head;                    /* 指向串列起始          */
       
    while ( ptr != NULL )          /* 走访串列              */
       {
          
    if ( ptr->num == num )      /* 找寻编号              */
             
    return ptr;
          ptr 
    = ptr->next;            /* 指向下一节点          */
       }
       
    return ptr;
    }

    /* ---------------------------------------- */
    /*  键结串列的节点删除                      */
    /* ---------------------------------------- */
    llink deletenode(llink head,llink ptr)
    {
       llink previous;                 
    /* 指向前一节点          */

       
    if ( ptr == head )             /* 是否是串列开始        */
          
    /* 第一种情况: 删除第一个节点 */
          
    return head->next;          /* 传回第二节点指标      */
       
    else
       {
          previous 
    = head;
          
    while ( previous->next != ptr ) /* 找节点ptr的前节点 */
             previous 
    = previous->next;

          
    if ( ptr->next == NULL )    /* 是否是串列结束        */
             
    /* 第二种情况: 删除最後一个节点 */
             previous
    ->next = NULL;   /* 最後一个节点          */
          
    else
             
    /* 第三种情况: 删除中间节点 */
             previous
    ->next = ptr->next;  /* 中间节点          */
       }
       
    return head;
    }

    /* ---------------------------------------- */
    /*  主程式: 找到邮寄编号後, 将之删除.       */
    /* ---------------------------------------- */
    void main()
    {
       
    int llist1[6= { 123456 }; /* 阵列内容        */
       llink head;                     
    /* 指向串列开始          */
       llink ptr;
       
    int num;                       /* 邮寄编号变数          */

       head 
    = createllist(llist1,6);   /* 建立串列              */
       
    if ( !head )
       {
          printf(
    "记忆体配置失败! \n");
          exit(
    1);
       }
       printf(
    "原来的链表: ");
       printllist(head);              
    /* 列印原来串列          */
       
    while ( 1 )
       {
          printf(
    "请输入要删除的邮寄编号 ==> ");
          scanf(
    "%d",&num);           /* 读取邮寄编号          */
          
    if ( num != -1 )
          {
             ptr 
    = findnode(head,num); /* 找寻邮寄编号        */
             
    if ( !ptr )              /* 是否找到              */
                printf(
    "没有找到\n");
             
    else
             {
                head 
    = deletenode(head,ptr); /* 删除此节点    */
                printf(
    "删除后的链表: ");
                printllist(head);     
    /* 列印删除後串列        */
             }
          }
          
    else
             exit(
    1);                 /* 结束离开              */
       }
    }

    合乎自然而生生不息。。。
  • 相关阅读:
    Hadoop集群(三) Hbase搭建
    Hadoop集群(二) HDFS搭建
    Hadoop集群(一) Zookeeper搭建
    Redis Cluster 添加/删除 完整折腾步骤
    Redis Cluster在线迁移
    Hadoop分布式HA的安装部署
    Describe the difference between repeater, bridge and router.
    what is the “handover” and "soft handover" in mobile communication system?
    The main roles of LTE eNodeB.
    The architecture of LTE network.
  • 原文地址:https://www.cnblogs.com/samwu/p/2086458.html
Copyright © 2011-2022 走看看