十字链表计算矩阵乘积 c语言,求用十字链表实现矩阵相加算法(C语言)急!!!...
匿名用戶
1級(jí)
2010-02-09 回答
我有一個(gè)可以用的。怎么給你?百度hi我吧。
算了,我貼上來吧,由電腦編程網(wǎng)整理:
#include
#include
#define smax 45
typedef int datatype;
typedef struct lnode //結(jié)構(gòu)體和共用體的定義
{
int i,j;
struct lnode *cptr,*rptr;
union
{
struct lnode *next;
datatype v;
}uval;
}link;
int flag=0;
//建立稀疏矩陣的函數(shù),返回十字鏈表頭指針
link *creatlinkmat()
{
link *p,*q,*head,*cp[smax];
int i,j,k,m,n,t,s;
datatype v;
printf("輸入行、列,非零元素個(gè)數(shù)(m,n,t數(shù)字間用逗號(hào)分隔)");
scanf("%d,%d,%d",&m,&n,&t);//輸入行、列,非零元素個(gè)數(shù)
if(m>n)s=m; else s=n;
head=(link *)malloc(sizeof(link)); //建立十字鏈表頭結(jié)點(diǎn)
head->i=m;head->j=n;
cp[0]=head; //cp[]是指針數(shù)組,分別指向頭結(jié)點(diǎn)和行、列表頭結(jié)點(diǎn)
for(i=1;i<=s;i++) //建立頭結(jié)點(diǎn)循環(huán)鏈表
{
p=(link *)malloc(sizeof(link));
p->i=0;p->j=0;
p->rptr=p;p->cptr=p;
cp[i]=p; cp[i-1]->uval.next=p;
}
cp[s]->uval.next=head;
for(k=1;k<=t;k++)
{
printf("\t 第%d個(gè)元素(行號(hào)i 列號(hào)j 值v,數(shù)字間用空格分隔):",k);
scanf("%d%d%d",&i,&j,&v);
p=(link *)malloc(sizeof(link));
p->i=i;p->j=j;p->uval.v=v;
q=cp[i];
while((q->rptr!=cp[i])&&(q->rptr->j
q=q->rptr;
p->rptr=q->rptr;
q->rptr=p;
q=cp[j];
while((q->cptr!=cp[j])&&(q->cptr->i
q=q->cptr;
p->cptr=q->cptr;
q->cptr=p;
}
return head;
}
//插入結(jié)點(diǎn)函數(shù)
void insert(int i,int j,int v,link *cp[])
{
link *p,*q;
p=(link *)malloc(sizeof(link));
p->i=i;p->j=j;p->uval.v=v;
//以下是經(jīng)*p結(jié)點(diǎn)插入第i行鏈表中
q=cp[i];
while((q->rptr!=cp[i])&&(q->rptr->j
q=q->rptr;//在第i行中找第一個(gè)列號(hào)大于j的結(jié)點(diǎn)*(q->rptr)
//找不到時(shí),*q是該行表上的尾結(jié)點(diǎn)
p->rptr=q->rptr;
q->rptr=p;//*p插入在*q之后
//以下是將結(jié)點(diǎn)插入第j列鏈表中
q=cp[j];//取第j列表頭結(jié)點(diǎn)
while((q->cptr!=cp[j])&&(q->cptr->i
q=q->cptr ;//在第j行中找第一個(gè)列號(hào)大于i的結(jié)點(diǎn)*(q->cptr)
//找不到時(shí),*q是該行表上的尾結(jié)點(diǎn)
p->cptr=q->cptr;
q->cptr=p;//*p插入在*q之后
}
//輸出十字鏈表的函數(shù)
void print(link *a)
{
link *p,*q,*r;//p是控制行q是控制列r是控制輸出的格式
int k,col,t,row;
col=a->j;//矩陣a的列數(shù)
printf("矩陣為:\n");
p=a->uval.next;//p指向第一個(gè)結(jié)點(diǎn)(不是頭結(jié)點(diǎn))
while(p!=a)
{
q=p->rptr;//p指向這以一行的一個(gè)值
if(q==a->cptr)break;//如果行或列處理完了,跳出
r=p;//r指向這一行的頭結(jié)點(diǎn)
while(q!=p)
{
for(k=1;kj-(r->j);k++)//輸出同一行上兩非零數(shù)據(jù)間的零
printf(" 0");
printf("%3d",q->uval.v);//輸出那個(gè)非零值
q=q->rptr;//q指向這一行的下一個(gè)元素
r=r->rptr;//r指向q前面的一個(gè)非零元素
}
k=r->j;//k的值是某一行的最后一個(gè)非零元的列數(shù)
for(t=k;t
printf(" 0");
printf("\n");
p=p->uval.next;//p指向下一行
}
}
link *add(link *a,link *b)
{
link *p,*q,*u,*v,*r,*cp[smax],*c;//p,q控制十字鏈a的行列,u,v控制十字鏈b的行列
int s,i;
if(a->i!=b->i||a->j!=b->j)
{ flag=1;return NULL; }
//建立c的表頭環(huán)鏈
c=(link *)malloc(sizeof(link));
c->i=a->i;c->j=a->j;
if(c->i>c->j)s=c->i; else s=c->j;
cp[0]=c;
for(i=1;i<=s;i++)
{
r=(link *)malloc(sizeof(link));
r->i=0;r->j=0;
r->rptr=r;r->cptr=r;
cp[i]=r;
cp[i-1]->uval.next=r;
}
cp[s]->uval.next =c;
//矩陣相加
p=a->uval.next;u=b->uval.next;
while(p!=a&&u!=b)
{
q=p->rptr;v=u->rptr;
if(q==p&&v!=u)//矩陣a中第p行為空,矩陣b的第u行不為空
while(v!=u)//將b的行的都復(fù)制到和矩陣中
{insert(v->i,v->j,v->uval.v,cp);v=v->rptr;}
else if(v==u&&q!=p)//矩陣a中第p行不為空,矩陣b的第u行為空
while(q!=p)
{insert(q->i,q->j,q->uval.v,cp);q=q->rptr;}
else if(q!=p&&v!=u)//矩陣b的第u行和矩陣a的第p行都不為空
{
while(q!=p&&v!=u)
{
if(q->jj)//如果a中有元素的列數(shù)小于b的,將a中的所有小于b的值都插到c中
{insert(q->i,q->j,q->uval.v,cp);q=q->rptr;}
else if(q->j>v->j)//如果b中有元素的列數(shù)小于a的,將a中的所有小于b的值都插到c中
{insert(v->i,v->j,v->uval.v,cp);v=v->rptr;}
else//a、b當(dāng)前是在同一個(gè)位置,判斷加的和是否為零,不為零才做加法運(yùn)算
{if(q->uval.v+v->uval.v!=0)insert(q->i,q->j,(q->uval.v+v->uval.v),cp);
q=q->rptr;v=v->rptr;
}
}
if(q==p&&v!=u)//如果b未處理完,將b中未處理的值都插入到和矩陣中
while(v!=u)
{insert(v->i,v->j,v->uval.v,cp);v=v->rptr;}
else if(v==u&&q!=p)//如果a未處理完,將a中未處理的值都插入到和矩陣中
while(q!=p)
{insert(q->i,q->j,q->uval.v,cp);q=q->rptr;}
else; //都處理完了,什么都不做
}
else ; //矩陣b的第u行和矩陣a的第p行都為空,什么都不做
p=p->uval.next;u=u->uval.next;//a、b都指向下一行
}
return c;
}
//
void main()
{
link *a,*b,*c;
a=creatlinkmat();print(a);
b=creatlinkmat();print(b);
c=add(a,b);
if(flag==1)printf("矩陣a、b不能相加!!");
else printf("和矩陣c為:\n");print(c);
}
測(cè)試用例:
輸入行、列,非零元素個(gè)數(shù)(m,n,t數(shù)字間用逗號(hào)分隔)2,2,4
第1個(gè)元素(行號(hào)i 列號(hào)j 值v,數(shù)字間用空格分隔):1 1 1
第2個(gè)元素(行號(hào)i 列號(hào)j 值v,數(shù)字間用空格分隔):1 2 1
第3個(gè)元素(行號(hào)i 列號(hào)j 值v,數(shù)字間用空格分隔):2 1 1
第4個(gè)元素(行號(hào)i 列號(hào)j 值v,數(shù)字間用空格分隔):2 2 1
矩陣為:
1 1
1 1
輸入行、列,非零元素個(gè)數(shù)(m,n,t數(shù)字間用逗號(hào)分隔)2,2,3
第1個(gè)元素(行號(hào)i 列號(hào)j 值v,數(shù)字間用空格分隔):1 1 5
第2個(gè)元素(行號(hào)i 列號(hào)j 值v,數(shù)字間用空格分隔):1 2 5
第3個(gè)元素(行號(hào)i 列號(hào)j 值v,數(shù)字間用空格分隔):2 1 5
矩陣為:
5 5
5 0
和矩陣c為:
矩陣為:
6 6
6 1
請(qǐng)按任意鍵繼續(xù). . .
總結(jié)
以上是生活随笔為你收集整理的十字链表计算矩阵乘积 c语言,求用十字链表实现矩阵相加算法(C语言)急!!!...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ross Young:采用 MicroL
- 下一篇: c语言 显示 图形界面,「分享」C语言如