用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c代码库

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

2012-10-10 作者: 神马举报

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


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...