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

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 4_1_5.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 nodealloc(clink *memory)
  17. {
  18.    clink new_node;                /* 新节点的指标         */
  19.    clink ptr;
  20.    if ( (*memory) != NULL )       /* 串列是否是空         */
  21.    {
  22.       ptr = (*memory);
  23.       *memory = (*memory)->next;  /* 指向下一个节点       */
  24.       ptr->next = NULL;           /* 设定指标初值         */
  25.       return ptr;                 /* 傅回新节点指标       */
  26.    }
  27.    else
  28.    {
  29.       /* 建立新节点配置节点记忆体 */
  30.       new_node = ( clink ) malloc(sizeof(cnode));
  31.       if ( !new_node )            /* 检查记忆体指标       */
  32.          return NULL;
  33.       new_node->next = NULL;      /* 设定指标初值         */
  34.       return new_node;            /* 傅回新节点指标       */
  35.    }
  36. }
  37. /* ---------------------------------------- */
  38. /*  链结串列的节点记忆体释回                */
  39. /* ---------------------------------------- */
  40. void freenode(clink *memory,clink ptr)
  41. {
  42.    ptr->next = (*memory);         /* 插入串列开始         */
  43.    (*memory) = ptr;               /* 设定串列指标         */
  44. }
  45. /* ---------------------------------------- */
  46. /*  环状链结串列的列印                      */
  47. /* ---------------------------------------- */
  48. void printclist(clink head)
  49. {
  50.    clink ptr;
  51.    printf("环链内容: ");
  52.    ptr = head;                    /* 指向串列开始         */
  53.    do                             /* 串列走访回路         */
  54.    {
  55.       printf("[%d]",ptr->data);   /* 列印节点资料         */
  56.       ptr = ptr->next;            /* 指向下一个节点       */
  57.    } while ( head != ptr );
  58.    printf("n");                  /* 换行                 */
  59. }
  60. /* ---------------------------------------- */
  61. /*  列出记忆体串列内容                      */
  62. /* ---------------------------------------- */
  63. void printmemory(clink memory)
  64. {
  65.    clink ptr;
  66.    printf("内存中链表的内容: ");
  67.    ptr = memory;                  /* 指向串列开始         */
  68.    while ( ptr != NULL )          /* 串列走访回路         */
  69.    {
  70.       printf("[%d]",ptr->data);   /* 列印节点资料         */
  71.       ptr = ptr->next;            /* 指向下一个节点       */
  72.    }
  73.    printf("n");                  /* 换行                 */
  74. }
  75. /* ---------------------------------------- */
  76. /*  使用阵列值建立环状链结串列              */
  77. /* ---------------------------------------- */
  78. clink createclist(int *array,clink *memory,int len)
  79. {
  80.    clink head = NULL;             /* 环状串列的指标       */
  81.    clink before;                  /* 前一节点的指标       */
  82.    clink new_node;                /* 新节点的指标         */
  83.    int i;
  84.    /* 建立第一个节点 */
  85.    head = nodealloc(memory);     /* 配置节点记忆体       */
  86.    head->data = array[0];         /* 建立节点内容         */
  87.    before = head;                 /* 指向第一个节点       */
  88.    for ( i = 1; i < len; i++ )    /* 用回路建立其它节点   */
  89.    {
  90.       new_node = nodealloc(memory);  /* 配置节点记忆体   */
  91.       new_node->data = array[i];  /* 建立节点内容         */
  92.       before->next = new_node;    /* 将前节点指向新节点   */
  93.       before = new_node;          /* 新节点成为前节点     */
  94.    }
  95.    new_node->next = head;         /* 建立环状链结         */
  96.    return head;                   /* 传回串列起始指标     */
  97. }
  98. /* ---------------------------------------- */
  99. /*  释回整个环状链结串列                    */
  100. /* ---------------------------------------- */
  101. void freeclist(clink head,clink *memory)
  102. {
  103.    clink ptr;                     /* 下一节点的指标       */
  104.    if ( head != NULL )            /* 串列是否是空         */
  105.    {
  106.       ptr = head->next;           /* 指向下一节点         */
  107.       head->next = *memory;       /* head指向memory       */
  108.       *memory = ptr;              /* 新的记忆体串列开始   */
  109.    }
  110. }
  111. /* ---------------------------------------- */
  112. /*  主程式:                                 */
  113. /*  使用记忆体管理方式来建立串列和作记忆体  */
  114. /*  释回.                                   */
  115. /* ---------------------------------------- */
  116. void main()
  117. {
  118.    clink head = NULL;             /* 环状链结串列指标     */
  119.    clink memory = NULL;           /* 记忆体管理指标       */
  120.    clink ptr;
  121.    int list[6] = { 1, 2, 3, 4, 5, 6 };   /* 阵列内容      */
  122.    int i;
  123.    /* 用回路建立记忆体串列, 总共7个节点 */
  124.    for ( i = 0; i < 7; i++ )
  125.    {
  126.       /* 配置一个节点记忆体 */
  127.       ptr = ( clink ) malloc(sizeof(cnode));
  128.       if ( !ptr )                 /* 检查记忆体指标       */
  129.          exit(1);
  130.       ptr->next = NULL;
  131.       ptr->data = 100 + i;        /* 建立节点内容         */
  132.       freenode(&memory,ptr);     /* 释回一个节点记忆体   */
  133.    }
  134.    printmemory(memory);          /* 印出记忆体串列       */
  135.    head = createclist(list,&memory,6); /*建立环状链结串列*/
  136.    printclist(head);             /* 印出环状串列         */
  137.    /* 环状链结串列的记忆体释回 */
  138.    freeclist(head,&memory);
  139.    printmemory(memory);          /* 印出记忆体串列       */
  140. }