| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1188 人关注过本帖
标题:[求助]关于数组的编程~
只看楼主 加入收藏
HaseoDG
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2006-11-2
收藏
 问题点数:0 回复次数:6 
[求助]关于数组的编程~

1.编写程序,实现利用三元组表进行两个稀疏矩阵相加的算法。

要求:(1)随机产生两个可相加的稀疏矩阵(二维);

(2)将产生的稀疏矩阵用两个三元组表的顺序存储结构存储;

(3)将两稀疏矩阵相加的结果存储在第三个三元组表中。

搜索更多相关主题的帖子: 编写程序 三元 
2006-11-02 11:55
HaseoDG
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2006-11-2
收藏
得分:0 

算法自己也知道~但怎样编程啊~
#define MaxSize 10 //用户自定义
  typedef int DataType; //用户自定义
  typedef struct
   { //定义三元组
    int i,j;
    DataType v;
   }TriTupleNode;

  typedef struct
   { //定义三元组表
    TriTupleNode data[MaxSize];
    int m,n,t;//矩阵行,列及三元组表长度
   }TriTupleTable;

  //以下为矩阵加算法
  void AddTriTuple( TriTupleTable *A, TriTupleTable *B, TriTupleTable *C)
   {//三元组表表示的稀疏矩阵A,B相加
    int k,l;
    DataType temp;
    C->m=A->m;//矩阵行数
    C->n=A->n;//矩阵列数
    C->t=0; //三元组表长度
    k=0; l=0;
    while (k<A->t&&l<B->t)
     {if((A->data[k].i==B->data[l].i)&&(A->data[k].j==B->data[l].j))
       {temp=A->data[k].v+B->data[l].v;
        if (!temp)//相加不为零,加入C
         {C->data[c->t].i=A->data[k].i;
          C->data[c->t].j=A->data[k].j;
          C->data[c->t++].v=temp;
         }
        k++;l++; 
       }
     if ((A->data[k].i==B->data[l].i)&&(A->data[k].j<B->data[l].j))
       ||(A->data[k].i<B->data[l].i)//将A中三元组加入C
      {C->data[c->t].i=A->data[k].i;
       C->data[c->t].j=A->data[k].j;
       C->data[c->t++].v=A->data[k].v;
       k++;
      }
     if ((A->data[k].i==B->data[l].i)&&(A->data[k].j>B->data[l].j))
       ||(A->data[k].i>B->data[l].i)//将B中三元组加入C
      {C->data[c->t].i=B->data[l].i;
       C->data[c->t].j=B->data[l].j;
       C->data[c->t++].v=B->data[l].v;
       l++; 
      }
     }
    while (k<A->t)//将A中剩余三元组加入C
     {C->data[c->t].i=A->data[k].i;
      C->data[c->t].j=A->data[k].j;
      C->data[c->t++].v=A->data[k].v;
      k++;
     }
    while (l<B->t)//将B中剩余三元组加入C
     {C->data[c->t].i=B->data[l].i;
      C->data[c->t].j=B->data[l].j;
      C->data[c->t++].v=B->data[l].v;
      l++;
     }
   }

2006-11-02 12:02
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 

#include "Stdio.h"
#include "Conio.h"

# define MAXSIZE 10 /*假设非零元个数的最大值为10*/
# define MAXRC 10

struct Triple
{
int i,j; /*该非零元的行下标和列下标*/
int e;
};
struct TSMtrix
{
struct Triple data[MAXSIZE+1]; /*非零元三元组表,data[0]未用*/
int rpos[MAXRC+1]; /*各行第一个非零元的位置表*/
int cpos[MAXRC+1]; /*各列第一个非零元的位置表*/
int num[MAXRC+1]; /*各列非零元的个数*/
int mu,nu,tu; /*矩阵的行数、列数和非零元个数*/
};

CreateMtrix(struct TSMtrix *M)
{ /*创建一个稀疏矩阵*/
int i,elem,col,row,mu,nu,tu;

printf("please input matrix col,row,unzeroed numbers:\n");
scanf("%d%d%d",&mu,&nu,&tu);
M->mu=mu;
M->nu=nu;
M->tu=tu;

for (i=1;i<=tu;i++)
{
printf("please input element col,row,value:\n");
scanf("%d%d%d",&col,&row,&elem);

if ( mu<0 || nu<0 || mu>M->mu || nu>M->nu)
{
printf("error!");
i--;
}
else
{
M->data[i].i=col;
M->data[i].j=row;
M->data[i].e=elem;
}

}

}

ShowMtrix(struct TSMtrix M)
{ /*打印出矩阵*/
int i=1,j=1,dir=1;
printf("The matrix is:\n");

for (i=1;i<=M.mu;i++)
{
for (j=1;j<=M.nu;j++)
{
if (M.data[dir].i==i && M.data[dir].j==j) /*存在非零元*/
{
printf("%d ",M.data[dir].e);
dir++;
}
else
printf("0 ");
}
printf("\n");
}
}

FastTransposeSMtrix(struct TSMtrix M,struct TSMtrix *T)
{ /*矩阵的快速转置*/
int t=1,p=1,q,col=M.nu;

T->mu=M.mu;
T->nu=M.nu;
T->tu=M.tu;

if (T->tu)
{
for (col=1;col<=M.nu;col++)
M.num[col]=0;
for (t=1;t<=M.nu;t++)
++M.num[M.data[t].j];
M.cpos[1]=1; /*找到M中cpos的位置*/

for (col=2;col<=M.nu;col++)
M.cpos[col]=M.cpos[col-1]+M.num[col-1];
for (p=1;p<=M.tu;p++)
{
col=M.data[p].j;
q=M.cpos[col];
T->data[q].i=M.data[p].j;
T->data[q].j=M.data[p].i;
T->data[q].e=M.data[p].e;
++M.cpos[col];
}
}
}

MultSMatrix(struct TSMtrix M,struct TSMtrix N,struct TSMtrix *Q)
{ /*稀疏矩阵相乘*/
int i,arow,brow,ccol,t,temp,p,q;
int ctemp[MAXRC+1]={0};

if (M.nu!=N.mu)
printf("Multiply error!");

Q->mu=M.mu;
Q->nu=N.nu;
Q->tu=0; /*Q初始化*/

/*---------------查询M中rpos的位置------------------*/
for (i=1;i<=M.mu;i++)
M.num[i]=0;
for (t=1;t<=M.tu;t++)
++M.num[M.data[t].i];
M.rpos[1]=1;

for (i=2;i<=M.mu;i++)
M.rpos[i]=M.rpos[i-1]+M.num[i-1];

/*---------------查询N中rpos的位置------------------*/
for (i=1;i<=N.mu;i++)
N.num[i]=0;
for (t=1;t<=N.tu;t++)
++N.num[N.data[t].i];
N.rpos[1]=1;

for (i=2;i<=N.mu;i++)
N.rpos[i]=N.rpos[i-1]+N.num[i-1];

/*---------------矩阵的相乘------------------*/
if (M.tu*N.tu!=0) /*Q为非零矩阵*/
{
for (arow=1;arow<=M.mu;arow++)
{
for (i=0;i<=N.nu;i++) /*处理M中的每一行*/
ctemp[i]=0; /*累加器ctemp每次都要清零*/

Q->rpos[arow]=Q->tu+1;

if (arow<M.mu)
temp=M.rpos[arow+1];
else
temp=M.tu+1;

for (p=M.rpos[arow];p<temp;p++) /*对当前行中每一个非零元*/
{
brow=M.data[p].j; /*找到对应元在N中的行号*/

if (brow<N.mu)
t=N.rpos[brow+1];
else
t=N.tu+1;

for (q=N.rpos[brow];q<t;q++)
{
ccol=N.data[q].j; /*乘积元素在Q中列号*/
ctemp[ccol]+=M.data[p].e*N.data[q].e;
}
} /*求得Q中第crow( =arow)行的非零元*/
for (ccol=1;ccol<=Q->nu;ccol++) /*压缩存储该行非零元*/

if (ctemp[ccol])
{
if ( (++Q->tu) > MAXSIZE )
printf("error!");

Q->data[Q->tu].i=arow;
Q->data[Q->tu].j=ccol;
Q->data[Q->tu].e=ctemp[ccol];
}
}
}
else
printf("There's no unzeroed element!");
}

main()
{
struct TSMtrix M;
struct TSMtrix T;
struct TSMtrix Q;
struct TSMtrix N;

CreateMtrix(&M);
ShowMtrix(M);
printf("\n");
CreateMtrix(&T);
ShowMtrix(T);

MultSMatrix(M,T,&Q);
ShowMtrix(Q);
FastTransposeSMtrix(Q,&N);
ShowMtrix(N);
getch();

}
上学期写的


2006-11-02 15:50
HaseoDG
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2006-11-2
收藏
得分:0 
谢谢了~
但相乘和相加........
总之也帮了我不少了~
2006-11-03 00:54
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

#include<stdio.h>
typedef struct{
int data[100][100];
int m,n;
}matrix;
typedef int spmatrix[100][3];

printmatrix(matrix A)/*打印矩阵*/
{ int i,j;
for(i=0;i<A.m;i++)
{ for(j=0;j<A.n;j++)
printf("%3d",A.data[i][j]);
printf("\n");
}
printf("\n");
}

printspmatrix(spmatrix Q)/*打印矩阵的三元组形式*/
{ int i;
for(i=0;i<=Q[0][2];i++)
{printf("%d %d %d",Q[i][0],Q[i][1],Q[i][2]);

printf("\n");
}
printf("\n");
}


void compressmatrix(matrix P,spmatrix T)/*将矩阵转换成三元组形式*/
{ int i,j,k=1;
for(i=0;i<P.m;i++)
for(j=0;j<P.n;j++)
if(P.data[i][j]!=0)
{ T[k][0]=i;
T[k][1]=j;
T[k][2]=P.data[i][j];
k++;
}
T[0][0]=P.m;
T[0][1]=P.n;
T[0][2]=k-1;
}

void add(spmatrix D,spmatrix E,spmatrix C)/*核心函数,矩阵相加*/
{ int i=1,k=1,j=1;
C[0][0]=D[0][0];/*保存行号*/
C[0][1]=D[0][1]; /*保存列号*/

while((i<=D[0][2])&&(j<=E[0][2]))/*循环遍历*/
if(D[i][0]<E[j][0])/*D的行号小于E的行号*/
{ C[k][0]=D[i][0];/*D的行赋给C的行*/
C[k][1]=D[i][1];/*D的列赋给C的列*/
C[k][2]=D[i][2];/*D的值赋给C的值*/
i++;k++;
}
else if(D[i][0]>E[j][0])
{ C[k][0]=E[j][0];
C[k][1]=E[j][1];
C[k][2]=E[j][2];
j++;k++;
}
else if(D[i][1]<E[j][1])
{ C[k][0]=D[i][0];
C[k][1]=D[i][1];
C[k][2]=D[i][2];
i++;k++;
}
else if(D[i][1]>E[j][1])
{ C[k][0]=E[j][0];
C[k][1]=E[j][1];
C[k][2]=E[j][2];
j++;k++;
}
else { C[k][0]=D[i][0];
C[k][1]=D[i][1];
C[k][2]=D[i][2]+E[j][2];
i++;j++;
if(C[k][2]!=0)k++;/*相加等于零*/

}

if((i>D[0][2])&&(j<=E[0][2]))/*D已经遍历完,而E没有*/
while(j<=E[0][2])
{ C[k][0]=E[j][0];
C[k][1]=E[j][1];
C[k][2]=E[j][2];
j++;k++;
}
else if((i<=D[0][2])&&(j>E[0][2]))/*E已经遍历完,而D没有*/
while(i<=D[0][2])
{ C[k][0]=D[i][0];
C[k][1]=D[i][1];
C[k][2]=D[i][2];
j++;k++;
}

C[0][2]=k-1;
}


倚天照海花无数,流水高山心自知。
2006-11-03 10:55
HaseoDG
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2006-11-2
收藏
得分:0 
感谢了~
2006-11-04 09:52
HaseoDG
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2006-11-2
收藏
得分:0 

没有main函数~现在实验中~
实验失败~怎么才能运行啊~

[此贴子已经被作者于2006-11-12 11:26:30编辑过]

2006-11-12 10:35
快速回复:[求助]关于数组的编程~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.044948 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved