zoukankan      html  css  js  c++  java
  • 稀疏矩阵的加法(用十字链表实现A=A+B)

    描写叙述:

    输入两个稀疏矩阵A和B,用十字链表实现A=A+B,输出它们相加的结果。

    输入:

    第一行输入四个正整数,各自是两个矩阵的行m、列n、第一个矩阵的非零元素的个数t1和第二个矩阵的非零元素的个数t2,接下来的t1+t2行是三元组,各自是第一个矩阵的数据和第二个矩阵的数据, 三元组的第一个元素表示行,第二个元素表示列,第三个元素是该元素的值。

    输出:

    输出相加后的矩阵三元组。

    输入例子:

    3 4 3 2 1 1 1 1 3 1 2 2 2 1 2 1 2 2 3

    输出例子:

    1 1 1 1 2 1 1 3 1 2 2 5


    #include <stdio.h>
    #include<stdlib.h>
    
    typedef struct OLNODE
    {
        int row,col;
        int data;
        struct OLNODE *right,*down;
    } NODE,*LNODE;
    
    typedef struct CORSS
    {
        LNODE *rh,*ch;
        int ra,ca,da;
    } CROSS, *LCROSS;
    
    void Create(LCROSS A);
    
    void PlusToA(LCROSS A,LCROSS B);
    
    void PrintCross(LCROSS A);
    
    int main()
    {
        LCROSS A = (LCROSS)malloc(sizeof(CROSS));
        LCROSS B = (LCROSS)malloc(sizeof(CROSS));
    
        scanf("%d %d %d %d",&A->ra,&A->ca,&A->da,&B->da);
        B->ra = A->ra;
        B->ca = A->ca;
    
        Create(A);
        Create(B);//" 3  4 0 5  创建时B有问题"
        PlusToA(A,B);
        PrintCross(A);
        return 0;
    }
    
    void Create(LCROSS M)
    {
        int i;
        LNODE p,temp;
    
        M->rh = (LNODE *)malloc((M->ra+1)*sizeof(LNODE));
        M->ch = (LNODE *)malloc((M->ca+1)*sizeof(LNODE));
    
        for(i=1; i<=M->ra; i++)
        {
            M->rh[i]=NULL;
        }
        /*for(i=1; i<=M->ca; i++)
        {
            M->ch[i]=NULL;
        }*/
    
        if(M->da != 0)
        {
            for(i=1; i<=M->da; i++)
            {
                p=(LNODE)malloc(sizeof(NODE));
                scanf("%d %d %d",&p->row,&p->col,&p->data);
                if(M->rh[p->row] == NULL)
                {
                    p->right=NULL;
                    M->rh[p->row] = p;
    
                }
                else
                {
                    for(temp=M->rh[p->row];; temp=temp->right)
                    {
                        if(temp->right == NULL)
                        {
                            temp->right = p;
                            p->right =NULL;
                            break;
                        }
                        else if(temp->col < p->col && temp->right->col>p->col)
                        {
                            p->right = temp->right;
                            temp->right = p;
                            break;
                        }
                        else if(temp==M->rh[p->row] && temp->col>p->col)
                        {
                            p->right = temp;
                            temp=p;
                            break;
                        }
                    }
    
    
    
                }
    
       /*         if(M->ch[p->col] == NULL|| M->ch[p->col]->row>(p->row))
                {
    
                    p->down=M->ch[p->col];
                    M->ch[p->col] = p;
                }
                else
                {
                    for(temp=M->ch[p->col]; temp->down && temp->down->row<p->row; temp=temp->down);
    
    
                    p->down = temp->down;
                    temp->down = p;
                }*/
            }
        }
    
    }
    
    void PlusToA(LCROSS A,LCROSS B)
    {
        int i;
        LNODE p,temp1,temp2;
        for(i=1; i<=A->ra; i++)
        {
            if(B->rh[i] == NULL) continue;
            else
            {
                if(A->rh[i] == NULL)
                {
    
                    p=(LNODE)malloc(sizeof(NODE));
                    p->col = B->rh[i]->col;
                    p->row = B->rh[i]->row;
                    p->data = B->rh[i]->data;
                    A->rh[i]=p;
                    p->right = NULL;
                    B->rh[i]=B->rh[i]->right;
    
                }
                if(B->rh[i]==NULL)continue;
                for(temp1=B->rh[i];; temp1=temp1->right)
                {
                    for(temp2=A->rh[i];; temp2=temp2->right)
                    {
                        if(temp2->col == temp1->col)
                        {
                            temp2->data+=temp1->data;
                            break;
                        }
                        else if(temp2==A->rh[i] && temp1->col<temp2->col)
                        {
                            p=(LNODE)malloc(sizeof(NODE));
                            p->col = temp1->col;
                            p->row = temp1->row;
                            p->data = temp1->data;
                            p->right = temp2->right;
                            p->right =temp2;
                            A->rh[i]=p;
                            break;
                        }
                        else if((temp2->right == NULL || temp2->right->col>temp1->col)  && temp1->col>temp2->col)
                        {
                            p=(LNODE)malloc(sizeof(NODE));
                            p->col = temp1->col;
                            p->row = temp1->row;
                            p->data = temp1->data;
                            p->right = temp2->right;
                            temp2->right=p;
                            break;
                        }
    
                    }
    
                    if(temp1->right == NULL) break;
                }
            }
        }
    
    }
    
    
    void PrintCross(LCROSS A)
    {
        int i;
        LNODE p;
        for(i=1; i<=A->ra; i++)
        {
            p=A->rh[i];
            while(p!=NULL)
            {
                printf("%d %d %d
    ",p->row,p->col,p->data);
                p=p->right;
            }
        }
    }
    


    TIP:

    1、仅使用了十字链表中的行链表,列链表被凝视掉了,由于本题中没用。

    2、注意改动链表时一定要改动原链表变量!!

    如,定义链表A。temp=A。改动temp=p不能达到改动链表A=p的目的。


  • 相关阅读:
    如何准备面试复试(1)
    如何应对糟糕的面试官(2)
    美国:经济危机让烟民吸烟量增加
    MOV 指令的注意事项
    一个简单的ajax无刷新翻页的程序
    SQL注入漏洞全接触
    php+mysql非暴力查表的注入语句写法总结
    在你的成长过程中,有五个人非常重要
    爱就在那里,不增不减
    php的一些书籍
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7352416.html
Copyright © 2011-2022 走看看