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

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 5_13_2.c                    */
  3. /*    使用链结串列来构建输出限制性双队列    */
  4. /* ======================================== */
  5. #include <stdlib.h>
  6. struct queue_node                 /* 队列结构的宣告     */
  7. {
  8.    int data;                      /* 资料               */
  9.    struct queue_node *next;       /* 结构指标           */
  10. };
  11. typedef struct queue_node queue_list;  /* 定义队列型态  */
  12. typedef queue_list *link;         /* 定义队列指标型态   */
  13. link front = NULL;                /* 队列的前端         */
  14. link rear = NULL;                 /* 队列的后端         */
  15. /* ---------------------------------------- */
  16. /*  队列资料的存入(从后端)                  */
  17. /* ---------------------------------------- */
  18. int enqueue_rear(int value)
  19. {
  20.    link new_node;
  21.    new_node = ( link ) malloc(sizeof(queue_list));
  22.    if ( !new_node )               /* 检查配置记忆体     */
  23.    {
  24.       printf("记忆体配置失败! n");
  25.       return -1;                  /* 无法存入           */
  26.    }
  27.    new_node->data = value;        /* 存入队列节点       */
  28.    new_node->next = NULL;         /* 设定初值           */
  29.    if ( rear == NULL )            /* 是否是第一次存入   */
  30.       front = new_node;           /* front指向new_node  */
  31.    else
  32.       rear->next = new_node;      /* 插入rear之后       */
  33.    rear = new_node;               /* rear指向new_node   */
  34. }
  35. /* ---------------------------------------- */
  36. /*  队列资料的存入(从前端)                  */
  37. /* ---------------------------------------- */
  38. int enqueue_front(int value)
  39. {
  40.    link new_node;
  41.    new_node = ( link ) malloc(sizeof(queue_list));
  42.    if ( !new_node )               /* 检查配置记忆体     */
  43.    {
  44.       printf("记忆体配置失败! n");
  45.       return -1;                  /* 无法存入           */
  46.    }
  47.    new_node->data = value;        /* 存入队列节点       */
  48.    if ( front == NULL )           /* 是否是第一次存入   */
  49.    {
  50.       new_node->next = NULL;      /* 设定初值           */
  51.       rear = new_node;            /* rear指向new_node   */
  52.    }
  53.    else
  54.       new_node->next = front;     /* 插入front之前      */
  55.    front = new_node;              /* front指向new_node  */
  56. }
  57. /* ---------------------------------------- */
  58. /*  队列资料的取出                          */
  59. /* ---------------------------------------- */
  60. int dequeue()
  61. {
  62.    link top;
  63.    int temp;
  64.    if ( front != NULL )           /* 队列是否是空的     */
  65.    {
  66.       top = front;                /* top指向front       */
  67.       front = front->next;        /* 删除之前节点       */
  68.       temp = top->data;           /* 取出资料           */
  69.       free(top);                  /* 释回记忆体         */
  70.       return temp;                /* 队列取出           */
  71.    }
  72.    else
  73.       return -1;                  /* 无法取出           */
  74. }
  75. /* ---------------------------------------- */
  76. /*  主程式: 模拟双队列操作                  */
  77. /*  输出输入的内容都会储存於数组中, 模拟双  */
  78. /*  队列存入, 接着列印出数组内容来看其结果. */
  79. /* ---------------------------------------- */
  80. void main()
  81. {
  82.    int input_list[6] =            /* 储存输入的元素     */
  83.                        { 1, 2, 3, 4, 5, 6 };
  84.    int select;                    /* 选择项1,2,或3      */
  85.    int i,temp,pos = 0;
  86.    for ( i = 0; i < 6; i++ )      /* 存入队列           */
  87.    {
  88.       /* 选项内容 */
  89.       printf("[1]从后存入 [2]从前存入 ==> ");
  90.       scanf("%d",&select);        /* 读入选项           */
  91.       switch ( select )
  92.       {
  93.          /* 从后端存入队列的内容 */
  94.          case 1: enqueue_rear(input_list[i]);
  95.                  break;
  96.          /* 从前端存入队列的内容 */
  97.          case 2: enqueue_front(input_list[i]);
  98.                  break;
  99.          /* 内定从后端存入队列的内容 */
  100.          default:
  101.                  enqueue_rear(input_list[i]);
  102.                  break;
  103.       }
  104.    }
  105.    printf("原来数组的顺序: ");    /* 输出结果           */
  106.    for ( i = 0; i < 6; i++ )      /* 列印回路           */
  107.       printf("[%d]",input_list[i]);
  108.    printf("n队列取出的顺序: ");
  109.    while ( (temp = dequeue()) != -1 ) /*取出剩下队列元素*/
  110.       printf("[%d]",temp);
  111.    printf("n");                  /* 换行               */
  112. }