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

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 4_2_2.c                     */
  3. /*    稀疏阵列的环状链结串列表示法          */
  4. /* ======================================== */
  5. #include <stdlib.h>
  6. struct clist                      /* 环状串列结构宣告     */
  7. {
  8.    int row;                       /* 阵列的列             */
  9.    int col;                       /* 阵列的行             */
  10.    int data;                      /* 节点资料             */
  11.    struct clist *right;           /* 指向同一列节点指标   */
  12.    struct clist *down;            /* 指向同一行节点指标   */
  13. };
  14. typedef struct clist cnode;       /* 环状串列新型态       */
  15. typedef cnode *clink;             /* 环状串列指标新型态   */
  16. /* ---------------------------------------- */
  17. /*  建立稀疏阵列的开头节点阵列              */
  18. /* ---------------------------------------- */
  19. clink create_matrix(int row,int col)
  20. {
  21.    clink head;                    /* 稀疏阵列指标         */
  22.    int len;                       /* 阵列的长度           */
  23.    int i;
  24.    /* 计算阵列长度,取行与列之最大值 */
  25.    if ( row > col )
  26.       len = row;
  27.    else
  28.       len = col;
  29.    /* 配置开头节点阵列阵列记忆体 */
  30.    head = ( clink ) malloc(sizeof(cnode) * len);
  31.    if ( !head )                   /* 检查记忆体指标       */
  32.       return NULL;
  33.    head[0].row = row;             /* 阵列的列             */
  34.    head[0].col = col;             /* 阵列的行             */
  35.    for ( i = 0; i < len; i++ )    /* 用回路设定指标初值   */
  36.    {
  37.       head[i].right = &head[i];   /* 设定指标指向自己     */
  38.       head[i].down = &head[i];    /* 设定指标指向自己     */
  39.    }
  40.    return head;                   /* 传回稀疏阵列指标     */
  41. }
  42. /* ---------------------------------------- */
  43. /*  稀疏阵列的阵列元素插入                  */
  44. /* ---------------------------------------- */
  45. clink insert_matrix(clink head,int row,int col,int value)
  46. {
  47.    clink new_node;                /* 新节点的指标         */
  48.    clink pos;                     /* 插入的位置           */
  49.    /* 建立新节点配置节点记忆体 */
  50.    new_node = ( clink ) malloc(sizeof(cnode));
  51.    if ( !new_node )               /* 检查记忆体指标       */
  52.       return NULL;
  53.    /* 稀疏阵列的实际大小 */
  54.    new_node->row = row;           /* 阵列的列             */
  55.    new_node->col = col;           /* 阵列的行             */
  56.    new_node->data = value;        /* 建立节点内容         */
  57.    /* 插入由指标down接成行串列 */
  58.    pos = &head[col];              /* 设定行串列指标       */
  59.    /* 用回路来找插入列row */
  60.    while ( pos->down != &head[col] && row > pos->down->row )
  61.       pos = pos->down;            /* 指向下一个节点       */
  62.    new_node->down = pos->down;    /* 新节点指向下一节点   */
  63.    pos->down = new_node;          /* 前一节点指向新节点   */
  64.    /* 插入由指标right接成列串列 */
  65.    pos = &head[row];              /* 设定列串列指标       */
  66.    /* 用回路来找插入行col */
  67.    while ( pos->right != &head[row] && col > pos->right->col )
  68.       pos = pos->right;           /* 指向下一个节点       */
  69.    new_node->right = pos->right;  /* 新节点指向下一节点   */
  70.    pos->right = new_node;         /* 前一节点指向新节点   */
  71.    return head;                   /* 传回稀疏阵列指标     */
  72. }
  73. /* ---------------------------------------- */
  74. /*  稀疏阵列的列印                          */
  75. /* ---------------------------------------- */
  76. void print_matrix(clink head)
  77. {
  78.    clink ptr;
  79.    clink now;
  80.    int i;
  81.    printf("  列   行     值 n");
  82.    printf("=================n");
  83.    /* 从down指标串成的串列来列印 */
  84.    for ( i = 0; i < head[0].col; i++ )
  85.    {
  86.       now = head[i].down;
  87.       ptr = &head[i];
  88.       while  ( now != ptr )       /* 走访指标down回路     */
  89.       {
  90.          printf("[%3d][%3d]=[%4d]n",now->row,now->col,now->data);
  91.          /* 列印节点资料 */
  92.          now = now->down;         /* 指向下一个节点       */
  93.       }
  94.    }
  95. }
  96. /* ---------------------------------------- */
  97. /*  主程式:                                 */
  98. /*  使用环状链结串列来建立稀疏阵列, 完成後  */
  99. /*  将阵列内容印出.                         */
  100. /* ---------------------------------------- */
  101. void main()
  102. {
  103.    clink head;                    /* 稀疏阵列指标         */
  104.    int sparse[5][6] = {           /* 稀疏阵列的内容       */
  105.                          0, 0, 1, 0, 0, 0,
  106.                          0, 3, 0, 9, 0, 0,
  107.                          0, 4, 0, 0, 0, 2,
  108.                          7, 0, 0, 0, 3, 0,
  109.                          0, 0, 0, 6, 0, 0 };
  110.    int i,j;
  111.    head = create_matrix(5,6);     /* 建立稀疏阵列         */
  112.    for ( i = 0; i < 5; i++ )      /* 二维阵列的走访       */
  113.       for ( j = 0; j < 6; j++ )
  114.          if ( sparse[i][j] != 0 ) /* 有没有使用           */
  115.             /*  稀疏阵列的阵列元素插入 */
  116.             head = insert_matrix(head,i,j,sparse[i][j]);
  117.    print_matrix(head);            /* 列出阵列内容         */
  118. }