您的位置:首页 > 其它

稀疏矩阵相加(十字链表实现)

2010-12-19 13:40 549 查看
//十字链表作为存储结构,存储表示随机稀疏矩阵,进行两矩阵的相加运算
#include<stdio.h>
#include<stdlib.h>

typedef struct sex
{
int row,col,val;
struct sex *right,*dowm;
}Node;

Node * Init(int m, int n)
{
int t;
Node *cp;
m>=n?t=m:t=n;
cp=(Node *)malloc( (t+1)*sizeof(Node) );  //开辟一串连续的内存空间
(*cp).row=m;
(*cp).col=n;
(*cp).val=t;     //此表头结点的值域用来记录行列的最大值,以便于后面的开辟空间
for(int i=1;i<=t;i++)
{
cp[i].right=cp+i;
cp[i].dowm=cp+i;   //构成带表头结点的空循环单链表

}

return cp;

}

void CreatCrossList(Node *cp)
{
int t;
Node *s,*temp;
printf("输入非零元的个数t;");
scanf("%d",&t);
printf("输入非零元的坐标及元素值!/n");
for(int i=0;i<t;i++)
{
s=(Node *)malloc( sizeof(Node));
scanf("%d%d%d",&s->row,&(*s).col,&s->val);

temp=cp+s->row;
if( temp->right!=cp+s->row )
while( temp->right!=cp+s->row && temp->right->col<=s->col )
temp=temp->right;
s->right=temp->right;
temp->right=s;            //修改行链表插入位置

temp=cp+s->col;
if( temp->dowm!=cp+s->col )
while( temp->dowm!=cp+s->col && temp->dowm->row<=s->row )
temp=temp->dowm;
s->dowm=temp->dowm;
temp->dowm=s;            //修改列链表插入位置

}
}

void output(Node *cp)
{

Node *temp;
printf("/n稀疏矩阵如下:/n");
for(int i=1;i<=cp->row;i++)
{
temp=cp+i;
while( temp->right!=cp+i )
{
printf("(%d,%d %d)",temp->right->row,temp->right->col,temp->right->val);
temp=temp->right;
}
printf("/n");
}

}

void Insert(Node *cp, Node *s)
{
//此插入函数的作用是:生成目标矩阵

Node *temp;
temp=cp+s->row;   //修改行链表指针
if( temp->right!=cp+s->row )
while( temp->right!=cp+s->row && temp->right->col<=s->col )
temp=temp->right;
s->right=temp->right;
temp->right=s;

temp=cp+s->col;    //修改列链表指针
if( temp->dowm!=cp+s->col )
while( temp->dowm!=cp+s->col && temp->dowm->row<=s->row )
temp=temp->dowm;
s->dowm=temp->dowm;
temp->dowm=s;

}

void addition(Node *cp1, Node *cp2, Node *cp3)
{
int i;
Node *w,*p,*q;
for( i=1; i<=cp2->row && i<=cp3->row; i++)
{
p=cp2+i;
q=cp3+i;
while( p->right!=cp2+i && q->right!=cp3+i )
{
w=(Node *)malloc( sizeof(Node) );
w->row=p->right->row;
if( p->right->col==q->right->col )
{
w->col=p->right->col;
w->val=p->right->val+q->right->val; //相同位置上的元素值相加
p=p->right;
q=q->right;
if( w->val )
Insert(cp1,w);        //把非零元插入到目标矩阵中
}
else if( p->right->col<q->right->col )
{
w->col=p->right->col;
w->val=p->right->val;
p=p->right;
Insert(cp1,w);    //把cp2中的非零元插入到目标矩阵中
}
else
{
w->col=q->right->col;
w->val=q->right->val;
q=q->right;
Insert(cp1,w);    //把cp2中的非零元插入到目标矩阵中
}
}

if( p->right==cp2+i )
while( q->right!=cp3+i )
{
w=(Node *)malloc( sizeof(Node) );
w->row=q->right->row;
w->col=q->right->col;
w->val=q->right->val;
q=q->right;
Insert(cp1,w);    //把cp3中剩余的非零元插入目标矩阵中
}
else if( q->right==cp3+i )
while( p->right!=cp2+i )
{
w=(Node *)malloc( sizeof(Node) );
w->row=p->right->row;
w->col=p->right->col;
w->val=p->right->val;
p=p->right;
Insert(cp1,w);   //把cp2中剩余的非零元插入到目标矩阵中
}
else
;    //两个矩阵同一行中同时结束
}

if( i>cp2->row)
while(i<=cp3->row)
{
//把cp3中剩余行中的非零元插入到目标矩阵中
q=cp3+i;
while( q->right!=cp3+i )
{
w=(Node *)malloc( sizeof(Node) );
w->row=q->right->row;
w->col=q->right->col;
w->val=q->right->val;
q=q->right;
Insert(cp1,w);
}
i++;   //继续下一行
}
else if(i>cp3->row)
while( i<=cp2->row )
{
p=cp2+i;
while( p->right!=cp2+i )
{
w=(Node *)malloc( sizeof(Node) );
w->row=p->right->row;
w->col=p->right->col;
w->val=p->right->val;
p=p->right;
Insert(cp1,w);
}
i++;   //继续下一行
}

}

int main()
{
Node *cp1, *cp2, *cp3;
int a, b;

printf("输入稀疏矩阵cp2的行列数:");
scanf("%d%d",&a,&b);
cp2=Init(a,b);

printf("输入稀疏矩阵cp3的行列数:");
scanf("%d%d",&a,&b);
cp3=Init(a,b);

cp2->row>=cp3->row?a=cp2->row:a=cp3->row;
cp2->col>=cp3->col?b=cp2->col:b=cp3->col;

cp1=Init(a,b);   //开始初始化结果矩阵

printf("/n创建稀疏矩阵cp2:/n");
CreatCrossList(cp2);
printf("/n创建稀疏矩阵cp3:/n");
CreatCrossList(cp3);

output(cp2);
output(cp3);

addition(cp1,cp2,cp3);
printf("/n/n/n两矩阵相加后");
output(cp1);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: