[C] 十字链表表示的稀疏矩阵相加 →→→→→进入此内容的聊天室

来自 , 2020-04-10, 写在 C, 查看 118 次.
URL http://www.code666.cn/view/44cd7a8f
  1. typedef struct node
  2. {
  3.         int row, col;
  4.         struct node *down , *right;
  5.         union v_next
  6.         {
  7.                 datatype v;
  8.                 struct node *next;
  9.         }
  10. } MNode,*MLink;
  11.  
  12.  
  13. MLink AddMat ( Ha,Hb )
  14. MLink Ha,Hb;
  15. {
  16.         Mnode *p,*q,*pa,*pb,*ca,*cb,*qa;
  17.         if ( Ha->row!=Hb->row || Ha->col!=Hb->col ) return NULL;
  18.         ca=Ha->v_next.next; /*ca 初始指向A 矩阵中第一行表头结点*/
  19.         cb=Hb->v_next.next; /*cb 初始指向B 矩阵中第一行表头结点*/
  20.         do
  21.         {
  22.                 pa=ca->right; /*pa 指向A 矩阵当前行中第一个结点*/
  23.                 qa=ca; /*qa 是pa 的前驱*/
  24.                 pb=cb->right; /*pb 指向B 矩阵当前行中第一个结点*/
  25.                 while ( pb->col!=0 ) /*当前行没有处理完*/
  26.                 {
  27.                         if ( pa->col < pb->col && pa->col !=0 ) /*第三种情况*/
  28.                         {
  29.                                 qa=pa;
  30.                                 pa=pa->right;
  31.                         }
  32.                         else if ( pa->col > pb->col || pa->col ==0 ) /*第四种情况*/
  33.                         {
  34.                                 p=malloc ( sizeof ( MNode ) );
  35.                                 p->row=pb->row;
  36.                                 p->col=pb->col;
  37.                                 p->v=pb->v;
  38.                                 p->right=pa;
  39.                                 qa->right=p; /* 新结点插入*pa 的前面*/
  40.                                 pa=p;
  41.                                 /*新结点还要插到列链表的合适位置,先找位置,再插入*/
  42.                                 q=Find_JH ( Ha,p->col ); /*从列链表的头结点找起*/
  43.                                 while ( q->down->row!=0 && q->down->row<p->row )
  44.                                         q=q->down;
  45.                                 p->down=q->down; /*插在*q 的后面*/
  46.                                 q->down=p;
  47.                                 pb=pb->right;
  48.                         } /* if */
  49.                         else /*第一、二种情况*/
  50.                         {
  51.                                 x= pa->v_next.v+ pb->v_next.v;
  52.                                 if ( x==0 ) /*第二种情况*/
  53.                                 {
  54.                                         qa->right=pa->right;
  55.                                         ./*从行链中删除*/
  56.                                         /*还要从列链中删除,找*pa 的列前驱结点*/
  57.                                         q= Find_JH ( Ha,pa->col ); /*从列链表的头结点找起*/
  58.                                         while ( q->down->row < pa->row )
  59.                                                 q=q->down;
  60.                                         q->down=pa->down;
  61.                                         free ( pa );
  62.                                         pa=qa;
  63.                                 } /*if (x==0)*/
  64.                                 else /*第一种情况*/
  65.                                 {
  66.                                         pa->v_next.v=x;
  67.                                         qa=pa;
  68.                                 }
  69.                                 pa=pa->right;
  70.                                 pb=pb->right;
  71.                         }
  72.                 } /*while*/
  73.                 ca=ca->v_next.next; /*ca 指向A 中下一行的表头结点*/
  74.                 cb=cb->v_next.next; /*cb 指向B 中下一行的表头结点*/
  75.         }
  76.         while ( ca->row==0 ) /*当还有未处理完的行则继续*/
  77.                 return Ha;
  78. }
  79.  
  80. <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>

回复 "十字链表表示的稀疏矩阵相加"

这儿你可以回复上面这条便签

captcha