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