Hello I have a homework assignment where I need to read two matrix .txt files in to two linked lists (store column, row and value) then add the two lists together and print out the summed matrix.
Reading the matrix to the linked lists works okay as does printing those lists as a matrix. However I’m stuck on how to add those two lists together. Ideally if the column value and the row value are the same when comparing one list to another then the value should be summed. If they are not the same then it should just print the value. I figured creating a new list the size of the combined lists then comparing the elements and adding all the others in was the way to go but I can’t seem to get it to advance more than node.
Thanks in advance for any help.
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
struct Node {
int row;
int column;
int value;
Node *next;
};
Node *A, *B, *C;
//Add node function.
void addNode( Node *& listpointer, int r, int c, int v ) {
Node *temp;
temp = new Node;
temp->row = r;
temp->column = c;
temp->value = v;
temp->next = listpointer;
listpointer = temp;
}
//Matrix row file size function.
int getRowSize ( char *file_name ){
int row = 0;
int nothing = 0;
ifstream input;
string line;
input.open(file_name);
if(!input.good()){
cout << "Cannot open file " << file_name << endl;
exit(0);
}
if(input.good()){
getline(input,line);
stringstream sline(line);
sline >> row >> nothing;
}
return row;
}
//Matrix column file size function.
int getColumnSize ( char *file_name ){
int column = 0;
int nothing = 0;
ifstream input;
string line;
input.open(file_name);
if(!input.good()){
cout << "Cannot open file " << file_name << endl;
exit(0);
}
if(input.good()){
getline(input,line);
stringstream sline(line);
sline >> nothing >> column;
}
return column;
}
//Read from file to LL function.
void readMatrix( Node* &a, char *file_name ){
int row = getRowSize(file_name);
int col = getColumnSize(file_name);
//cout << "Row = " << row <<" Column = "<< col <<endl;
int value = 0;
string line;
ifstream input;
input.open(file_name);
if(!input.good()){
cout << "Cannot open file " << file_name << endl;
exit(0);
}
if(input.good()){
getline(input,line);
stringstream sline(line);
sline >> row >> col;
//cout << "Matrix dimensions " << row << " " << col << endl;
}
for(int i = 0; i < row; ++i){
if(input.good()) {
getline(input,line);
stringstream sline(line);
for(int j = 0; j < col; ++j){
sline >> value;
if(value == 0) continue;
addNode(a, i, j, value);
//cout << "Element at (" << i << " " << j << ") is different than zero and it is: "<< value <<" \n";
}
//cout << endl;
}
}
input.close();
}
//Search function for print function.
int searchByPosition ( Node *listpointer, int r, int c){
Node *current;
current = listpointer;
while ( true ){
if ( current == NULL ){ break; }
if (r == current->row && c == current->column) {
//cout << "Value = " << x << "\n";
return current->value;
}
current = current->next;
}
//cout << "Value not in list.\n";
return 0;
}
//Print function.
void printMatrix ( Node *listpointer, int columnSize, int rowSize ){
int c, r, v;
for (r=0; r < rowSize; ++r) {
for (c=0; c < columnSize; ++c) {
v = searchByPosition(listpointer,r,c);
printf("%d ", v);
}
printf("\n");
}
printf("\n");
}
//Function that mneasures both lists and creates a new combined list.
void concatenate ( Node *&result, Node *listpointer1, Node *listpointer2){
Node *tempLP1, *tempLP2, *countLP1, *countLP2;
countLP1 = listpointer1;
countLP2 = listpointer2;
tempLP1 = listpointer1;
tempLP2 = listpointer2;
int listpointer1Size = 0;
int listpointer2Size = 0;
while ( countLP1 != NULL ) {
++listpointer1Size;
countLP1 = countLP1->next;
}
//cout << listpointer1Size <<endl;
while ( countLP2 != NULL ) {
++listpointer2Size;
countLP2 = countLP2->next;
}
//cout << listpointer2Size;
int resultSize = listpointer1Size + listpointer2Size;
//cout << resultSize;
for (int i=0; i < resultSize; ++i) {
if (tempLP1->column == tempLP2->column && tempLP1->row == tempLP2->row) {
//cout << result->value<<" "<<result->row<<" "<<result->column<<endl;
addNode(result, tempLP1->row, tempLP1->column, (tempLP1->value + tempLP2->value));
//cout <<"marker "<<i+1<<endl;
//result = result->next;
tempLP1 = tempLP1->next;
//cout << tempLP1->value<<" "<<tempLP1->row<<" "<<tempLP1->column<<endl;
//cout << result->value<<" "<<result->row<<" "<<result->column<<endl;
} else {
addNode(result, tempLP1->row, tempLP1->column, tempLP1->value);
//cout << tempLP1->value<<" "<<tempLP1->row<<" "<<tempLP1->column<<endl;
tempLP1 = tempLP1->next;
//addNode(result, listpointer2->row, listpointer2->column, listpointer2->value);
//cout <<"marker2"<<endl;
//cout << listpointer1->value;
//result = result->next;
//listpointer1 = listpointer1->next;
}
}
/*current = listpointer1;
prev = NULL;
while ( current != NULL ){
prev = current;
current = current->next;
}
if ( prev == NULL ){
//cout <<"List1 was empty, joining anyway.\n";
listpointer1 = listpointer2;
} else {
//cout <<"Join.\n";
prev->next = listpointer2;
}*/
}
int main() {
A = NULL; // ALL linked-lists start empty
B = NULL; // ALL linked-lists start empty
C = NULL; // ALL linked-lists start empty
readMatrix(A, (char*)"matrix1.txt");
readMatrix(B, (char*)"matrix2.txt");
int rowSize1 = getRowSize((char*)"matrix1.txt");
int colSize1 = getColumnSize((char*)"matrix1.txt");
//cout << rowSize << colSize;
printMatrix(A, rowSize1, colSize1);
printMatrix(B, rowSize1, colSize1);
concatenate(C, A, B);
//printMatrix(C, rowSize1, colSize1);
//printMatrix(B, rowSize1, colSize1);
}
Here’s some code that will add two
2 x 2matrices stored in linked-lists.INITIALIZED MATRIX 1
INITIALIZED MATRIX 2
OUTPUT