十字链表稀疏矩阵c语言,十字链表表示的稀疏矩阵相加

[c]代码库typedef struct node

{

int row, col;

struct node *down , *right;

union v_next

{

datatype v;

struct node *next;

}

} MNode,*MLink;

MLink AddMat ( Ha,Hb )

MLink Ha,Hb;

{

Mnode *p,*q,*pa,*pb,*ca,*cb,*qa;

if ( Ha->row!=Hb->row || Ha->col!=Hb->col ) return NULL;

ca=Ha->v_next.next; /*ca 初始指向A 矩阵中第一行表头结点*/

cb=Hb->v_next.next; /*cb 初始指向B 矩阵中第一行表头结点*/

do

{

pa=ca->right; /*pa 指向A 矩阵当前行中第一个结点*/

qa=ca; /*qa 是pa 的前驱*/

pb=cb->right; /*pb 指向B 矩阵当前行中第一个结点*/

while ( pb->col!=0 ) /*当前行没有处理完*/

{

if ( pa->col < pb->col && pa->col !=0 ) /*第三种情况*/

{

qa=pa;

pa=pa->right;

}

else if ( pa->col > pb->col || pa->col ==0 ) /*第四种情况*/

{

p=malloc ( sizeof ( MNode ) );

p->row=pb->row;

p->col=pb->col;

p->v=pb->v;

p->right=pa;

qa->right=p; /* 新结点插入*pa 的前面*/

pa=p;

/*新结点还要插到列链表的合适位置,先找位置,再插入*/

q=Find_JH ( Ha,p->col ); /*从列链表的头结点找起*/

while ( q->down->row!=0 && q->down->rowrow )

q=q->down;

p->down=q->down; /*插在*q 的后面*/

q->down=p;

pb=pb->right;

} /* if */

else /*第一、二种情况*/

{

x= pa->v_next.v+ pb->v_next.v;

if ( x==0 ) /*第二种情况*/

{

qa->right=pa->right;

./*从行链中删除*/

/*还要从列链中删除,找*pa 的列前驱结点*/

q= Find_JH ( Ha,pa->col ); /*从列链表的头结点找起*/

while ( q->down->row < pa->row )

q=q->down;

q->down=pa->down;

free ( pa );

pa=qa;

} /*if (x==0)*/

else /*第一种情况*/

{

pa->v_next.v=x;

qa=pa;

}

pa=pa->right;

pb=pb->right;

}

} /*while*/

ca=ca->v_next.next; /*ca 指向A 中下一行的表头结点*/

cb=cb->v_next.next; /*cb 指向B 中下一行的表头结点*/

}

while ( ca->row==0 ) /*当还有未处理完的行则继续*/

return Ha;

}


本文来自【C语言中文网】:http://see.xidian.edu.cn/cpp/html/970.html

694748ed64b9390909c0d88230893790.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值