三木社区

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

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

[复制链接]

1562

主题

1564

帖子

4904

积分

博士

Rank: 8Rank: 8

积分
4904
跳转到指定楼层
楼主
发表于 2017-9-1 08:47:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /* bo5-3.c 行逻辑链接稀疏矩阵(存储结构由c5-3.h定义)的基本操作(8个) */
  2. Status CreateSMatrix(RLSMatrix *M)
  3. { /* 创建稀疏矩阵M */
  4.    int i;
  5.    Triple T;
  6.    Status k;
  7.    printf("请输入矩阵的行数,列数,非零元素数:");
  8.    scanf("%d,%d,%d",&(*M).mu,&(*M).nu,&(*M).tu);
  9.    (*M).data[0].i=0; /* 为以下比较做准备 */
  10.    for(i=1;i<=(*M).tu;i++)
  11.    {
  12.      do
  13.      {
  14.        printf("请按行序顺序输入第%d个非零元素所在的行(1~%d),列(1~%d),元素值:",i,(*M).mu,(*M).nu);
  15.        scanf("%d,%d,%d",&T.i,&T.j,&T.e);
  16.        k=0;
  17.        if(T.i<1||T.i>(*M).mu||T.j<1||T.j>(*M).nu) /* 行、列超出范围 */
  18.          k=1;
  19.        if(T.i<(*M).data[i-1].i||T.i==(*M).data[i-1].i&&T.j<=(*M).data[i-1].j) /* 没有按顺序输入非零元素 */
  20.          k=1;
  21.      }while(k); /* 当输入有误,重新输入 */
  22.      (*M).data[i]=T;
  23.    }
  24.    for(i=1;i<=(*M).tu;i++) /* 计算rpos[] */
  25.      if((*M).data[i].i>(*M).data[i-1].i)
  26.        for(T.i=0;T.i<(*M).data[i].i-(*M).data[i-1].i;T.i++)
  27.          (*M).rpos[(*M).data[i].i-T.i]=i;
  28.    for(i=(*M).data[(*M).tu].i+1;i<=(*M).mu;i++) /* 给最后没有非零元素的几行赋值 */
  29.      (*M).rpos[i]=(*M).tu+1;
  30.    return OK;
  31. }

  32. void DestroySMatrix(RLSMatrix *M)
  33. { /* 销毁稀疏矩阵M(使M为0行0列0个非零元素的矩阵) */
  34.    (*M).mu=0;
  35.    (*M).nu=0;
  36.    (*M).tu=0;
  37. }

  38. void PrintSMatrix(RLSMatrix M)
  39. { /* 输出稀疏矩阵M */
  40.    int i;
  41.    printf("%d行%d列%d个非零元素。\n",M.mu,M.nu,M.tu);
  42.    printf("行  列  元素值\n");
  43.    for(i=1;i<=M.tu;i++)
  44.      printf("%2d%4d%8d\n",M.data[i].i,M.data[i].j,M.data[i].e);
  45.    for(i=1;i<=M.mu;i++)
  46.      printf("第%d行的第一个非零元素是本矩阵第%d个元素\n",i,M.rpos[i]);
  47. }

  48. Status CopySMatrix(RLSMatrix M,RLSMatrix *T)
  49. { /* 由稀疏矩阵M复制得到T */
  50.    *T=M;
  51.    return OK;
  52. }

  53. Status AddSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix *Q)
  54. { /* 求稀疏矩阵的和Q=M+N */
  55.    int k,p,q;
  56.    if(M.mu!=N.mu||M.nu!=N.nu)
  57.      return ERROR;
  58.    (*Q).mu=M.mu;
  59.    (*Q).nu=M.nu;
  60.    (*Q).tu=0;
  61.    M.rpos[M.mu+1]=M.tu+1; /* 为方便后面的while循环临时设置 */
  62.    N.rpos[N.mu+1]=N.tu+1;
  63.    for(k=1;k<=M.mu;++k) /* 对于每一行,k指示行号 */
  64.    {
  65.      (*Q).rpos[k]=(*Q).tu+1;
  66.      p=M.rpos[k]; /* p指示M矩阵第k行当前元素的序号 */
  67.      q=N.rpos[k]; /* q指示N矩阵第k行当前元素的序号 */
  68.      while(p<M.rpos[k+1]&&q<N.rpos[k+1])
  69.      { /* M,N矩阵均有第k行元素未处理 */
  70.        if(M.data[p].j==N.data[q].j) /* M矩阵当前元素和N矩阵当前元素的列相同 */
  71.        {
  72.          (*Q).data[(*Q).tu+1].e=M.data[p].e+N.data[q].e;
  73.          if((*Q).data[(*Q).tu+1].e!=0)
  74.          {
  75.            ++(*Q).tu;
  76.            (*Q).data[(*Q).tu].i=k;
  77.            (*Q).data[(*Q).tu].j=M.data[p].j;
  78.          }
  79.          ++p;
  80.          ++q;
  81.        }
  82.        else if(M.data[p].j<N.data[q].j)
  83.        { /* M矩阵当前元素的列<N矩阵当前元素的列 */
  84.          ++(*Q).tu;
  85.          (*Q).data[(*Q).tu].e=M.data[p].e;
  86.          (*Q).data[(*Q).tu].i=k;
  87.          (*Q).data[(*Q).tu].j=M.data[p].j;
  88.          ++p;
  89.        }
  90.        else /* M矩阵当前元素的列>N矩阵当前元素的列 */
  91.        {
  92.          ++(*Q).tu;
  93.          (*Q).data[(*Q).tu].e=N.data[q].e;
  94.          (*Q).data[(*Q).tu].i=k;
  95.          (*Q).data[(*Q).tu].j=N.data[q].j;
  96.          ++q;
  97.        }
  98.      }
  99.      while(p<M.rpos[k+1]) /* M矩阵还有k行的元素未处理 */
  100.      {
  101.        ++(*Q).tu;
  102.        (*Q).data[(*Q).tu].e=M.data[p].e;
  103.        (*Q).data[(*Q).tu].i=k;
  104.        (*Q).data[(*Q).tu].j=M.data[p].j;
  105.        ++p;
  106.      }
  107.      while(q<N.rpos[k+1]) /* N矩阵还有k行的元素未处理 */
  108.      {
  109.        ++(*Q).tu;
  110.        (*Q).data[(*Q).tu].e=N.data[q].e;
  111.        (*Q).data[(*Q).tu].i=k;
  112.        (*Q).data[(*Q).tu].j=N.data[q].j;
  113.        ++q;
  114.      }
  115.    }
  116.    return OK;
  117. }

  118. Status SubtSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix *Q)
  119. { /* 求稀疏矩阵的差Q=M-N */
  120.    int i;
  121.    if(M.mu!=N.mu||M.nu!=N.nu)
  122.      return ERROR;
  123.    for(i=1;i<=N.tu;++i) /* 对于N的每一元素,其值乘以-1 */
  124.      N.data[i].e*=-1;
  125.    AddSMatrix(M,N,Q); /* Q=M+(-N) */
  126.    return OK;
  127. }

  128. Status MultSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix *Q)
  129. { /* 求稀疏矩阵乘积Q=M*N。算法5.3 */
  130.    int arow,brow,p,q,ccol,ctemp[MAXRC+1];
  131.    if(M.nu!=N.mu) /* 矩阵M的列数应和矩阵N的行数相等 */
  132.      return ERROR;
  133.    (*Q).mu=M.mu; /* Q初始化 */
  134.    (*Q).nu=N.nu;
  135.    (*Q).tu=0;
  136.    M.rpos[M.mu+1]=M.tu+1; /* 为方便后面的while循环临时设置 */
  137.    N.rpos[N.mu+1]=N.tu+1;
  138.    if(M.tu*N.tu!=0) /* M和N都是非零矩阵 */
  139.    {
  140.      for(arow=1;arow<=M.mu;++arow)
  141.      { /* 从M的第一行开始,到最后一行,arow是M的当前行 */
  142.        for(ccol=1;ccol<=(*Q).nu;++ccol)
  143.          ctemp[ccol]=0; /* Q的当前行的各列元素累加器清零 */
  144.        (*Q).rpos[arow]=(*Q).tu+1; /* Q当前行的第1个元素位于上1行最后1个元素之后 */
  145.        for(p=M.rpos[arow];p<M.rpos[arow+1];++p)
  146.        { /* 对M当前行中每一个非零元 */
  147.          brow=M.data[p].j; /* 找到对应元在N中的行号(M当前元的列号) */
  148.          for(q=N.rpos[brow];q<N.rpos[brow+1];++q)
  149.          {
  150.            ccol=N.data[q].j; /* 乘积元素在Q中列号 */
  151.            ctemp[ccol]+=M.data[p].e*N.data[q].e;
  152.          }
  153.        } /* 求得Q中第arow行的非零元 */
  154.        for(ccol=1;ccol<=(*Q).nu;++ccol) /* 压缩存储该行非零元 */
  155.          if(ctemp[ccol])
  156.          {
  157.            if(++(*Q).tu>MAXSIZE)
  158.              return ERROR;
  159.            (*Q).data[(*Q).tu].i=arow;
  160.            (*Q).data[(*Q).tu].j=ccol;
  161.            (*Q).data[(*Q).tu].e=ctemp[ccol];
  162.          }
  163.      }
  164.    }
  165.    return OK;
  166. }

  167. Status TransposeSMatrix(RLSMatrix M,RLSMatrix *T)
  168. { /* 求稀疏矩阵M的转置矩阵T */
  169.    int p,q,t,col,*num;
  170.    num=(int *)malloc((M.nu+1)*sizeof(int));
  171.    (*T).mu=M.nu;
  172.    (*T).nu=M.mu;
  173.    (*T).tu=M.tu;
  174.    if((*T).tu)
  175.    {
  176.      for(col=1;col<=M.nu;++col)
  177.        num[col]=0;  /* 设初值 */
  178.      for(t=1;t<=M.tu;++t) /* 求M中每一列非零元个数 */
  179.        ++num[M.data[t].j];
  180.      (*T).rpos[1]=1;
  181.      for(col=2;col<=M.nu;++col) /* 求M中第col中第一个非零元在(*T).data中的序号 */
  182.        (*T).rpos[col]=(*T).rpos[col-1]+num[col-1];
  183.      for(col=1;col<=M.nu;++col)
  184.        num[col]=(*T).rpos[col];
  185.      for(p=1;p<=M.tu;++p)
  186.      {
  187.        col=M.data[p].j;
  188.        q=num[col];
  189.        (*T).data[q].i=M.data[p].j;
  190.        (*T).data[q].j=M.data[p].i;
  191.        (*T).data[q].e=M.data[p].e;
  192.        ++num[col];
  193.      }
  194.    }
  195.    free(num);
  196.    return OK;
  197. }
复制代码


回复

使用道具 举报

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

辽公网安备 21021702000620号

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

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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