以十字链表为存储结构实现矩阵相加(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;
}

浙公网安备 33010602011771号