回 帖 发 新 帖 刷新版面

主题:请问如何设计一个能进行稀疏矩阵基本运算的运算题。(采用三元组表示)

[em18][em12]

回复列表 (共5个回复)

沙发

给点思想啊。

板凳

数据结构的书上不是有完整的算法吗?

3 楼

是呀。给点C语言的思想呀。。

4 楼

/*====三元组的存储结构==========*/
 #include<stdio.h>
 #define maxsize 100
 #define m 3
 #define n 4
 typedef int elemtype;
 typedef struct
 {
     int r;
     int c;
     elemtype d;
   }tupnode;
 typedef  struct
 {
     int rows;
     int cols;
     int nums;
     tupnode data[maxsize];

    }tsmatrix;

 reatemat(tsmatrix *t,int a[m][n])             /*创建三元组存储*/
 {
    int i,j;
    t->rows=m;
    t->cols=n;
    t->nums=0;
    for(i=0;i<m;i++)
     { for(j=0;j<n;j++)
       if(a[i][j]!=0)
        {
         t->data[t->nums].r=i;
         t->data[t->nums].c=j;
         t->data[t->nums].d=a[i][j];
         t->nums++;
          }
      }

    }

 void display( tsmatrix *t)
 {
    int i;
    if(t->nums<0)return;
    printf("\t%d\t%d\t%d\n",t->rows,t->cols,t->nums);
    printf("======================================\n");
    for(i=0;i<t->nums;i++)
       printf("\t%d\t%d\t%d\n",t->data[i].r,t->data[i].c,t->data[i].d);
     }

 void main(void)
 {
    int i,j;
    tsmatrix t,tb ;
    int b[m][n]={{0,0,0,4},
                 {2,0,0,5},
                 {0,0,0,8}};
    reatemat(&t,b) ;
    display(&t);
    printf("\n\n\n\n");
    system("pause");
      }

5 楼

求和运算:
#include<stdio.h>
#include<malloc.h>
#define MaxNum 100
typedef int datatype;
typedef struct 
{
    int i;
    int j;
    datatype  data;
}A;
typedef struct 
{
    int m;
    int n;
    int total;
    A item[MaxNum];
}B;
void  add(B a,B b,B *c)
 {
    int i;
    int j;
    int k=0;
    for(i=0,j=0;i<a.total&&j<b.total;)
    {
        if(a.item[i].i==b.item[j].i)
        {
            if(a.item[i].j==b.item[j].j)
            {
                c->item[k].i=a.item[i].i;
                c->item[k].j=a.item[i].j;
                c->item[k].data=a.item[i].data+b.item[j].data;
                i++; j++; k++;
            }

            else if(a.item[i].j<b.item[j].j)
            {
                c->item[k].i=a.item[i].i;
                c->item[k].j=a.item[i].j;
                c->item[k].data=a.item[i].data;
                i++; k++;
            }


            else if(a.item[i].j>b.item[j].j)
            {
                c->item[k].i=b.item[i].i;
                c->item[k].j=b.item[i].j;
                c->item[k].data=b.item[i].data;
                j++; k++;
            }
        }

        else if(a.item[i].i<b.item[j].i)
            {
                c->item[k].i=a.item[i].i;
                c->item[k].j=a.item[i].j;
                c->item[k].data=a.item[i].data;
                i++;  k++;
            }

        else if(a.item[i].j>b.item[j].j)
            {
                c->item[k].i=b.item[i].i;
                c->item[k].j=b.item[i].j;
                c->item[k].data=b.item[i].data;
                j++; k++;
            }
    }
    c->n=a.n;
    c->m=a.m;
    c->total=k;
}
main()
{
    B a={10,10,6,{{1,1,1},{1,4,2},{5,5,30},{8,2,4},{9,3,5},{9,4,6}}};
    B b={10,10,5,{{1,1,1},{3,2,3},{4,4,20},{8,2,4},{9,3,5},{9,3,5}}};
    B c;
    int k,m,n;
    add(a,b,&c);
    printf("after adding put out the result:\n");
    for(k=0;k<c.total;k++)
    {
        printf("i=%d\tj=%d\tdata=%d\n",c.item[k].i,c.item[k].j,c.item[k].data);
    }
    k=0;
    printf("after adding put out the matrix\n");
    for(m=0;m<c.m;m++)
    {
        for(n=0;n<c.n;n++)
        {
            if(c.item[k].i==m&&c.item[k].j)
            {
               printf("%d\t",c.item[k].data);
               k++;
            }
            else printf("%d\t",0);
        }
        printf("\n");
    }

    
}
    





我来回复

您尚未登录,请登录后再回复。点此登录或注册