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

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 3_8.c                     */
  3. /*    链结串列的反转                        */
  4. /* ======================================== */
  5. #include <stdlib.h>
  6. struct llist                       /* 串列结构宣告      */
  7. {
  8.    int num;                       /* 邮寄编号          */
  9.    struct llist *next;             /* 指向下一标签      */
  10. };
  11. typedef struct llist node;         /* 定义新型态        */
  12. typedef node *llink;               /* 定义新型态指标    */
  13. /* ---------------------------------------- */
  14. /*  键结串列的列印                          */
  15. /* ---------------------------------------- */
  16. void printllist(llink ptr)
  17. {
  18.    while ( ptr != NULL )          /* 串列走访回路      */
  19.    {
  20.       printf("[%d]",ptr->num);    /* 列印节点资料      */
  21.       ptr = ptr->next;            /* 指向下一节点      */
  22.    }
  23.    printf("n");                  /* 换行              */
  24. }
  25. /* ---------------------------------------- */
  26. /*  链结串列的建立                          */
  27. /* ---------------------------------------- */
  28. llink createllist(int *array,int len)
  29. {
  30.    llink head;                     /* 串列的开始指标    */
  31.    llink ptr,ptr1;
  32.    int i;
  33.    /* 建立第一个节点 */
  34.    head = ( llink ) malloc(sizeof(node)); /* 配置记忆体 */
  35.    if ( !head )                   /* 检查指标          */
  36.       return NULL;
  37.    head->num = array[0];          /* 建立节点内容      */
  38.    head->next = NULL;             /* 设定指标初值      */
  39.    ptr = head;                    /* 将ptr指向串列开始 */
  40.    for ( i = 1; i < len; i++ )    /* 建立其它节点回路  */
  41.    {
  42.        ptr1 = ( llink ) malloc(sizeof(node));
  43.        if ( !ptr1 )
  44.           return NULL;
  45.        ptr1->num = array[i];      /* 建立节点内容      */
  46.        ptr1->next = NULL;         /* 设定指标初值      */
  47.        ptr->next = ptr1;          /* 连结节点          */
  48.        ptr = ptr->next;           /* 指向下一节点      */
  49.    }
  50.    return head;
  51. }
  52. /* ---------------------------------------- */
  53. /*  链结串列的反转                          */
  54. /* ---------------------------------------- */
  55. llink invertllist(llink head)
  56. {
  57.    llink mid,last;
  58.    mid = NULL;                    /* mid是head的前节点 */
  59.    while ( head != NULL )
  60.    {
  61.       last = mid;                 /* last是mid的前节点 */
  62.       mid = head;
  63.       head = head->next;          /* 下一个节点        */
  64.       mid->next = last;           /* mid指向前节点last */
  65.    }
  66.    return mid;
  67. }
  68. /* ---------------------------------------- */
  69. /*  链结串列的记忆体释回                    */
  70. /* ---------------------------------------- */
  71. void freellist(llink head)
  72. {
  73.    llink ptr;
  74.    while ( head != NULL )         /* 走访串列回路      */
  75.    {
  76.       ptr = head;
  77.       head = head->next;          /* 指向下一节点      */
  78.       free(ptr);                  /* 释回节点记忆体    */
  79.    }
  80. }
  81. /* ---------------------------------------- */
  82. /*  主程式: 反转串列                        */
  83. /* ---------------------------------------- */
  84. void main()
  85. {
  86.    int llist1[6] = { 1, 2, 3, 4, 5, 6 };  /* 阵列内容   */
  87.    llink head;                     /* 指向串列开始      */
  88.    head = createllist(llist1,6);   /* 建立串列          */
  89.    if ( !head )
  90.    {
  91.       printf("记忆体配置失败! n");
  92.       exit(1);
  93.    }
  94.    printf("原来的链表: ");
  95.    printllist(head);              /* 列印原来串列      */
  96.    head = invertllist(head);      /* 反转串列          */
  97.    printf("反转后的链表: ");
  98.    printllist(head);              /* 列印反转後串列    */
  99.    freellist(head);               /* 释回串列记忆体    */
  100. }