永发信息网

急!!!稀疏矩阵三元组实现两个矩阵相加?程序有误!求高手帮忙!!

答案:2  悬赏:0  手机版
解决时间 2021-02-10 07:32
  • 提问者网友:送舟行
  • 2021-02-10 02:47
题目如下
A(x)=x(12)^4+4x(1)+1
B(x)=3x(7)^6+x(1)^2+2x(1)
C(X)=A(x)+B(x)
x右边的括号是下标

我使用顺序存储的方法,望高手帮我看看错在哪了
mytc运行后显示:64行 变量语法错误
也就是进行加法的那个函数

#include
#include
#define MaxTerms 100
#define MaxRows 100
#define MaxColumns 100
typedef int ElemType;

struct Triple {
int row,col;
ElemType val;
};
struct SMatrix{
int m, n, t;
struct Triple sm[MaxTerms+1];
};

void InitMatrix(struct SMatrix* M)
{
M->m=0;
M->n=0;
M->t=0;
}

void InputMatrix(struct SMatrix* M,int m,int n)
{

int k=0;
int row,col;
ElemType val;
M->m=m;M->n=n;
printf("input the row col and val:\n");
scanf("%d %d %d",&row,&col,&val);
while(row!=0)
{
k++;
M->sm[k].row=row;
M->sm[k].col=col;
M->sm[k].val=val;
scanf("&d &d &d",&row,&col,&val);
}
M->t=k;
}

void OutputMatrix(struct SMatrix* M)
{
int i;
printf("(");
for(i=1;it;i++)
{
printf("(%d,&d,&d),",M->sm[i].row,M->sm[i].col,M->sm[i].val);
}
if(M->t!=0)
{
printf("(%d,&d,&d)",M->sm[M->t].row,M->sm[M->t].col,M->sm[M->t].val);
}
printf(")\n");
}

void AddMatrix(smat A,smat B,smar C)
{
int i=1,j=1,k=1;
while(i<=A[0][2] && j<=B[0][2])
if(A[i][0]==B[j][0])
if(A[i][1] {
C[k][0]=A[i][0];
C[k][1]=A[i][1];
C[k][2]=A[i][2];
k++;i++;
}
else if(A[i][1]>B[j][1])
{
C[k][0]=B[j][0];
C[k][1]=B[j][1];
C[k][2]=B[j][2];
k++;j++;
}
else
{
C[k][0]=B[j][0];
C[k][1]=B[j][1];
C[k][2]=A[i][2]+B[j][2];
k++;i++;j++;
}
else if(A[i][0] {
C[k][0]=A[i][0]; C[k][1]=A[i][1];
C[k][2]=A[i][2];
k++; i++;
}
else
{
C[k][0]=B[j][0]; C[k][1]=B[j][1];
C[k][2]=B[j][2];
k++; j++;
}
while(i<=A[0][2])
{
C[k][0]=A[i][0]; C[k][1]=A[i][1];
C[k][2]=A[i][2];
k++; i++;
}
while(j<=B[0][2])
{
C[k][0]=B[j][0]; C[k][1]=B[j][1];
C[k][2]=B[j][2];
k++; j++;
}
}

void main()
{
struct SMatrix s1,s2,s3;
InitMatrix(&s1);
InputMatrix(&s1,12,7);
OutputMatrix(&s1);
InitMatrix(&s2);
InputMatrix(&s2,12,7);
OutputMatrix(&s2);
InitMatrix(&s1);
InputMatrix(&s3,12,7);
AddMatrix(&s1,&s2,&s3);
OutputMatrix(s3);
}
最佳答案
  • 五星知识达人网友:狂恋
  • 2021-02-10 03:12
这是c++版本的 如果用tc要去掉#include 将中文提示换成英文的

#include
#include
#include
#include
#define MAXSIZE 1000

typedef struct
{
int x,y;
int value;
}element;

typedef struct
{
element data[MAXSIZE+1];
int m,n,length;
}tip;

tip *a;
tip *b;
tip *jvzhenanswer;
int i,j,k,l,o,p,q;

void clear(int i,int j,int k)
{
if(i==0)
{
jvzhenanswer->data[k].x=b->data[j].x;
jvzhenanswer->data[k].y=b->data[j].y;
jvzhenanswer->data[k].value=b->data[j].value;
}
else
{
jvzhenanswer->data[k].x=a->data[i].x;
jvzhenanswer->data[k].y=a->data[i].y;
jvzhenanswer->data[k].value=a->data[i].value;
}
}
void add(void)
{
if (a->m!=b->m||a->n!=b->n)
{
printf("error");
return;
}
jvzhenanswer->m=a->m;
jvzhenanswer->n=a->n;
for(i=1,j=1,k=1;i<=a->length||j<=b->length;)
{
if(i>a->length)
{
like(0,j,k);
j++;k++;
continue;
}
if(j>b->length)
{
like(i,0,k);
i++;k++;
continue;
}
if(a->data[i].xdata[j].x)
{
like(i,0,k);
i++;k++;
continue;
}
if(a->data[i].x>b->data[j].x)
{
like(0,j,k);
j++;k++;
continue;
}
if(a->data[i].x==b->data[j].x)
{
if(a->data[i].ydata[j].y)
{
like(i,0,k);
i++;k++;
continue;
}
if(a->data[i].y>b->data[j].y)
{
like(0,j,k);
j++;k++;
continue;
}
if(a->data[i].y==b->data[j].y)
{
jvzhenanswer->data[k].value=a->data[i].value+b->data[j].value;
jvzhenanswer->data[k].x=a->data[i].x;
jvzhenanswer->data[k].y=a->data[i].y;
if(jvzhenanswer->data[k].value==0)
i++;j++;k++;
continue;
}
}
}
jvzhenanswer->length=k-1;
}

void input(int z)
{
printf("请输入第%d个矩阵的行列数 以逗号隔开\n",z);
i=0;
a->data[0].x=1;
b->data[0].x=1;
if(z==1)
{

scanf("%d,%d",&a->m,&a->n);
printf("请输入矩阵元素,以 0,0,0 结束\n");
while(a->data[i].x!=0)
{
i++;
printf("请输入第%d个非零元素的坐标及值\t",i);
scanf("%d,%d,%d",&a->data[i].x,&a->data[i].y,&a->data[i].value);

}
a->length=i-1;
return;
}
else
{
scanf("%d,%d",&b->m,&b->n);
printf("请输入矩阵元素,以 0,0,0 结束年\n");
while(b->data[i].x!=0)
{
i++;
printf("请输入第%d个非零元素的坐标及值\t",i);
scanf("%d,%d,%d",&b->data[i].x,&b->data[i].y,&b->data[i].value);

}
b->length=i-1;
return;
}
}

void output()
{
k=1;
for(i=1;i<=jvzhenanswer->m;i++)
{
for(j=1;j<=jvzhenanswer->n;j++)
{
if(jvzhenanswer->data[k].x>i||(jvzhenanswer->data[k].x==i&&jvzhenanswer->data[k].y>j))
{
printf("0\t");
}
else
{
printf("%d\t",jvzhenanswer->data[k].value);
k++;
}
}
printf("\n");
}

}

void main()
{

char c;
long temp;
a=(tip *)malloc(sizeof(tip));
b=(tip *)malloc(sizeof(tip));
jvzhenanswer=(tip *)malloc(sizeof(tip));
for(i=1;i<=MAXSIZE+1;i++) jvzhenanswer->data[i].value=0;
input(1);
input(2);
add();
output();
printf("\n\nthank you!! \n\tcopyright 2006\n\tclear\n");
getche();
}
全部回答
  • 1楼网友:等灯
  • 2021-02-10 04:24
#include <iostream> #include <iomanip> using namespace std; int hang; int lie; struct node {     int ha,li;     int value; }; //创建三元组稀疏矩阵 node *credit() {     cout<<"请输入矩阵的非零元素个数:";     int sum;     cin>>sum;     node * a;     a=new node[sum+1];     a[0].value=sum;     cout<<"请输入每个非零元素的具体信息:"<<endl;     for(int i=1;i<=sum;i++)         cin>>a[i].ha>>a[i].li>>a[i].value;     return a; } //将三元组矩阵转换成行列式 int display(const node *a) {     int m=1;     for(int i=1;i<=hang;i++)     {         for(int j=1;j<=lie;j++)         {             if((m<=a[0].value)&&a[m].ha==i&&a[m].li==j)             {                 cout<<setw(4)<<a[m].value;                 m++;             }             else                 cout<<setw(4)<<"0";         }         cout<<endl;     }     return 0; } node *add(const node *a,const node *b) {     int a,b,c;     a=b=c=1;//a,b,c分别用来表示三元组的下标     int c_sum;     if((a[0].value+b[0].value)<(hang*lie))         c_sum=a[0].value+b[0].value;     else         c_sum=hang*lie;     node *c=new node[c_sum+1];     for(int i=1;i<=hang;i++)     {         while((a[a].ha)==i&&(b[b].ha)==i)//两结点在同一行         {             if((a[a].li)<(b[b].li))//a的a结点的列数小于b的b结点列数             {                 c[c].ha=a[a].ha;                 c[c].li=a[a].li;                 c[c].value=a[a].value;                 a++;                 c++;             }             if((a[a].li)==(b[b].li))//a的a结点的列数等于b的b结点列数             {                 int he=a[a].value+b[b].value;//求两结点之和                 if(he==0)//两结点之和等于0,c的三元组不需要添加元素                 {                     a++;                     b++;                 }                 else                 {                     c[c].ha=a[a].ha;                     c[c].li=a[a].li;                     c[c].value=he;                     a++;                     b++;                     c++;                 }             }             else//a的a结点的列数大于b的b结点列数             {                 c[c].ha=b[a].ha;                 c[c].li=b[a].li;                 c[c].value=b[a].value;                 b++;                 c++;             }         }//while         while((a[a].ha)==i)//只有a三元组剩下第i行的元素         {             c[c].ha=a[a].ha;             c[c].li=a[a].li;             c[c].value=a[a].value;             a++;             c++;         }         while((b[b].ha)==i)//只有b三元组剩下第i行的元素         {             c[c].ha=b[a].ha;             c[c].li=b[a].li;             c[c].value=b[a].value;             b++;             c++;         }     }//for()     c[0].value=c-1;//可以看出当c三元组只有n个元素时,c=n+1;     return c; } int main() {     cout << "hello world!" << endl;     cout<<"请输入两个稀疏矩阵的行数与列数:"<<endl;     cin>>hang>>lie;     node *p1,*p2,*sum;     p1=credit();     cout<<"该矩阵的行列式为:"<<endl;     display(p1);     p2=credit();     cout<<"该矩阵的行列式为:"<<endl;     display(p2);     cout<<"以上两个矩阵的和矩阵为:"<<endl;     sum=add(p1,p2);     display(sum);     delete []p1;     delete []p2;     delete []sum;     return 0; }
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯