稀疏矩阵三元组表示相加问题

zhangpeng12340302 2011-04-16 12:35:17
大家帮我看看,我写的三元组相加程序,哪里写错了?
#include "stdio.h"
#include "string.h"
#define OK 1
#define MAX 10

typedef struct
{
int i,j;
int v;
}TriTupleNode;

typedef struct
{
TriTupleNode data[MAX];
int m;
int n;
int t;
}TSMatrix;

void InitTriTupleNode(TSMatrix *a)
{
int i,j,k,val,maxrow,maxcol;
maxrow=0;
maxcol=0;
k=1;
while (1)
{
printf("input row col val:");
scanf("%d %d %d",&i,&j,&val);
if (i==-1||j==-1)
{
break;
}
a->data[k].i=i;
a->data[k].j=j;
a->data[k].v=val;
if (maxrow<i)
{
maxrow=i;
}
if (maxcol<j)
{
maxcol=j;
}
k++;
}
a->m=maxrow;
a->n=maxcol;
a->t=k-1;
}
void ShowMatrix(TSMatrix *a)
{
int p,q;
int t=1;
for(p=1;p<=a->t;p++)
{
printf("%d %d %d",a->data[p].i,a->data[p].j,a->data[p].v);
printf("\n");
}
printf("\n");
for(p=1;p<=a->m;p++)
{
for(q=1;q<=a->n;q++)
if (a->data[t].i==p&&a->data[t].j==q)
{
printf("%d ",a->data[t].v);
t++;
}
else
printf("0 ");
printf("\n");
}
}

void TransposeSMatrix(TSMatrix *a,TSMatrix *b)
{
int q,col,p;
b->m=a->n;
b->n=a->m;
b->t=a->t;
if (b->t)
{
q=1;
for(col=1;col<=a->n;col++)
for(p=1;p<=a->t;p++)
if (a->data[p].j==col)
{
b->data[q].i=a->data[p].j;
b->data[q].j=a->data[p].i;
b->data[q].v=a->data[p].v;
++q;
}
}
}
void MatrixAdd(TSMatrix *a,TSMatrix *b)
{


int p,q;
for(p=1,q=1;p<=a->t&&q<=b->t;)
{
if (a->data[p].i==b->data[q].i&&a->data[p].j==b->data[q].j)
{
if (a->data[p].v+b->data[q].v)
{
a->data[p].v=a->data[p].v+b->data[q].v;
p++;
q++;
}
else
{
for(int r=p;r<a->t;r++)
{
a->data[r].i=a->data[r+1].i;
a->data[r].j=a->data[r+1].j;
a->data[r].v=a->data[r+1].j;
a->t=a->t-1;
}
q++;
}
}
else if (a->data[p].i>b->data[q].i)
{
for(int r=a->t;r>p;r--)
{
a->data[r].i=a->data[r-1].i;
a->data[r].j=a->data[r-1].j;
a->data[r].v=a->data[r-1].j;
a->t=a->t+1;
}
a->data[p].i=b->data[q].i;
a->data[p].j=b->data[q].j;
a->data[p].v=b->data[q].v;
p++;
q++;
}
else
p++;

}


/*
int p,q;
int k=1;
for(p=1;q=1;p<=a->t&&q<=b->t;)
{
if (a->data[p].i<b->data[q].j)
{
c->data[k].i=a->data[p].i;
c->data[k].j=a->data[p].j;
c->data[k].v=a->data[p].v;
k++;
p++;
}
else if (a->data[p].i==b->data[q].i)
{
if (a->data[p].j==b-) {
}
}
}
*/
}

void main()
{
TSMatrix a,b,c;
TSMatrix *pa=&a,*pb=&b,*pc=&c;
InitTriTupleNode(pa);
/*
printf("稀疏矩阵转置前:\n");
ShowMatrix(pa);
printf("稀疏矩阵转置后:\n");
TransposeSMatrix(pa,pb);
ShowMatrix(pb);
*/
InitTriTupleNode(pc);
MatrixAdd(pa,pc);
printf("两稀疏矩阵的和:\n");
ShowMatrix(pa);
}

运行后,结果不对,请大牛帮我调试一下!!
...全文
742 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangpeng12340302 2011-04-18
  • 打赏
  • 举报
回复
如果有人贴出来三元组相加a=a+b;而不是c=a+b;就好了!!
qq675927952 2011-04-17
  • 打赏
  • 举报
回复

#include "TSMatrix.h"
#include <iostream>
using namespace std;
/*输出三元组表*/
int printSMatrix(TSMatrix& M)
{
for(int i=1;i<=M.tu ;i++)
{
cout<<M.data[i].i<<" "<<M.data[i].j<<" "<<M.data[i].e<<endl;
}
cout<<endl;
return 0;
}

/*采用三元组顺序存储表示,求稀疏矩阵M的转置矩阵T,矩阵是按第一行第一列开始算的,比较慢的转置*/
int TransposeSMatrix(TSMatrix& M,TSMatrix& T)
{
T.mu = M.nu ;
T.nu = M.mu ;
T.tu = M.tu ;
if(T.tu)
{
int q =1; //转置后矩阵 每条记录 在三元组表的 位置
for(int col = 1;col<=M.nu ; ++col) //每列
{
for(int p=1 ; p<=M.tu ; ++p) //M的整个三元组表遍历
{
if(M.data[p].j==col)//M是第p个元素的列值等于col
{
T.data[q].j = M.data[p].i ;
T.data[q].i = M.data[p].j ;
T.data[q].e = M.data[p].e ;
++q;
}

}

}

}
return 0;
}

/*采用三元组顺序存储表示,求稀疏矩阵M的转置矩阵T,矩阵是按第一行第一列开始算的,快速转置*/
int FastTransposeSMatrix( TSMatrix& M,TSMatrix& T)
{
T.mu = M.nu ;
T.nu = M.mu ;
T.tu = M.tu ;
int* num = new int[M.nu+1] ; // num[col]用来表示矩阵M中第col 列中非0元的个数
int* cpos = new int [M.nu+1] ; //cpos[col]用来表示M中第col列的 第一个非0元在T的三元组表的恰当位置
if(T.tu)
{
memset(num,0, (M.nu+1)*sizeof(int) ); //初始化时每列非0元个数为0个

for(int t=1; t<=T.tu ; ++t) ++num[M.data[t].j]; //求每列非0行个数

cpos[1] = 1; //M中第一列 放的位置 在T的三元组表 应该是1

for(int col=2; col<= M.nu ;col++ ) cpos[col] = cpos[col-1] +num[col-1] ;

for(int p=1 ; p<= M.tu ;p++)
{
int col = M.data[p].j ;
int q = 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 ;
++cpos[col] ;

}

}
delete []num ;
delete []cpos;
return 0;
}

/*稀疏矩阵乘法*/
int MultiSMatrix(TSMatrix& A,TSMatrix& B,ElemType** C)
{
// C是已经分配好空间的非压缩二维数组,行数为A.mu,列数为B.nu
// 计算 C = A*B

//算A,B的rpos向量
int* Anum = new int[A.mu+1] ; //A的每行非0元个数
int* Arpos = new int [A.mu+2] ; //A的各行第一个非0元的位置表
int* Bnum = new int [B.mu+1] ;
int* Brpos = new int [B.mu + 2] ; //B的各行第一个非0元的位置表


memset(Anum,0,sizeof(int)*(A.mu+1));
memset(Bnum,0,sizeof(int)*(B.mu+1));
for( int t=1;t<=A.tu ; ++t ) ++Anum[A.data[t].i] ;
for(int t=1 ; t<=B.tu ;++t ) ++Bnum[B.data[t].i] ;

Arpos[1] = 1;
Brpos[1] = 1;
for(int r = 2 ;r<=A.mu ;++r) Arpos[r] = Arpos[r-1] +Anum[r-1] ;
for(int r = 2 ;r<=B.mu ;++r) Brpos[r] = Brpos[r-1] +Bnum[r-1] ;

Arpos[A.mu+1]=A.tu+1; // 为了写代码的方便,Arpos[A.mu+1]当哨兵用
Brpos[B.mu+1] = B.tu+1; //
for( int i=1; i<=A.mu ; i++) //行遍历
{
for (int j=1; j<=B.nu; j++) C[i][j] = 0; //第i行清0
// 取A的第i行中的每一个非0元,与B的对应行相乘,累加到C的第i行中
for(int j=Arpos[i] ; j<Arpos[i+1] ;j++ )//j是A i行上的元素,为A中第i行 在三元组表 的位置
{
int k= A.data[j].j ; //k 为 A的三元组表中第j个元素的列下标,也就是第i行的某个元素的列下标
// 取出A的该非0元列 所对应的B的一行元素 ,即A的列必需和B的行下标相同
for (int s = Brpos[k]; s<Brpos[k+1]; s++ ) //s是B的某k行上的元素
{
int t = B.data[s].j ;
C[i][t] += A.data[j].e * B.data[s].e ;

}

}
}
delete []Anum;
delete []Bnum;
delete []Arpos;
delete []Brpos ;
return 0;
}
int main()
{
TSMatrix M ;
TSMatrix N ;

M.mu = 3 ;
M.nu = 4;
M.tu = 4;
M.data[1].i = 1;
M.data[1].j = 1;
M.data[1].e = 3;

M.data[2].i = 1;
M.data[2].j = 4;
M.data[2].e = 5;

M.data[3].i = 2;
M.data[3].j = 2;
M.data[3].e = -1;

M.data[4].i = 3;
M.data[4].j = 1;
M.data[4].e = 2;

cout<<"转置前的三元组表:"<<endl;
printSMatrix( M) ;
cout<<"比较慢的转置后的三元组表:"<<endl;
TransposeSMatrix( M,N);
printSMatrix( N) ;

cout<<endl<<"转置前的三元组表:"<<endl;
printSMatrix( M) ;
cout<<endl<<"带行向量的快速转置的三元组表:"<<endl;
FastTransposeSMatrix( M,N) ;
printSMatrix( N) ;


N.tu = 4;
N.mu = 4 ;
N.nu = 2;
N.data[1].i = 1;
N.data[1].j = 2;
N.data[1].e = 2;

N.data[2].i = 2;
N.data[2].j = 1;
N.data[2].e = 1;

N.data[3].i = 3;
N.data[3].j = 1;
N.data[3].e = -2;

N.data[4].i = 3;
N.data[4].j = 2;
N.data[4].e = 4;

cout<<"A矩阵的三元组:"<<endl;
printSMatrix( M) ;
cout<<"B矩阵的三元组:"<<endl;
printSMatrix( N) ;
cout<<"A*B后的矩阵:"<<endl;

int** C = new int* [M.mu+1] ;
for(int i=0;i<=M.mu ;i++)
C[i] = new int [N.nu+1] ;

MultiSMatrix(M, N,C);
for(int i=1;i<=M.mu ;i++)
{
for(int j=1;j<=N.nu ;j++)
cout<<C[i][j]<<" ";
cout<<endl;

}
for(int i=0;i<=M.mu ;i++)
delete C[i];
delete C;
system("pause");
return 0;
}



严老师数据结构的源代码.....,以前上数据结构时写的...现在全都忘记了...
qq675927952 2011-04-17
  • 打赏
  • 举报
回复

#define MAXSIZE 20 // 非零元个数的最大值
typedef struct {
int i,j; // 行下标,列下标
ElemType e; // 非零元素值
}Triple;

typedef struct {
Triple data[MAXSIZE+1]; // 非零元三元组表,data[0]未用
int mu,nu,tu; // 矩阵的行数、列数和非零元个数
}TSMatrix;


Status AddTSM(TSMatrix A,TSMatrix B,TSMatrix &C)
/* 三元组表示的稀疏矩阵加法: C=A+B */
{
if(A.mu!=B.mu||A.nu!=B.nu)
return ERROR;
int r,pa,pb,pc;
pa=pb=pc=1;
for (r=1;r<=A.mu&&pa<=A.tu&&pb<=B.tu;r++) { //对每一行处理
while(A.data[pa].i==r&&B.data[pb].i==r) {
if(A.data[pa].j==B.data[pb].j) {
C.data[pc].e=A.data[pa].e+B.data[pb].e;
if(C.data[pc].e) {
C.data[pc].i=r;
C.data[pc].j=A.data[pa].j;
pc++;
}
pa++;pb++;
}
if(A.data[pa].j<B.data[pb].j) {
C.data[pc].i=r;
C.data[pc].j=A.data[pa].j;
C.data[pc].e=A.data[pa].e;
pa++;pc++;
}
else {
C.data[pc].i=r;
C.data[pc].j=B.data[pb].j;
C.data[pc].e=B.data[pb].e;
pb++;pc++;
}
}
while(A.data[pa].i==r) {
C.data[pc].i=r;
C.data[pc].j=A.data[pa].j;
C.data[pc].e=A.data[pa].e;
pa++;pc++;
}
while(B.data[pb].i==r) {
C.data[pc].i=r;
C.data[pc].j=B.data[pb].j;
C.data[pc].e=B.data[pb].e;
pb++;pc++;
}
}
while(pa<=A.tu) { //处理A中剩余元素
C.data[pc].i=A.data[pa].i;
C.data[pc].j=A.data[pa].j;
C.data[pc].e=A.data[pa].e;
pa++;pc++;
}
while(pb<=B.tu) { //处理B中剩余元素
C.data[pc].i=B.data[pb].i;
C.data[pc].j=B.data[pb].j;
C.data[pc].e=B.data[pb].e;
pb++;pc++;
}
C.mu=A.mu;
C.nu=A.nu;
C.tu=pc-1;
}
zhangpeng12340302 2011-04-16
  • 打赏
  • 举报
回复
#include "stdio.h"

#define MAX 10

typedef struct
{
int i,j;
int v;
}TriTupleNode;

typedef struct
{
TriTupleNode data[MAX];
int m;
int n;
int t;
}TSMatrix;

void InitTriTupleNode(TSMatrix *a)//初始化一个三元组
{
int i,j,k,val,maxrow,maxcol;
maxrow=0;
maxcol=0;
k=1;
while (1)
{
printf("input row col val:");
scanf("%d %d %d",&i,&j,&val);
if (i==-1||j==-1)
{
break;
}
a->data[k].i=i;
a->data[k].j=j;
a->data[k].v=val;
if (maxrow<i)
{
maxrow=i;
}
if (maxcol<j)
{
maxcol=j;
}
k++;
}
a->m=maxrow;
a->n=maxcol;
a->t=k-1;
}
void ShowMatrix(TSMatrix *a)//显示一个三元组
{
int p,q;
int t=1;
for(p=1;p<=a->t;p++)
{
printf("%d %d %d",a->data[p].i,a->data[p].j,a->data[p].v);
printf("\n");
}
printf("\n");
for(p=1;p<=a->m;p++)
{
for(q=1;q<=a->n;q++)
if (a->data[t].i==p&&a->data[t].j==q)
{
printf("%d ",a->data[t].v);
t++;
}
else
printf("0 ");
printf("\n");
}
}

void TransposeSMatrix(TSMatrix *a,TSMatrix *b)//转置一个三元组
{
int q,col,p;
b->m=a->n;
b->n=a->m;
b->t=a->t;
if (b->t)
{
q=1;
for(col=1;col<=a->n;col++)
for(p=1;p<=a->t;p++)
if (a->data[p].j==col)
{
b->data[q].i=a->data[p].j;
b->data[q].j=a->data[p].i;
b->data[q].v=a->data[p].v;
++q;
}
}
}
void MatrixAdd(TSMatrix *a,TSMatrix *b)//两个三元组相加加到a上
{


int p,q;
for(p=1,q=1;p<=a->t&&q<=b->t;)
{
if (a->data[p].i==b->data[q].i&&a->data[p].j==b->data[q].j)
{
if (a->data[p].v+b->data[q].v)
{
a->data[p].v=a->data[p].v+b->data[q].v;
p++;
q++;
}
else
{
for(int r=p;r<a->t;r++)
{
a->data[r].i=a->data[r+1].i;
a->data[r].j=a->data[r+1].j;
a->data[r].v=a->data[r+1].j;
a->t=a->t-1;
}
q++;
}
}
else if (a->data[p].i>b->data[q].i)
{
for(int r=a->t;r>p;r--)
{
a->data[r].i=a->data[r-1].i;
a->data[r].j=a->data[r-1].j;
a->data[r].v=a->data[r-1].j;
a->t=a->t+1;
}
a->data[p].i=b->data[q].i;
a->data[p].j=b->data[q].j;
a->data[p].v=b->data[q].v;
p++;
q++;
}
else
p++;

}


}

void main()
{
TSMatrix a,b,c;
TSMatrix *pa=&a,*pb=&b,*pc=&c;
InitTriTupleNode(pa);
/*
printf("稀疏矩阵转置前:\n");
ShowMatrix(pa);
printf("稀疏矩阵转置后:\n");
TransposeSMatrix(pa,pb);
ShowMatrix(pb);
*/
InitTriTupleNode(pc);
MatrixAdd(pa,pc);
printf("两稀疏矩阵的和:\n");
ShowMatrix(pa);
}

zhangpeng12340302 2011-04-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tianwaixiaoxiao 的回复:]
你这个起码来点注释把。。真的看不下去了 ,我也新手 写过这个,给你看看,看是否有帮助

C/C++ code

#include <iostream>
#include <iomanip>
using namespace std;
const int MAXSIZE=100; // 定义非零元素的对多个数
const int MAXROW=10; // 定义数组的……
[/Quote]
你这个是用十字链表写的么?好厉害啊!!我把注释加上了你能帮我看看么?
天外小小 2011-04-16
  • 打赏
  • 举报
回复
你这个起码来点注释把。。真的看不下去了 ,我也新手 写过这个,给你看看,看是否有帮助

#include <iostream>
#include <iomanip>
using namespace std;
const int MAXSIZE=100; // 定义非零元素的对多个数
const int MAXROW=10; // 定义数组的行数的最大值

typedef struct OLNode{ // 定义十字链表元素
int i,j;
int e;
struct OLNode *right,*down; // 该非零元所在行表和列表的后继元素
}OLNode,*OLink;
typedef struct{ // 定义十字链表对象结构体
OLink *rhead,*chead;
int mu,nu,tu; // 系数矩阵的行数,列数,和非零元素个数
}CrossList;
void CreateSMatrix_OL(CrossList & M){ // 创建十字链表
int x,y,m;

cout<<"请输入矩阵的行,列,及非零元素个数"<<endl;
cin>>M.mu>>M.nu>>M.tu;
if(!(M.rhead=(OLink*)malloc((M.mu+1)*sizeof(OLink)))) exit(0);
if(!(M.chead=(OLink*)malloc((M.nu+1)*sizeof(OLink)))) exit(0);
for(x=0;x<=M.mu;x++)
M.rhead[x]=NULL; // 初始化各行,列头指针,分别为NULL
for(x=0;x<=M.nu;x++)
M.chead[x]=NULL;
cout<<"请按三元组的格式输入数组(行,列,值):"<<endl;
for(int i=1;i<=M.tu;i++){
cin>>x>>y>>m; // 按任意顺序输入非零元,(普通三元组形式输入)
OLink p,q;
if(!(p=(OLink)malloc(sizeof(OLNode)))) exit(0); // 开辟新节点,用来存储输入的新元素
p->i=x; p->j=y; p->e=m;
if(M.rhead[x]==NULL||M.rhead[x]->j>y){
p->right=M.rhead[x]; M.rhead[x]=p;
}
else{
for(q=M.rhead[x];(q->right)&&(q->right->j<y);q=q->right); // 查找节点在行表中的插入位置
p->right=q->right; q->right=p; // 完成行插入
}
if(M.chead[y]==NULL||M.chead[y]->i>x){
p->down=M.chead[y]; M.chead[y]=p;
}
else{
for(q=M.chead[y];(q->down)&&(q->down->i<x);q=q->down); // 查找节点在列表中的插入位置
p->down=q->down; q->down=p; // 完成列插入

}
}

}



void OutPutSMatrix_OL(CrossList T){ // 输出十字链表,用普通数组形式输出
for(int i=1;i<=T.mu;i++){
OLink p=T.rhead[i];
for(int j=1;j<=T.nu;j++){
if((p)&&(j==p->j)){
cout<<setw(3)<<p->e; p=p->right;
}
else
cout<<setw(3)<<"0";
}
cout<<endl;
}

}

//矩阵的加法
void AddSMatrix(){
CrossList M,N; // 创建两个十字链表对象,并初始化
CreateSMatrix_OL(M);
CreateSMatrix_OL(N);
cout<<"输入的两矩阵的和矩阵为:"<<endl;
OLink pa,pb,pre ,hl[MAXROW+1]; //定义辅助指针,pa,pb分别为M,N当前比较的元素,pre为pa的前驱元素
for(int x=1;x<=M.nu;x++) hl[x]=M.chead[x];
for(int k=1;k<=M.mu;k++){ // 对M的每一行进行操作
pa=M.rhead[k]; pb=N.rhead[k]; pre=NULL;
while(pb){ // 把N中此行的每个元素取出,
OLink p;
if(!(p=(OLink)malloc(sizeof(OLNode)))) exit(0); // 开辟新节点,存储N中取出的元素
p->e=pb->e; p->i=pb->i; p->j=pb->j;
if(NULL==pa||pa->j>pb->j){ // 当M此行已经检查完或者pb因该放在pa前面

if(NULL==pre)
M.rhead[p->i]=p;
else
pre->right=p;
p->right=pa; pre=p;
if(NULL==M.chead[p->j]){ // 进行列插入
M.chead[p->j]=p; p->down=NULL;
}
else{
p->down=hl[p->j]->down; hl[p->j]->down=p;
}
hl[p->j]=p;
pb=pb->right;
}
else
if((NULL!=pa)&&pa->j<pb->j){ // 如果此时的pb元素因该放在pa后面,则取以后的pa再来比较
pre=pa; pa=pa->right;
}
else
if(pa->j==pb->j){ // 如果pa,pb位于同一个位置上,则将值相加
pa->e += pb->e;
if(!pa->e){ // 如果相加后的和为0,则删除此节点,同时改变此元素坐在行,列的前驱元素的相应值
if(NULL==pre) // 修改行前驱元素值
M.rhead[pa->i]=pa->right;
else
pre->right=pa->right;
p=pa; pa=pa->right;
if(M.chead[p->j]==p) M.chead[p->j]=hl[p->j]=p->down; // 修改列前驱元素值
else
hl[p->j]->down=p->down;
free(p); pb=pb->right;
}
else{
pa=pa->right; pb=pb->right;
}
}

}
}
OutPutSMatrix_OL(M);

}
void main()
{
cout<<"注意矩阵相加,2个矩阵的行,列要相等"<<endl;
AddSMatrix(); //调用矩阵相加函数

}

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧