以十字链表为存储结构实现矩阵相加(NOJ理论第13题)

前言

  本来是完整创建了十字链表的,但是交上去TE,然后我以为是构造的问题,就把表示列的数组cols给删了。

  结果是在当相加结果等于0时没有移动结点造成死循环了。

  然后我也懒得改了

思路

  十字链表建立参见这里

  相加的时候先新建一个结点newLine, 作为头结点,然后开始比较两个矩阵的第i行(即rows[i])的列,哪个小哪个接到新链表那里。

  如果相等则相加并移动两个元素。

  以此类推。

  最后循环结束释放空间就行了。

代码实现

#include <stdio.h>

struct Node
{
    int row = 0;
    int col = 0;
    int value = 0;
    Node *down = nullptr;
    Node *right = nullptr;
};

struct CrossList
{
    Node *rows[50] = {0};
    int rowsNum = 0;
    int colsNum = 0;
    int elements = 0;
};

void createList(CrossList* aList, int rowsNum, int colsNum, int elements)
{
    aList->colsNum = colsNum;
    aList->rowsNum = rowsNum;
    aList->elements = elements;

    int row, col, val;
    for (int i = 0; i < elements; i++)
    {
        Node *newNode = new Node;
        scanf("%d%d%d", &row ,&col, &val);
        newNode->row = row;
        newNode->col = col;
        newNode->value = val;
        newNode->right = newNode->down = nullptr;
        // 处理行
        if (aList->rows[row] == nullptr)
        {
            aList->rows[row] = newNode;
        }
        else if (col < aList->rows[row]->col)
        {
            newNode->right = aList->rows[row];
            aList->rows[row] = new Node;
        }
        else
        {
            Node *temp;
            //寻找合适位置
            for (temp = aList->rows[row]; temp->right && temp->right->col < col; temp = temp->right)
                ;
            newNode->right = temp->right;
            temp->right = newNode;
        }
    }
}

void add(CrossList *A, CrossList *B, int rows, int cols)
{
    for (int i = 1; i <= rows; i++)
    {
        Node *ANode = A->rows[i], *BNode = B->rows[i];
        if (!ANode && !BNode)
        {
            continue;
        }
        
        Node* newLine = new Node;
        Node* temp = newLine;
        while (ANode && BNode)
        {
            if (ANode->col < BNode->col)
            {
                temp->right = ANode;
                temp = temp->right;
                ANode = ANode->right;
            }
            else if (ANode->col == BNode->col)
            {
                if (ANode->value + BNode->value == 0)
                {
                    ANode = ANode->right;
                    BNode = BNode->right;
                    continue;
                }
                else
                {
                    ANode->value += BNode->value;
                    temp->right = ANode;
                    temp = temp->right;
                    ANode = ANode->right;
                    BNode = BNode->right;
                }
            }
            else{
                temp->right = BNode;
                temp = temp->right;
                BNode = BNode->right;
            }
        }
        if (BNode == nullptr && ANode != nullptr)
        {
            temp->right = ANode;
        }
        if (BNode != nullptr && ANode == nullptr)
        {
            temp->right = BNode;
        }
        
        A->rows[i] = newLine->right;
        delete newLine;
    }
}
int main()
{
    int rows, cols, eleA, eleB;
    scanf("%d%d%d%d", &rows, &cols, &eleA, &eleB);
    CrossList A;
    CrossList B;
    createList(&A, rows, cols, eleA);
    createList(&B, rows, cols, eleB);
    add(&A, &B, rows, cols);
    for (int i = 1; i <= rows; i++)
    {
        Node *temp = A.rows[i];
        while (temp)
        {
            printf("%d %d %d\n", temp->row, temp->col, temp->value);
            temp = temp->right;
        }
    }
    return 0;
}

  

  

posted @ 2022-03-27 15:15  帝皇の惊  阅读(74)  评论(0)    收藏  举报