[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->row<p->row )
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;
}
<br />本文来自【C语言中文网】:<a href="http://see.xidian.edu.cn/cpp/html/970.html" target="_blank">http://see.xidian.edu.cn/cpp/html/970.html</a>