4_1_3.C
上传用户:wyn840322
上传日期:2007-01-13
资源大小:294k
文件大小:5k
源码类别:

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 4_1_3.c                   */
  3. /*    环状链结串列内节点删除                */
  4. /* ======================================== */
  5. #include <stdlib.h>
  6. struct clist                      /* 环状串列结构宣告     */
  7. {
  8.    int data;                      /* 节点资料             */
  9.    struct clist *next;            /* 指向前一节点的指标   */
  10. };
  11. typedef struct clist cnode;       /* 环状串列新型态       */
  12. typedef cnode *clink;             /* 环状串列指标新型态   */
  13. /* ---------------------------------------- */
  14. /*  使用阵列值建立环状链结串列              */
  15. /* ---------------------------------------- */
  16. clink createclist(int *array,int len)
  17. {
  18.    clink head;                    /* 环状串列的指标       */
  19.    clink before;                  /* 前一节点的指标       */
  20.    clink new_node;                /* 新节点的指标         */
  21.    int i;
  22.    /* 建立第一个节点 */
  23.    /* 配置节点记忆体 */
  24.    head = ( clink ) malloc(sizeof(cnode));
  25.    if ( !head )                   /* 检查记忆体指标       */
  26.       return NULL;
  27.    head->data = array[0];         /* 建立节点内容         */
  28.    head->next = NULL;             /* 设定指标初值         */
  29.    before = head;                 /* 指向第一个节点       */
  30.    for ( i = 1; i < len; i++ )    /* 用回路建立其它节点   */
  31.    {
  32.       /* 配置节点记忆体 */
  33.       new_node = ( clink ) malloc(sizeof(cnode));
  34.       if ( !new_node )            /* 检查记忆体指标       */
  35.          return NULL;
  36.       new_node->data = array[i];  /* 建立节点内容         */
  37.       new_node->next = NULL;      /* 设定指标初值         */
  38.       before->next = new_node;    /* 将前节点指向新节点   */
  39.       before = new_node;          /* 新节点成为前节点     */
  40.    }
  41.    new_node->next = head;         /* 建立环状链结         */
  42.    return head;                   /* 传回串列起始指标     */
  43. }
  44. /* ---------------------------------------- */
  45. /*  环状链结串列的走访                      */
  46. /* ---------------------------------------- */
  47. clink findnode(clink head,int value)
  48. {
  49.    clink ptr;
  50.    ptr = head;                    /* 指向串列开始         */
  51.    do                             /* 串列走访回路         */
  52.    {
  53.       if ( ptr->data == value )   /* 比较值               */
  54.          return ptr;              /* 找到值               */
  55.       ptr = ptr->next;            /* 指向下一个节点       */
  56.    } while ( head != ptr && head != head->next );
  57.    return NULL;                   /* 没有找到值           */
  58. }
  59. /* ---------------------------------------- */
  60. /*  环状链结串列的列印                      */
  61. /* ---------------------------------------- */
  62. void printclist(clink head)
  63. {
  64.    clink ptr;
  65.    ptr = head;                    /* 指向串列开始         */
  66.    do                             /* 串列走访回路         */
  67.    {
  68.       printf("[%d]",ptr->data);   /* 列印节点资料         */
  69.       ptr = ptr->next;            /* 指向下一个节点       */
  70.    } while ( head != ptr && head != head->next );
  71.    printf("n");                  /* 换行                 */
  72. }
  73. /* ---------------------------------------- */
  74. /*  环状链结串列的节点删除                  */
  75. /* ---------------------------------------- */
  76. clink deletenode(clink head,clink ptr)
  77. {
  78.    clink previous;                /* 前一节点指标         */
  79.    if ( head == NULL )            /* 如果串列是空的       */
  80.       return NULL;
  81.    previous = head;
  82.    if ( head != head->next )      /* 串列多於一个节点     */
  83.       while ( previous->next != ptr )  /*找节点ptr的前节点*/
  84.          previous = previous->next;    /* 移至下一个节点  */
  85.    if ( ptr == head )             /* 如果是第一节点       */
  86.    {
  87.       /* 第一种情况: 删除第一个节点 */
  88.       head = head->next;          /* 移至下一个节点       */
  89.       previous->next = ptr->next; /* 前节点指向下节点     */
  90.    }
  91.    else
  92.       /* 第二种情况: 删除中间节点 */
  93.       previous->next = ptr->next; /* 前节点指向下节点     */
  94.    free(ptr);                     /* 释回节点记忆体       */
  95.    return head;                   /* 传回串列起始指标     */
  96. }
  97. /* ---------------------------------------- */
  98. /*  主程式:                                 */
  99. /*  输入值, 用走访方式在环状链结串列中找寻. */
  100. /*  找到就将之删除. 输入-1离开.             */
  101. /* ---------------------------------------- */
  102. void main()
  103. {
  104.    clink head;                    /* 环状链结串列指标     */
  105.    clink find;                    /* 找到的串列节点       */
  106.    int list[6] = { 9, 7, 3, 4, 5, 6 };   /* 阵列内容      */
  107.    int value;                            /* 欲找寻值      */
  108.    head = createclist(list,6);   /* 建立环状链结串列     */
  109.    if ( head == NULL )
  110.    {
  111.       printf("记忆体配置失败! n");    /* 串列建立失败    */
  112.       exit(1);                    /* 结束程式             */
  113.    }
  114.    printf("链表内容是: ");
  115.    printclist(head);             /* 印出串列内容         */
  116.    while ( 1 )                    /* 主回路开始           */
  117.    {
  118.       printf("请输入查询值 ==> ");
  119.       scanf("%d",&value);         /* 读入值               */
  120.       if ( value == -1 )
  121.       {
  122.          printclist(head);       /* 印出删除後串列内容   */
  123.          exit(1);                 /* 结束程式             */
  124.       }
  125.       find = findnode(head,value);    /* 在串列中找寻值  */
  126.       if ( find != NULL )
  127.       {
  128.          printf("删除值: %dn",find->data);
  129.          head = deletenode(head,find);  /* 删除find节点  */
  130.          printclist(head);       /* 印出串列内容         */
  131.       }
  132.       else
  133.          printf("找不到搜索值n");
  134.    }
  135. }