匿名用户

1级

2010-02-09 回答

我有一个可以用的。怎么给你?百度hi我吧。

算了,我贴上来吧,由电脑编程网整理:

#include

#include

#define smax 45

typedef int datatype;

typedef struct lnode //结构体和共用体的定义

{

int i,j;

struct lnode *cptr,*rptr;

union

{

struct lnode *next;

datatype v;

}uval;

}link;

int flag=0;

//建立稀疏矩阵的函数,返回十字链表头指针

link *creatlinkmat()

{

link *p,*q,*head,*cp[smax];

int i,j,k,m,n,t,s;

datatype v;

printf("输入行、列,非零元素个数(m,n,t数字间用逗号分隔)");

scanf("%d,%d,%d",&m,&n,&t);//输入行、列,非零元素个数

if(m>n)s=m; else s=n;

head=(link *)malloc(sizeof(link)); //建立十字链表头结点

head->i=m;head->j=n;

cp[0]=head; //cp[]是指针数组,分别指向头结点和行、列表头结点

for(i=1;i<=s;i++) //建立头结点循环链表

{

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个元素(行号i 列号j 值v,数字间用空格分隔):",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;

}

//插入结点函数

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;

//以下是经*p结点插入第i行链表中

q=cp[i];

while((q->rptr!=cp[i])&&(q->rptr->j

q=q->rptr;//在第i行中找第一个列号大于j的结点*(q->rptr)

//找不到时,*q是该行表上的尾结点

p->rptr=q->rptr;

q->rptr=p;//*p插入在*q之后

//以下是将结点插入第j列链表中

q=cp[j];//取第j列表头结点

while((q->cptr!=cp[j])&&(q->cptr->i

q=q->cptr ;//在第j行中找第一个列号大于i的结点*(q->cptr)

//找不到时,*q是该行表上的尾结点

p->cptr=q->cptr;

q->cptr=p;//*p插入在*q之后

}

//输出十字链表的函数

void print(link *a)

{

link *p,*q,*r;//p是控制行q是控制列r是控制输出的格式

int k,col,t,row;

col=a->j;//矩阵a的列数

printf("矩阵为:\n");

p=a->uval.next;//p指向第一个结点(不是头结点)

while(p!=a)

{

q=p->rptr;//p指向这以一行的一个值

if(q==a->cptr)break;//如果行或列处理完了,跳出

r=p;//r指向这一行的头结点

while(q!=p)

{

for(k=1;kj-(r->j);k++)//输出同一行上两非零数据间的零

printf(" 0");

printf("%3d",q->uval.v);//输出那个非零值

q=q->rptr;//q指向这一行的下一个元素

r=r->rptr;//r指向q前面的一个非零元素

}

k=r->j;//k的值是某一行的最后一个非零元的列数

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的表头环链

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的行的都复制到和矩阵中

{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中有元素的列数小于b的,将a中的所有小于b的值都插到c中

{insert(q->i,q->j,q->uval.v,cp);q=q->rptr;}

else if(q->j>v->j)//如果b中有元素的列数小于a的,将a中的所有小于b的值都插到c中

{insert(v->i,v->j,v->uval.v,cp);v=v->rptr;}

else//a、b当前是在同一个位置,判断加的和是否为零,不为零才做加法运算

{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);

}

测试用例:

输入行、列,非零元素个数(m,n,t数字间用逗号分隔)2,2,4

第1个元素(行号i 列号j 值v,数字间用空格分隔):1 1 1

第2个元素(行号i 列号j 值v,数字间用空格分隔):1 2 1

第3个元素(行号i 列号j 值v,数字间用空格分隔):2 1 1

第4个元素(行号i 列号j 值v,数字间用空格分隔):2 2 1

矩阵为:

1 1

1 1

输入行、列,非零元素个数(m,n,t数字间用逗号分隔)2,2,3

第1个元素(行号i 列号j 值v,数字间用空格分隔):1 1 5

第2个元素(行号i 列号j 值v,数字间用空格分隔):1 2 5

第3个元素(行号i 列号j 值v,数字间用空格分隔):2 1 5

矩阵为:

5 5

5 0

和矩阵c为:

矩阵为:

6 6

6 1

请按任意键继续. . .

十字链表计算矩阵乘积 c语言,求用十字链表实现矩阵相加算法(C语言)急!!!...相关推荐

  1. C语言求两个链表的合并点的算法(附完整源码)

    C语言求两个链表的合并点的算法 C语言求两个链表的合并点的算法完整源码(定义,实现,main函数测试) C语言求两个链表的合并点的算法完整源码(定义,实现,main函数测试) #include < ...

  2. c语言求最小公倍数和最大公约数三种算法

    C语言求最小公倍数和最大公约数三种算法(经典) 求最小公倍数算法: 最小公倍数=两整数的乘积÷最大公约数 求最大公约数算法: (1)辗转相除法 有两整数a和b: ① a%b得余数c ② 若c=0,则b ...

  3. C语言求最小公倍数和最大公约数三种算法(经典)

    C语言求最小公倍数和最大公约数三种算法(经典) 最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,其中一个最小的公倍数是他们的最小公倍数,同样地,若干个整数公有的倍数中最小的正整数称为 ...

  4. 单应性矩阵 matlab,matlab 在求定标中单映性矩阵

    从年前就开始编写一个标定的程序,可是总是在不小心程序改动一点,算出来的内参是复数形式,不知道问题出在哪里,构建求单映性矩阵H的矩阵L的时候,如果图像上角点选取不同就会出现很大的差异,今天终于又调试了很 ...

  5. c语言求圆锥的表面积和体积_用C语言求圆锥体积

    展开全部 C语言求圆锥体积的来源自代码如下: #define pi 3.1415/*定义常量pi*/ #include int main() { float v,r,h;/*用float可以计2113 ...

  6. 常见算法:C语言求最小公倍数和最大公约数三种算法

    最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,当中一个最小的公倍数是他们的最小公倍数,相同地,若干个整数公有的倍数中最小的正整数称为它们的最小公倍数,维基百科:定义点击打开链接 求 ...

  7. c语言中最小公倍数算法,常见算法:C语言求最小公倍数和最大公约数三种算法...

    最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,当中一个最小的公倍数是他们的最小公倍数,相同地,若干个整数公有的倍数中最小的正整数称为它们的最小公倍数,维基百科:定义点击打开链接 求 ...

  8. 求最小公倍数c语言最简公式,C语言求最小公倍数和最大公约数三种算法(经典)...

    把以前写的一些经验总结汇个总,方便给未来的学弟学妹们做个参考! --------------------------永远爱你们的:Sakura 最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们 ...

  9. C语言求最小公倍数和最大公约数三种算法(经典)----ACM

    最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,其中一个最小的公倍数是他们的最小公倍数,同样地,若干个整数公有的倍数中最小的正整数称为它们的最小公倍数,维基百科:定义点击打开链接 求 ...

  10. C语言求一万以内的超级素数,用C语言求素数的优化.doc

    用C语言求素数的优化 用C语言求素数的优化 这个程序运行了8个小时,求一亿以内的素数和超级素数. 大家帮忙看看,我求一亿以内的素数和超级素数.从下午5:30开始,一直到零晨0点30才结束.我的电脑配置 ...

最新文章

  1. shell 脚本简单入门
  2. Java8 HashMap实现原理探究
  3. html退出登录_[实战小剧场servletamp;jsp] 用户登录及退出功能实现
  4. JZOJ 3648. 【GDOI2014】beyond
  5. ASP.NET中Server与Request对象的方法
  6. MCSE认证全攻略(初、中、高)
  7. CF1481F-AB Tree【构造,背包】
  8. hdu1540/poj2892 线段数区间合并
  9. 工作项跟踪管理系统需求
  10. Java 初始化 代码块_Java中初始化块详解及实例代码
  11. 用资源管理器右键编译 Visual Studio 解决方案文件
  12. 开博第一篇,附上我开通博客的理由
  13. linux常用进程管理工具及查看
  14. 引用服务器js文件写法,Vue 公共js文件如何放在服务器上引用
  15. 移动前端开发与web前端开发的区别
  16. Intel-80386微处理器(IA-32架构)
  17. BIGEMAP添加在线地图地图数据源
  18. java xap_阻止xap文件在浏览器中缓存
  19. html中的==$0是什么意思
  20. 解决删除凭据管理器后仍然可以访问问题

热门文章

  1. mysql的innodb如何定位锁问题_mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?...
  2. Android开发之EditText自动获取焦点自动弹出软键盘的解决办法
  3. Android开发之ApiCloud模块开发之模块引用第三方库的问题
  4. 服务器无法在此时接受控制信息 iis,iis启动 服务无法在此时接受控制信息。 (异常来自 HRESULT:0x80070425)...
  5. java jframe全屏_Java-将JFrame设置为全屏时,屏幕变黑
  6. win10下 Ubuntu 18.04 LTS 的安装及 rlt8821ce网卡驱动的安装
  7. 在C++中反射调用.NET(二)
  8. 【JAVA基础】四舍五入之7中舍入法
  9. makefile:2: *** 遗漏分隔符 。 停止
  10. 超棒的阿里巴巴矢量图标库——支持IE6