三木社区

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

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

[复制链接]

1562

主题

1564

帖子

4904

积分

博士

Rank: 8Rank: 8

积分
4904
跳转到指定楼层
楼主
发表于 2017-9-1 08:46:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /* bo5-2.c 三元组稀疏矩阵的基本操作,包括算法5.1(9个) */
  2. Status CreateSMatrix(TSMatrix *M)
  3. { /* 创建稀疏矩阵M */
  4.    int i,m,n;
  5.    ElemType e;
  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",&m,&n,&e);
  16.        k=0;
  17.        if(m<1||m>(*M).mu||n<1||n>(*M).nu) /* 行或列超出范围 */
  18.          k=1;
  19.        if(m<(*M).data[i-1].i||m==(*M).data[i-1].i&&n<=(*M).data[i-1].j) /* 行或列的顺序有错 */
  20.          k=1;
  21.      }while(k);
  22.      (*M).data[i].i=m;
  23.      (*M).data[i].j=n;
  24.      (*M).data[i].e=e;
  25.    }
  26.    return OK;
  27. }

  28. void DestroySMatrix(TSMatrix *M)
  29. { /* 销毁稀疏矩阵M */
  30.    (*M).mu=0;
  31.    (*M).nu=0;
  32.    (*M).tu=0;
  33. }

  34. void PrintSMatrix(TSMatrix M)
  35. { /* 输出稀疏矩阵M */
  36.    int i;
  37.    printf("%d行%d列%d个非零元素。\n",M.mu,M.nu,M.tu);
  38.    printf("行  列  元素值\n");
  39.    for(i=1;i<=M.tu;i++)
  40.      printf("%2d%4d%8d\n",M.data[i].i,M.data[i].j,M.data[i].e);
  41. }

  42. Status CopySMatrix(TSMatrix M,TSMatrix *T)
  43. { /* 由稀疏矩阵M复制得到T */
  44.    (*T)=M;
  45.    return OK;
  46. }

  47. int comp(int c1,int c2) /* 另加 */
  48. { /* AddSMatrix函数要用到 */
  49.    int i;
  50.    if(c1<c2)
  51.      i=1;
  52.    else if(c1==c2)
  53.      i=0;
  54.    else
  55.      i=-1;
  56.    return i;
  57. }

  58. Status AddSMatrix(TSMatrix M,TSMatrix N,TSMatrix *Q)
  59. { /* 求稀疏矩阵的和Q=M+N */
  60.    Triple *Mp,*Me,*Np,*Ne,*Qh,*Qe;
  61.    if(M.mu!=N.mu)
  62.      return ERROR;
  63.    if(M.nu!=N.nu)
  64.      return ERROR;
  65.    (*Q).mu=M.mu;
  66.    (*Q).nu=M.nu;
  67.    Mp=&M.data[1]; /* Mp的初值指向矩阵M的非零元素首地址 */
  68.    Np=&N.data[1]; /* Np的初值指向矩阵N的非零元素首地址 */
  69.    Me=&M.data[M.tu]; /* Me指向矩阵M的非零元素尾地址 */
  70.    Ne=&N.data[N.tu]; /* Ne指向矩阵N的非零元素尾地址 */
  71.    Qh=Qe=(*Q).data; /* Qh、Qe的初值指向矩阵Q的非零元素首地址的前一地址 */
  72.    while(Mp<=Me&&Np<=Ne)
  73.    {
  74.      Qe++;
  75.      switch(comp(Mp->i,Np->i))
  76.      {
  77.        case  1: *Qe=*Mp;
  78.                 Mp++;
  79.                 break;
  80.        case  0: switch(comp(Mp->j,Np->j)) /* M、N矩阵当前非零元素的行相等,继续比较列 */
  81.                 {
  82.                   case  1: *Qe=*Mp;
  83.                            Mp++;
  84.                            break;
  85.                   case  0: *Qe=*Mp;
  86.                            Qe->e+=Np->e;
  87.                            if(!Qe->e) /* 元素值为0,不存入压缩矩阵 */
  88.                              Qe--;
  89.                            Mp++;
  90.                            Np++;
  91.                            break;
  92.                   case -1: *Qe=*Np;
  93.                            Np++;
  94.                 }
  95.                 break;
  96.        case -1: *Qe=*Np;
  97.                 Np++;
  98.      }
  99.    }
  100.    if(Mp>Me) /* 矩阵M的元素全部处理完毕 */
  101.      while(Np<=Ne)
  102.      {
  103.        Qe++;
  104.        *Qe=*Np;
  105.        Np++;
  106.      }
  107.    if(Np>Ne) /* 矩阵N的元素全部处理完毕 */
  108.      while(Mp<=Me)
  109.      {
  110.        Qe++;
  111.        *Qe=*Mp;
  112.        Mp++;
  113.      }
  114.    (*Q).tu=Qe-Qh; /* 矩阵Q的非零元素个数 */
  115.    return OK;
  116. }

  117. Status SubtSMatrix(TSMatrix M,TSMatrix N,TSMatrix *Q)
  118. { /* 求稀疏矩阵的差Q=M-N */
  119.    int i;
  120.    for(i=1;i<=N.tu;i++)
  121.      N.data[i].e*=-1;
  122.    AddSMatrix(M,N,Q);
  123.    return OK;
  124. }

  125. Status MultSMatrix(TSMatrix M,TSMatrix N,TSMatrix *Q)
  126. { /* 求稀疏矩阵的乘积Q=M*N */
  127.    int i,j,h=M.mu,l=N.nu,Qn=0;
  128.    /* h,l分别为矩阵Q的行、列值,Qn为矩阵Q的非零元素个数,初值为0 */
  129.    ElemType *Qe;
  130.    if(M.nu!=N.mu)
  131.      return ERROR;
  132.    (*Q).mu=M.mu;
  133.    (*Q).nu=N.nu;
  134.    Qe=(ElemType *)malloc(h*l*sizeof(ElemType)); /* Qe为矩阵Q的临时数组 */
  135.    /* 矩阵Q的第i行j列的元素值存于*(Qe+(i-1)*l+j-1)中,初值为0 */
  136.    for(i=0;i<h*l;i++)
  137.      *(Qe+i)=0; /* 赋初值0 */
  138.    for(i=1;i<=M.tu;i++) /* 矩阵元素相乘,结果累加到Qe */
  139.      for(j=1;j<=N.tu;j++)
  140.        if(M.data[i].j==N.data[j].i)
  141.          *(Qe+(M.data[i].i-1)*l+N.data[j].j-1)+=M.data[i].e*N.data[j].e;
  142.    for(i=1;i<=M.mu;i++)
  143.      for(j=1;j<=N.nu;j++)
  144.        if(*(Qe+(i-1)*l+j-1)!=0)
  145.        {
  146.          Qn++;
  147.          (*Q).data[Qn].e=*(Qe+(i-1)*l+j-1);
  148.          (*Q).data[Qn].i=i;
  149.          (*Q).data[Qn].j=j;
  150.        }
  151.    free(Qe);
  152.    (*Q).tu=Qn;
  153.    return OK;
  154. }

  155. Status TransposeSMatrix(TSMatrix M,TSMatrix *T)
  156. { /* 求稀疏矩阵M的转置矩阵T。算法5.1 */
  157.    int p,q,col;
  158.    (*T).mu=M.nu;
  159.    (*T).nu=M.mu;
  160.    (*T).tu=M.tu;
  161.    if((*T).tu)
  162.    {
  163.      q=1;
  164.      for(col=1;col<=M.nu;++col)
  165.        for(p=1;p<=M.tu;++p)
  166.          if(M.data[p].j==col)
  167.          {
  168.            (*T).data[q].i=M.data[p].j;
  169.            (*T).data[q].j=M.data[p].i;
  170.            (*T).data[q].e=M.data[p].e;
  171.            ++q;
  172.          }
  173.    }
  174.    return OK;
  175. }
复制代码


回复

使用道具 举报

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

辽公网安备 21021702000620号

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

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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