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

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 3_9.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 head)
  17. {
  18.    llink ptr;
  19.    ptr = head->next;              /* 指向真正的起始    */
  20.    while ( ptr != NULL )          /* 串列走访回路      */
  21.    {
  22.       printf("[%d]",ptr->num);    /* 列印节点资料      */
  23.       ptr = ptr->next;            /* 指向下一节点      */
  24.    }
  25.    printf("n");                  /* 换行              */
  26. }
  27. /* ---------------------------------------- */
  28. /*  链结串列的建立                          */
  29. /* ---------------------------------------- */
  30. llink createllist(int *array,int len)
  31. {
  32.    llink head;                     /* 串列的开始指标    */
  33.    llink ptr,ptr1;
  34.    int i;
  35.    /* 建立开头节点 */
  36.    head = ( llink ) malloc(sizeof(node)); /* 配置记忆体 */
  37.    if ( !head )                   /* 检查指标          */
  38.       return NULL;
  39.    ptr = head;                    /* 将ptr指向串列开始 */
  40.    for ( i = 0; 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 insertnode(llink head,llink ptr,int value)
  56. {
  57.    llink new;                      /* 新节点指标变数    */
  58.    new = ( llink ) malloc(sizeof(node));  /* 建立新节点 */
  59.    if ( !new )
  60.       return NULL;
  61.    new->num = value;              /* 建立节点内容      */
  62.    new->next = NULL;              /* 设定指标初值      */
  63.    /* 如果ptr等於开头节点则是插入第一个节点 */
  64.    new->next = ptr->next;        /* 新节点指向下一节点 */
  65.    ptr->next = new;               /* 节点ptr指向新节点 */
  66.    return head;
  67. }
  68. /* ---------------------------------------- */
  69. /*  链结串列的节点删除                      */
  70. /* ---------------------------------------- */
  71. llink deletenode(llink head,llink ptr)
  72. {
  73.    llink previous;
  74.    previous = head;
  75.    while ( previous->next != ptr ) /* 找节点ptr前一节点 */
  76.       previous = previous->next;
  77.    previous->next = ptr->next;    /* 删除中间节点      */
  78.    free(ptr);                     /* 释回节点记忆体    */
  79.    return head;
  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 = insertnode(head,head,0); /* 插入新节点      */
  97.    if ( !head )
  98.    {
  99.       printf("记忆体配置失败! n");
  100.       exit(1);
  101.    }
  102.    /* 删除串列内节点 */
  103.    head = deletenode(head,head->next->next->next);
  104.    printf("最后的链表: ");
  105.    printllist(head);              /* 列印结果串列      */
  106. }