三木社区

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 298|回复: 0
打印 上一主题 下一主题

C语言数据结构-bo5-4.c

[复制链接]

1562

主题

1564

帖子

4904

积分

博士

Rank: 8Rank: 8

积分
4904
跳转到指定楼层
楼主
发表于 2017-9-1 08:50:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /* bo5-4.c 稀疏矩阵的十字链表存储(存储结构由c5-4.h定义)的基本操作(9个) */
  2. Status InitSMatrix(CrossList *M) /* 加 */
  3. { /* 初始化M(CrossList类型的变量必须初始化,否则创建、复制矩阵将出错) */
  4.    (*M).rhead=(*M).chead=NULL;
  5.    (*M).mu=(*M).nu=(*M).tu=0;
  6.    return OK;
  7. }

  8. Status DestroySMatrix(CrossList *M)
  9. { /* 初始条件: 稀疏矩阵M存在。操作结果: 销毁稀疏矩阵M */
  10.    int i;
  11.    OLNode *p,*q;
  12.    for(i=1;i<=(*M).mu;i++) /* 按行释放结点 */
  13.    {
  14.      p=*((*M).rhead+i);
  15.      while(p)
  16.      {
  17.        q=p;
  18.        p=p->right;
  19.        free(q);
  20.      }
  21.    }
  22.    free((*M).rhead);
  23.    free((*M).chead);
  24.    (*M).rhead=(*M).chead=NULL;
  25.    (*M).mu=(*M).nu=(*M).tu=0;
  26.    return OK;
  27. }

  28. Status CreateSMatrix(CrossList *M)
  29. { /* 创建稀疏矩阵M,采用十字链表存储表示。算法5.4 */
  30.    int i,j,k,m,n,t;
  31.    ElemType e;
  32.    OLNode *p,*q;
  33.    if((*M).rhead)
  34.      DestroySMatrix(M);
  35.    printf("请输入稀疏矩阵的行数 列数 非零元个数: ");
  36.    scanf("%d%d%d",&m,&n,&t);
  37.    (*M).mu=m;
  38.    (*M).nu=n;
  39.    (*M).tu=t;
  40.    (*M).rhead=(OLink*)malloc((m+1)*sizeof(OLink));
  41.    if(!(*M).rhead)
  42.      exit(OVERFLOW);
  43.    (*M).chead=(OLink*)malloc((n+1)*sizeof(OLink));
  44.    if(!(*M).chead)
  45.      exit(OVERFLOW);
  46.    for(k=1;k<=m;k++) /* 初始化行头指针向量;各行链表为空链表 */
  47.      (*M).rhead[k]=NULL;
  48.    for(k=1;k<=n;k++) /* 初始化列头指针向量;各列链表为空链表 */
  49.      (*M).chead[k]=NULL;
  50.    printf("请按任意次序输入%d个非零元的行 列 元素值:\n",(*M).tu);
  51.    for(k=0;k<t;k++)
  52.    {
  53.      scanf("%d%d%d",&i,&j,&e);
  54.      p=(OLNode*)malloc(sizeof(OLNode));
  55.      if(!p)
  56.        exit(OVERFLOW);
  57.      p->i=i; /* 生成结点 */
  58.      p->j=j;
  59.      p->e=e;
  60.      if((*M).rhead[i]==NULL||(*M).rhead[i]->j>j) /* p插在该行的第一个结点处 */
  61.      {
  62.        p->right=(*M).rhead[i];
  63.        (*M).rhead[i]=p;
  64.      }
  65.      else /* 寻查在行表中的插入位置 */
  66.      {
  67.        for(q=(*M).rhead[i];q->right&&q->right->j<j;q=q->right);
  68.        p->right=q->right; /* 完成行插入 */
  69.        q->right=p;
  70.      }
  71.      if((*M).chead[j]==NULL||(*M).chead[j]->i>i) /* p插在该列的第一个结点处 */
  72.      {
  73.        p->down=(*M).chead[j];
  74.        (*M).chead[j]=p;
  75.      }
  76.      else /* 寻查在列表中的插入位置 */
  77.      {
  78.        for(q=(*M).chead[j];q->down&&q->down->i<i;q=q->down);
  79.        p->down=q->down; /* 完成列插入 */
  80.        q->down=p;
  81.      }
  82.    }
  83.    return OK;
  84. }

  85. Status PrintSMatrix(CrossList M)
  86. { /* 初始条件: 稀疏矩阵M存在。操作结果: 按行或按列输出稀疏矩阵M */
  87.    int i,j;
  88.    OLink p;
  89.    printf("%d行%d列%d个非零元素\n",M.mu,M.nu,M.tu);
  90.    printf("请输入选择(1.按行输出 2.按列输出): ");
  91.    scanf("%d",&i);
  92.    switch(i)
  93.    {
  94.      case 1: for(j=1;j<=M.mu;j++)
  95.              {
  96.                p=M.rhead[j];
  97.                while(p)
  98.                {
  99.                  printf("%d行%d列值为%d\n",p->i,p->j,p->e);
  100.                  p=p->right;
  101.                }
  102.              }
  103.              break;
  104.      case 2: for(j=1;j<=M.nu;j++)
  105.              {
  106.                p=M.chead[j];
  107.                while(p)
  108.                {
  109.                  printf("%d行%d列值为%d\n",p->i,p->j,p->e);
  110.                  p=p->down;
  111.                }
  112.              }
  113.    }
  114.    return OK;
  115. }

  116. Status CopySMatrix(CrossList M,CrossList *T)
  117. { /* 初始条件: 稀疏矩阵M存在。操作结果: 由稀疏矩阵M复制得到T */
  118.    int i;
  119.    OLink p,q,q1,q2;
  120.    if((*T).rhead)
  121.      DestroySMatrix(T);
  122.    (*T).mu=M.mu;
  123.    (*T).nu=M.nu;
  124.    (*T).tu=M.tu;
  125.    (*T).rhead=(OLink*)malloc((M.mu+1)*sizeof(OLink));
  126.    if(!(*T).rhead)
  127.      exit(OVERFLOW);
  128.    (*T).chead=(OLink*)malloc((M.nu+1)*sizeof(OLink));
  129.    if(!(*T).chead)
  130.      exit(OVERFLOW);
  131.    for(i=1;i<=M.mu;i++) /* 初始化矩阵T的行头指针向量;各行链表为空链表 */
  132.      (*T).rhead[i]=NULL;
  133.    for(i=1;i<=M.nu;i++) /* 初始化矩阵T的列头指针向量;各列链表为空链表 */
  134.      (*T).chead[i]=NULL;
  135.    for(i=1;i<=M.mu;i++) /* 按行复制 */
  136.    {
  137.      p=M.rhead[i];
  138.      while(p) /* 没到行尾 */
  139.      {
  140.        q=(OLNode*)malloc(sizeof(OLNode)); /* 生成结点 */
  141.        if(!q)
  142.          exit(OVERFLOW);
  143.        q->i=p->i; /* 给结点赋值 */
  144.        q->j=p->j;
  145.        q->e=p->e;
  146.        if(!(*T).rhead[i]) /* 插在行表头 */
  147.          (*T).rhead[i]=q1=q;
  148.        else /* 插在行表尾 */
  149.          q1=q1->right=q;
  150.        if(!(*T).chead[q->j]) /* 插在列表头 */
  151.        {
  152.          (*T).chead[q->j]=q;
  153.          q->down=NULL;
  154.        }
  155.        else /* 插在列表尾 */
  156.        {
  157.          q2=(*T).chead[q->j];
  158.          while(q2->down)
  159.            q2=q2->down;
  160.          q2->down=q;
  161.          q->down=NULL;
  162.        }
  163.        p=p->right;
  164.      }
  165.      q->right=NULL;
  166.    }
  167.    return OK;
  168. }

  169. Status AddSMatrix(CrossList M,CrossList N,CrossList *Q)
  170. { /* 初始条件: 稀疏矩阵M与N的行数和列数对应相等。 */
  171.    /* 操作结果: 求稀疏矩阵的和Q=M+N */
  172.    int i,k;
  173.    OLink p,pq,pm,pn;
  174.    OLink *col;
  175.    if(M.mu!=N.mu||M.nu!=N.nu)
  176.    {
  177.      printf("两个矩阵不是同类型的,不能相加\n");
  178.      exit(OVERFLOW);
  179.    }
  180.    (*Q).mu=M.mu; /* 初始化Q矩阵 */
  181.    (*Q).nu=M.nu;
  182.    (*Q).tu=0; /* 元素个数的初值 */
  183.    (*Q).rhead=(OLink*)malloc(((*Q).mu+1)*sizeof(OLink));
  184.    if(!(*Q).rhead)
  185.      exit(OVERFLOW);
  186.    (*Q).chead=(OLink*)malloc(((*Q).nu+1)*sizeof(OLink));
  187.    if(!(*Q).chead)
  188.      exit(OVERFLOW);
  189.    for(k=1;k<=(*Q).mu;k++) /* 初始化Q的行头指针向量;各行链表为空链表 */
  190.      (*Q).rhead[k]=NULL;
  191.    for(k=1;k<=(*Q).nu;k++) /* 初始化Q的列头指针向量;各列链表为空链表 */
  192.      (*Q).chead[k]=NULL;
  193.    col=(OLink*)malloc(((*Q).nu+1)*sizeof(OLink)); /* 生成指向列的最后结点的数组 */
  194.    if(!col)
  195.      exit(OVERFLOW);
  196.    for(k=1;k<=(*Q).nu;k++) /* 赋初值 */
  197.      col[k]=NULL;
  198.    for(i=1;i<=M.mu;i++) /* 按行的顺序相加 */
  199.    {
  200.      pm=M.rhead[i]; /* pm指向矩阵M的第i行的第1个结点 */
  201.      pn=N.rhead[i]; /* pn指向矩阵N的第i行的第1个结点 */
  202.      while(pm&&pn) /* pm和pn均不空 */
  203.      {
  204.        if(pm->j<pn->j) /* 矩阵M当前结点的列小于矩阵N当前结点的列 */
  205.        {
  206.          p=(OLink)malloc(sizeof(OLNode)); /* 生成矩阵Q的结点 */
  207.          if(!p)
  208.            exit(OVERFLOW);
  209.          (*Q).tu++; /* 非零元素数加1 */
  210.          p->i=i; /* 给结点赋值 */
  211.          p->j=pm->j;
  212.          p->e=pm->e;
  213.          p->right=NULL;
  214.          pm=pm->right; /* pm指针向右移 */
  215.        }
  216.        else if(pm->j>pn->j) /* 矩阵M当前结点的列大于矩阵N当前结点的列 */
  217.        {
  218.          p=(OLink)malloc(sizeof(OLNode)); /* 生成矩阵Q的结点 */
  219.          if(!p)
  220.            exit(OVERFLOW);
  221.          (*Q).tu++; /* 非零元素数加1 */
  222.          p->i=i; /* 给结点赋值 */
  223.          p->j=pn->j;
  224.          p->e=pn->e;
  225.          p->right=NULL;
  226.          pn=pn->right; /* pn指针向右移 */
  227.        }
  228.        else if(pm->e+pn->e) /* 矩阵M、N当前结点的列相等且两元素之和不为0 */
  229.        {
  230.          p=(OLink)malloc(sizeof(OLNode)); /* 生成矩阵Q的结点 */
  231.          if(!p)
  232.            exit(OVERFLOW);
  233.          (*Q).tu++; /* 非零元素数加1 */
  234.          p->i=i; /* 给结点赋值 */
  235.          p->j=pn->j;
  236.          p->e=pm->e+pn->e;
  237.          p->right=NULL;
  238.          pm=pm->right; /* pm指针向右移 */
  239.          pn=pn->right; /* pn指针向右移 */
  240.        }
  241.        else /* 矩阵M、N当前结点的列相等且两元素之和为0 */
  242.        {
  243.          pm=pm->right; /* pm指针向右移 */
  244.          pn=pn->right; /* pn指针向右移 */
  245.          continue;
  246.        }
  247.        if((*Q).rhead[i]==NULL) /* p为该行的第1个结点 */
  248.          (*Q).rhead[i]=pq=p; /* p插在该行的表头且pq指向p(该行的最后一个结点) */
  249.        else /* 插在pq所指结点之后 */
  250.        {
  251.          pq->right=p; /* 完成行插入 */
  252.          pq=pq->right; /* pq指向该行的最后一个结点 */
  253.        }
  254.        if((*Q).chead[p->j]==NULL) /* p为该列的第1个结点 */
  255.          (*Q).chead[p->j]=col[p->j]=p; /* p插在该列的表头且col[p->j]指向p */
  256.        else /* 插在col[p->]所指结点之后 */
  257.        {
  258.          col[p->j]->down=p; /* 完成列插入 */
  259.          col[p->j]=col[p->j]->down; /* col[p->j]指向该列的最后一个结点 */
  260.        }
  261.      }
  262.      while(pm) /* 将矩阵M该行的剩余元素插入矩阵Q */
  263.      {
  264.        p=(OLink)malloc(sizeof(OLNode)); /* 生成矩阵Q的结点 */
  265.        if(!p)
  266.          exit(OVERFLOW);
  267.        (*Q).tu++; /* 非零元素数加1 */
  268.        p->i=i; /* 给结点赋值 */
  269.        p->j=pm->j;
  270.        p->e=pm->e;
  271.        p->right=NULL;
  272.        pm=pm->right; /* pm指针向右移 */
  273.        if((*Q).rhead[i]==NULL) /* p为该行的第1个结点 */
  274.          (*Q).rhead[i]=pq=p; /* p插在该行的表头且pq指向p(该行的最后一个结点) */
  275.        else /* 插在pq所指结点之后 */
  276.        {
  277.          pq->right=p; /* 完成行插入 */
  278.          pq=pq->right; /* pq指向该行的最后一个结点 */
  279.        }
  280.        if((*Q).chead[p->j]==NULL) /* p为该列的第1个结点 */
  281.          (*Q).chead[p->j]=col[p->j]=p; /* p插在该列的表头且col[p->j]指向p */
  282.        else /* 插在col[p->j]所指结点之后 */
  283.        {
  284.          col[p->j]->down=p; /* 完成列插入 */
  285.          col[p->j]=col[p->j]->down; /* col[p->j]指向该列的最后一个结点 */
  286.        }
  287.      }
  288.      while(pn) /* 将矩阵N该行的剩余元素插入矩阵Q */
  289.      {
  290.        p=(OLink)malloc(sizeof(OLNode)); /* 生成矩阵Q的结点 */
  291.        if(!p)
  292.          exit(OVERFLOW);
  293.        (*Q).tu++; /* 非零元素数加1 */
  294.        p->i=i; /* 给结点赋值 */
  295.        p->j=pn->j;
  296.        p->e=pn->e;
  297.        p->right=NULL;
  298.        pn=pn->right; /* pm指针向右移 */
  299.        if((*Q).rhead[i]==NULL) /* p为该行的第1个结点 */
  300.          (*Q).rhead[i]=pq=p; /* p插在该行的表头且pq指向p(该行的最后一个结点) */
  301.        else /* 插在pq所指结点之后 */
  302.        {
  303.          pq->right=p; /* 完成行插入 */
  304.          pq=pq->right; /* pq指向该行的最后一个结点 */
  305.        }
  306.        if((*Q).chead[p->j]==NULL) /* p为该列的第1个结点 */
  307.          (*Q).chead[p->j]=col[p->j]=p; /* p插在该列的表头且col[p->j]指向p */
  308.        else /* 插在col[p->j]所指结点之后 */
  309.        {
  310.          col[p->j]->down=p; /* 完成列插入 */
  311.          col[p->j]=col[p->j]->down; /* col[p->j]指向该列的最后一个结点 */
  312.        }
  313.      }
  314.    }
  315.    for(k=1;k<=(*Q).nu;k++)
  316.      if(col[k]) /* k列有结点 */
  317.        col[k]->down=NULL; /*  令该列最后一个结点的down指针为空 */
  318.    free(col);
  319.    return OK;
  320. }

  321. Status SubtSMatrix(CrossList M,CrossList N,CrossList *Q)
  322. { /* 初始条件: 稀疏矩阵M与N的行数和列数对应相等。 */
  323.    /* 操作结果: 求稀疏矩阵的差Q=M-N */
  324.    int i,k;
  325.    OLink p,pq,pm,pn;
  326.    OLink *col;
  327.    if(M.mu!=N.mu||M.nu!=N.nu)
  328.    {
  329.      printf("两个矩阵不是同类型的,不能相加\n");
  330.      exit(OVERFLOW);
  331.    }
  332.    (*Q).mu=M.mu; /* 初始化Q矩阵 */
  333.    (*Q).nu=M.nu;
  334.    (*Q).tu=0; /* 元素个数的初值 */
  335.    (*Q).rhead=(OLink*)malloc(((*Q).mu+1)*sizeof(OLink));
  336.    if(!(*Q).rhead)
  337.      exit(OVERFLOW);
  338.    (*Q).chead=(OLink*)malloc(((*Q).nu+1)*sizeof(OLink));
  339.    if(!(*Q).chead)
  340.      exit(OVERFLOW);
  341.    for(k=1;k<=(*Q).mu;k++) /* 初始化Q的行头指针向量;各行链表为空链表 */
  342.      (*Q).rhead[k]=NULL;
  343.    for(k=1;k<=(*Q).nu;k++) /* 初始化Q的列头指针向量;各列链表为空链表 */
  344.      (*Q).chead[k]=NULL;
  345.    col=(OLink*)malloc(((*Q).nu+1)*sizeof(OLink)); /* 生成指向列的最后结点的数组 */
  346.    if(!col)
  347.      exit(OVERFLOW);
  348.    for(k=1;k<=(*Q).nu;k++) /* 赋初值 */
  349.      col[k]=NULL;
  350.    for(i=1;i<=M.mu;i++) /* 按行的顺序相加 */
  351.    {
  352.      pm=M.rhead[i]; /* pm指向矩阵M的第i行的第1个结点 */
  353.      pn=N.rhead[i]; /* pn指向矩阵N的第i行的第1个结点 */
  354.      while(pm&&pn) /* pm和pn均不空 */
  355.      {
  356.        if(pm->j<pn->j) /* 矩阵M当前结点的列小于矩阵N当前结点的列 */
  357.        {
  358.          p=(OLink)malloc(sizeof(OLNode)); /* 生成矩阵Q的结点 */
  359.          if(!p)
  360.            exit(OVERFLOW);
  361.          (*Q).tu++; /* 非零元素数加1 */
  362.          p->i=i; /* 给结点赋值 */
  363.          p->j=pm->j;
  364.          p->e=pm->e;
  365.          p->right=NULL;
  366.          pm=pm->right; /* pm指针向右移 */
  367.        }
  368.        else if(pm->j>pn->j) /* 矩阵M当前结点的列大于矩阵N当前结点的列 */
  369.        {
  370.          p=(OLink)malloc(sizeof(OLNode)); /* 生成矩阵Q的结点 */
  371.          if(!p)
  372.            exit(OVERFLOW);
  373.          (*Q).tu++; /* 非零元素数加1 */
  374.          p->i=i; /* 给结点赋值 */
  375.          p->j=pn->j;
  376.          p->e=-pn->e;
  377.          p->right=NULL;
  378.          pn=pn->right; /* pn指针向右移 */
  379.        }
  380.        else if(pm->e-pn->e) /* 矩阵M、N当前结点的列相等且两元素之差不为0 */
  381.        {
  382.          p=(OLink)malloc(sizeof(OLNode)); /* 生成矩阵Q的结点 */
  383.          if(!p)
  384.            exit(OVERFLOW);
  385.          (*Q).tu++; /* 非零元素数加1 */
  386.          p->i=i; /* 给结点赋值 */
  387.          p->j=pn->j;
  388.          p->e=pm->e-pn->e;
  389.          p->right=NULL;
  390.          pm=pm->right; /* pm指针向右移 */
  391.          pn=pn->right; /* pn指针向右移 */
  392.        }
  393.        else /* 矩阵M、N当前结点的列相等且两元素之差为0 */
  394.        {
  395.          pm=pm->right; /* pm指针向右移 */
  396.          pn=pn->right; /* pn指针向右移 */
  397.          continue;
  398.        }
  399.        if((*Q).rhead[i]==NULL) /* p为该行的第1个结点 */
  400.          (*Q).rhead[i]=pq=p; /* p插在该行的表头且pq指向p(该行的最后一个结点) */
  401.        else /* 插在pq所指结点之后 */
  402.        {
  403.          pq->right=p; /* 完成行插入 */
  404.          pq=pq->right; /* pq指向该行的最后一个结点 */
  405.        }
  406.        if((*Q).chead[p->j]==NULL) /* p为该列的第1个结点 */
  407.          (*Q).chead[p->j]=col[p->j]=p; /* p插在该列的表头且col[p->j]指向p */
  408.        else /* 插在col[p->]所指结点之后 */
  409.        {
  410.          col[p->j]->down=p; /* 完成列插入 */
  411.          col[p->j]=col[p->j]->down; /* col[p->j]指向该列的最后一个结点 */
  412.        }
  413.      }
  414.      while(pm) /* 将矩阵M该行的剩余元素插入矩阵Q */
  415.      {
  416.        p=(OLink)malloc(sizeof(OLNode)); /* 生成矩阵Q的结点 */
  417.        if(!p)
  418.          exit(OVERFLOW);
  419.        (*Q).tu++; /* 非零元素数加1 */
  420.        p->i=i; /* 给结点赋值 */
  421.        p->j=pm->j;
  422.        p->e=pm->e;
  423.        p->right=NULL;
  424.        pm=pm->right; /* pm指针向右移 */
  425.        if((*Q).rhead[i]==NULL) /* p为该行的第1个结点 */
  426.          (*Q).rhead[i]=pq=p; /* p插在该行的表头且pq指向p(该行的最后一个结点) */
  427.        else /* 插在pq所指结点之后 */
  428.        {
  429.          pq->right=p; /* 完成行插入 */
  430.          pq=pq->right; /* pq指向该行的最后一个结点 */
  431.        }
  432.        if((*Q).chead[p->j]==NULL) /* p为该列的第1个结点 */
  433.          (*Q).chead[p->j]=col[p->j]=p; /* p插在该列的表头且col[p->j]指向p */
  434.        else /* 插在col[p->j]所指结点之后 */
  435.        {
  436.          col[p->j]->down=p; /* 完成列插入 */
  437.          col[p->j]=col[p->j]->down; /* col[p->j]指向该列的最后一个结点 */
  438.        }
  439.      }
  440.      while(pn) /* 将矩阵N该行的剩余元素插入矩阵Q */
  441.      {
  442.        p=(OLink)malloc(sizeof(OLNode)); /* 生成矩阵Q的结点 */
  443.        if(!p)
  444.          exit(OVERFLOW);
  445.        (*Q).tu++; /* 非零元素数加1 */
  446.        p->i=i; /* 给结点赋值 */
  447.        p->j=pn->j;
  448.        p->e=-pn->e;
  449.        p->right=NULL;
  450.        pn=pn->right; /* pm指针向右移 */
  451.        if((*Q).rhead[i]==NULL) /* p为该行的第1个结点 */
  452.          (*Q).rhead[i]=pq=p; /* p插在该行的表头且pq指向p(该行的最后一个结点) */
  453.        else /* 插在pq所指结点之后 */
  454.        {
  455.          pq->right=p; /* 完成行插入 */
  456.          pq=pq->right; /* pq指向该行的最后一个结点 */
  457.        }
  458.        if((*Q).chead[p->j]==NULL) /* p为该列的第1个结点 */
  459.          (*Q).chead[p->j]=col[p->j]=p; /* p插在该列的表头且col[p->j]指向p */
  460.        else /* 插在col[p->j]所指结点之后 */
  461.        {
  462.          col[p->j]->down=p; /* 完成列插入 */
  463.          col[p->j]=col[p->j]->down; /* col[p->j]指向该列的最后一个结点 */
  464.        }
  465.      }
  466.    }
  467.    for(k=1;k<=(*Q).nu;k++)
  468.      if(col[k]) /* k列有结点 */
  469.        col[k]->down=NULL; /* 令该列最后一个结点的down指针为空 */
  470.    free(col);
  471.    return OK;
  472. }

  473. Status MultSMatrix(CrossList M,CrossList N,CrossList *Q)
  474. { /* 初始条件: 稀疏矩阵M的列数等于N的行数。操作结果: 求稀疏矩阵乘积Q=M*N */
  475.    int i,j,e;
  476.    OLink q,p0,q0,q1,q2;
  477.    InitSMatrix(Q);
  478.    (*Q).mu=M.mu;
  479.    (*Q).nu=N.nu;
  480.    (*Q).tu=0;
  481.    (*Q).rhead=(OLink*)malloc(((*Q).mu+1)*sizeof(OLink));
  482.    if(!(*Q).rhead)
  483.      exit(OVERFLOW);
  484.    (*Q).chead=(OLink*)malloc(((*Q).nu+1)*sizeof(OLink));
  485.    if(!(*Q).chead)
  486.      exit(OVERFLOW);
  487.    for(i=1;i<=(*Q).mu;i++) /* 初始化矩阵Q的行头指针向量;各行链表为空链表 */
  488.      (*Q).rhead[i]=NULL;
  489.    for(i=1;i<=(*Q).nu;i++) /* 初始化矩阵Q的列头指针向量;各列链表为空链表 */
  490.      (*Q).chead[i]=NULL;
  491.    for(i=1;i<=(*Q).mu;i++)
  492.      for(j=1;j<=(*Q).nu;j++)
  493.      {
  494.        p0=M.rhead[i];
  495.        q0=N.chead[j];
  496.        e=0;
  497.        while(p0&&q0)
  498.        {
  499.          if(q0->i<p0->j)
  500.            q0=q0->down; /* 列指针后移 */
  501.          else if(q0->i>p0->j)
  502.            p0=p0->right; /* 行指针后移 */
  503.          else /* q0->i==p0->j */
  504.          {
  505.            e+=p0->e*q0->e; /* 乘积累加 */
  506.            q0=q0->down; /* 行列指针均后移 */
  507.            p0=p0->right;
  508.          }
  509.        }
  510.        if(e) /* 值不为0 */
  511.        {
  512.          (*Q).tu++; /* 非零元素数加1 */
  513.          q=(OLink)malloc(sizeof(OLNode)); /* 生成结点 */
  514.          if(!q) /* 生成结点失败 */
  515.            exit(OVERFLOW);
  516.          q->i=i; /* 给结点赋值 */
  517.          q->j=j;
  518.          q->e=e;
  519.          q->right=NULL;
  520.          q->down=NULL;
  521.          if(!(*Q).rhead[i]) /* 行表空时插在行表头 */
  522.            (*Q).rhead[i]=q1=q;
  523.          else /* 否则插在行表尾 */
  524.            q1=q1->right=q;
  525.          if(!(*Q).chead[j]) /* 列表空时插在列表头 */
  526.            (*Q).chead[j]=q;
  527.          else /* 否则插在列表尾 */
  528.          {
  529.            q2=(*Q).chead[j]; /* q2指向j行第1个结点 */
  530.            while(q2->down)
  531.              q2=q2->down; /* q2指向j行最后1个结点 */
  532.            q2->down=q;
  533.          }
  534.        }
  535.      }
  536.    return OK;
  537. }

  538. Status TransposeSMatrix(CrossList M,CrossList *T)
  539. { /* 初始条件: 稀疏矩阵M存在。操作结果: 求稀疏矩阵M的转置矩阵T */
  540.    int u,i;
  541.    OLink *head,p,q,r;
  542.    if((*T).rhead)
  543.      DestroySMatrix(T);
  544.    CopySMatrix(M,T); /* T=M */
  545.    u=(*T).mu; /* 交换(*T).mu和(*T).nu */
  546.    (*T).mu=(*T).nu;
  547.    (*T).nu=u;
  548.    head=(*T).rhead; /* 交换(*T).rhead和(*T).chead */
  549.    (*T).rhead=(*T).chead;
  550.    (*T).chead=head;
  551.    for(u=1;u<=(*T).mu;u++) /* 对T的每一行 */
  552.    {
  553.      p=(*T).rhead[u]; /* p为行表头 */
  554.      while(p) /* 没到表尾,对T的每一结点 */
  555.      {
  556.        q=p->down; /* q指向下一个结点 */
  557.        i=p->i; /* 交换.i和.j */
  558.        p->i=p->j;
  559.        p->j=i;
  560.        r=p->down; /* 交换.down.和right */
  561.        p->down=p->right;
  562.        p->right=r;
  563.        p=q; /* p指向下一个结点 */
  564.      }
  565.    }
  566.    return OK;
  567. }
复制代码


回复

使用道具 举报

Archiver|手机版|小黑屋|三木电子社区 ( 辽ICP备11000133号-4 )

辽公网安备 21021702000620号

GMT+8, 2025-12-8 00:49 , Processed in 0.045675 second(s), 23 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表