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

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 5_2a.c                      */
  3. /*    使用链结串列来构建栈                */
  4. /* ======================================== */
  5. #include <time.h>
  6. #include <stdlib.h>
  7. struct stack_node                 /* 栈的结构宣告     */
  8. {
  9.    int data;                      /* 栈资料           */
  10.    struct stack_node *next;       /* 指向下一节点       */
  11. };
  12. typedef struct stack_node stack_list;  /* 串列新型态    */
  13. typedef stack_list *link;         /* 串列指标新型态     */
  14. link stack = NULL;                /* 栈指标           */
  15. /* ---------------------------------------- */
  16. /*  栈资料的存入                          */
  17. /* ---------------------------------------- */
  18. int push(int value)
  19. {
  20.    link new_node;                 /* 新节点指标         */
  21.    /* 配置节点记忆体 */
  22.    new_node = ( link ) malloc(sizeof(stack_list));
  23.    if ( !new_node )
  24.    {
  25.       printf("记忆体配置失败! n");
  26.       return -1;                  /* 存入失败           */
  27.    }
  28.    new_node->data = value;        /* 建立节点内容       */
  29.    new_node->next = stack;        /* 新节点指向原开始   */
  30.    stack = new_node;              /* 新节点成为栈开始 */
  31. }
  32. /* ---------------------------------------- */
  33. /*  栈资料的取出                          */
  34. /* ---------------------------------------- */
  35. int pop()
  36. {
  37.    link top;                      /* 指向栈顶端       */
  38.    int temp;
  39.    if ( stack != NULL )           /* 栈是否是空的     */
  40.    {
  41.       top = stack;                /* 指向栈顶端       */
  42.       stack = stack->next;        /* 栈指标指向下节点 */
  43.       temp = top->data;           /* 取出资料           */
  44.       free(top);                  /* 释回节点记忆体     */
  45.       return temp;                /* 栈取出           */
  46.    }
  47.    else
  48.       return -1;
  49. }
  50. /* ---------------------------------------- */
  51. /*  检查栈是否是空的                      */
  52. /* ---------------------------------------- */
  53. int empty()
  54. {
  55.    if ( stack == NULL )           /* 是否是空           */
  56.       return 1;                   /* 空的               */
  57.    else
  58.       return 0;                   /* 不是空的           */
  59. }
  60. /* ---------------------------------------- */
  61. /*  主程式: 洗牌后, 将牌发给四个人.         */
  62. /*     红心: 数组  0 - 12                   */
  63. /*     方块: 数组 13 - 25                   */
  64. /*     梅花: 数组 26 - 38                   */
  65. /*     黑桃: 数组 39 - 51                   */
  66. /* ---------------------------------------- */
  67. void main()
  68. {
  69.    int card[52];                  /* 朴克牌数组         */
  70.    int pos;                       /* 牌代码             */
  71.    int i,temp;
  72.    long temptime;
  73.    srand(time(&temptime) % 60);   /* 使用时间初始乱数   */
  74.    for ( i = 0; i < 52; i++ )
  75.       card[i] = 0;                /* 清除朴克牌数组     */
  76.    i = 0;
  77.    while ( i != 52 )              /* 洗牌回路           */
  78.    {
  79.       pos = rand() % 52;          /* 乱数取值 0-51      */
  80.       if ( card[pos] == 0 )       /* 是否是未洗牌       */
  81.       {
  82.          push(pos);               /* 存此张牌进栈     */
  83.          card[pos] = 1;           /* 设定此张牌洗过     */
  84.          i++;                     /* 下一张牌           */
  85.       }
  86.    }
  87.    printf("    1      2      3      4 n");
  88.    printf(" ==========================n");
  89.    for ( i = 0; i < 5; i++ )      /* 发牌给四人的回路   */
  90.    {
  91.       temp = pop();               /* 取出栈资料       */
  92.       printf(" [%c%2d] ",temp / 13 + 3,temp % 13 + 1);
  93.       temp = pop();               /* 取出栈资料       */
  94.       printf(" [%c%2d] ",temp / 13 + 3,temp % 13 + 1);
  95.       temp = pop();               /* 取出栈资料       */
  96.       printf(" [%c%2d] ",temp / 13 + 3,temp % 13 + 1);
  97.       temp = pop();               /* 取出栈资料       */
  98.       printf(" [%c%2d] ",temp / 13 + 3,temp % 13 + 1);
  99.       printf("n");               /* 换行               */
  100.    }
  101. }