稀疏矩阵加法稀疏矩阵加法
#include
#include
#define maxsize 30
typedef struct{
int i,j;
float e;
}haha;
typedef struct hehe{
int rows;
int cols;
int nums;
haha data[maxsize];
}hehe,*friday;
void createform(friday &m)
{
m=(friday)malloc(sizeof(hehe)); looop: printf("请输入...
稀疏矩阵加法
#include
#include
#define maxsize 30
typedef struct{
int i,j;
float e;
}haha;
typedef struct hehe{
int rows;
int cols;
int nums;
haha data[maxsize];
}hehe,*friday;
void createform(friday &m)
{
m=(friday)malloc(sizeof(hehe)); looop: printf("请输入矩阵的行数,列数,非零元个数: ");
scanf("%d%d%d",&m->rows,&m->cols,&m->nums);
while(m->rows<=0||m->cols<=0||m->nums<=0||m->nums>m->cols*m->rows)
{
printf("对不起,输入不满足,请重新输入: ");
scanf("%d%d%d",&m->rows,&m->cols,&m->nums);
}
if(m->nums>maxsize)
{
printf("非零元素超过最大分配空间,请重新分配元素空间");
return ;
}
printf("请输入非零元行标,列标,大小: \n");
for(int l=0;lnums;)
{
scanf("%d%d%f",&m->data[l].i,&m->data[l].j,&m->data[l].e);
if(m->data[l].i>m->rows||m->data[l].i<1||m->data[l].j>m->cols||m->data[l].j<1)
printf("输入的行列不合法,此次输入无效,请继续输入\n");
else
{
if(m->data[l].e==0)
printf("输入的必须是非零元元素,此次输入无效,请继续输入\n");
else
l++;
}
}
int t1,t2;
float t;
for(int p=0;pnums-1;p++)
for(int q=1;qnums;q++)
{
if(m->data[p].i>m->data[q].i||(m->data[p].i==m->data[q].i&&m->data[p].j>m->data[q].j))
{
t1=m->data[p].i;
m->data[p].i=m->data[q].i;
m->data[q].i=t1;
t2=m->data[p].j;
m->data[p].j=m->data[q].j;
m->data[q].j=t2;
t=m->data[p].e;
m->data[p].e=m->data[q].e;
m->data[q].e=t;
}
}
for( p=0;pnums-1;p++)
for(int q=1;qnums;q++)
{
if(m->data[p].i==m->data[q].i&&m->data[p].j==m->data[q].j)
{
printf("非零元素在同一位置连续出现,矩阵构造失败,请重新构造:\n");
goto looop;
}
}
}
void matadd(friday a,friday b,friday &c)
{
int x=0,y=0,z=0;
float v;
while(xnums&&ynums)
{
if(a->data[x].i==b->data[y].i)
{
if(a->data[x].jdata[y].j)
{
c->data[z].i=a->data[x].i;
c->data[z].j=a->data[x].j;
c->data[z].e=a->data[x].e;
z++;x++;
}
else
{
if(a->data[x].j>b->data[y].j)
{
c->data[z].i=b->data[y].i;
c->data[z].j=b->data[y].j;
c->data[z].e=b->data[y].e;
z++;y++;
}
else
{
v=a->data[x].e+b->data[y].e;
if(v!=0)
{
c->data[z].i=a->data[x].i;
c->data[z].j=a->data[x].j;
c->data[z].e=v;
z++;
}
x++;y++;
}
}
}
else
if(a->data[x].idata[y].i)
{
c->data[z].i=a->data[x].i;
c->data[z].j=a->data[x].j;
c->data[z].e=a->data[x].e;
z++;x++;
}
else
{
c->data[z].i=b->data[y].i;
c->data[z].j=b->data[y].j;
c->data[z].e=b->data[y].e;
z++;y++;
}
}
if(ynums)
{
c->data[z].i=b->data[y].i;
c->data[z].j=b->data[y].j;
c->data[z].e=b->data[y].e;
z++; y++;
}
if(xnums)
{
c->data[z].i=a->data[x].i;
c->data[z].j=a->data[x].j;
c->data[z].e=a->data[x].e;
z++; x++;
}
c->nums=z;c->rows=a->rows;c->cols=a->cols;
return ;
}
void print(friday m)
{
printf("\t%d\t%d\t%d\n",m->rows,m->cols,m->nums);
printf("\t-------------------\n");
for(int o=0;onums;o++)
printf("\t%d\t%d\t%f\n",m->data[o].i,m->data[o].j,m->data[o].e);
}
void wxinyongheng()
{
friday a,b,c;
createform(a);
printf("a矩阵创建成功\n");
loop: createform(b);
printf("b矩阵创建成功\n");
if(a->rows!=b->rows||a->cols!=b->cols)
{
printf("两矩阵必须满足行列分别相等,矩阵b不满足要求,请重新构造\n");
goto loop;
}
c=(friday)malloc(sizeof(hehe));
matadd(a,b,c);
printf("b矩阵创建成功\n");
printf("a矩阵的三元组: \n");
print(a);
printf("b矩阵的三元组: \n");
print(b);
printf("相加后c矩阵的三元组: \n");
print(c);
free(a);
free(b);
free(c); }
void main() {
wxinyongheng();
}
程序功能展示:
本文档为【稀疏矩阵加法】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。