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> |