You are on page 1of 4

#include <stdio.

h>
#include <stdlib.h>
struct Node { //declaration
int row;
int column;
int value;
Node *next;
};
Node *A=(Node *)malloc(sizeof(Node)),*B=(Node *)malloc(sizeof(Node));
//declaration

void add_node(Node* a,int i,int j,int val);


void printMatrix(Node* a/*, int rows, int cols*/);
void printLL(Node *a);
Node *AddMatrices(Node *a,Node *b);

void read_matrix(Node* &a, char *file_name){


//reads a matrix from a file
int col = 0, row = 0, value = 0;
FILE *input = NULL;
input = fopen(file_name, "r");

if(input == NULL){
printf("Cannot open file %s. Exiting.\n", file_name);
exit(0);
}
//reads the matrix dimensions from the first line
fscanf(input, "%d %d", &row, &col);

//read matrix
for(int i = 0; i < row; ++i){
for(int j = 0; j < col; ++j){
//reads each value from this row (second line onwards)
fscanf(input, "%d", &value);
if(value==0 && j==col-1 && i==row-1){
add_node(a,row,col,0);
}
if(value == 0) continue;
//
add_node(a, i+1, j+1, value); //Adds matrix value to linked
list.
//
//The next line is for debbuging, it can be commented later
//printf("Element at (%d %d) is different than zero and it is: %d
",i,j,value);
}
//the next line is for debbuging purposes, it can be commented out
later
//printf("\n");
}
//Debug line follows:
//printLL(a,row,col);
fclose(input);
}

void add_node(Node* a,int i,int j,int val){


while(a->next!=0){
a=a->next;
}
a->row=i;
a->column=j;
a->value=val;
Node *C=(Node *)malloc(sizeof(Node));
C->next=0;
a->next=C;
}

void printMatrix(Node* a/*, int rows, int cols*/){


Node *dimensioncheck=a;
int rows=0;
int cols=0;
while(dimensioncheck->next!=0){
if(dimensioncheck->row>rows){
rows=dimensioncheck->row;
}
if(dimensioncheck->column>cols){
cols=dimensioncheck->column;
}
dimensioncheck=dimensioncheck->next;
}
int i,j;
bool entryfound;
for(i=1;i<=rows;i++){
for(j=1;j<=cols;j++){
entryfound=false;
Node* search=a;
while(search->next!=0){
if(search->row==i && search->column==j){
entryfound=true;
printf("%d ",search->value);
break;
}
search=search->next;
}
if(entryfound==false){
printf("0 ");
}
/*if(j<cols){
printf(" ");
}*/
}
if(i<rows){
printf("\n");
}
}
}

Node *AddMatrices(Node *a,Node *b){


Node *search1=a;
Node *search2=b;
Node *sum=(Node *)malloc(sizeof(Node));
Node *start=sum;
Node *next;
sum->next=0;
bool entryfound;
while(search1->next!=0){
entryfound=false;
while(search2->next!=0){
if(search1->row==search2->row && search1->column==search2-
>column){
sum->value=search1->value+search2->value;
entryfound=true;
break;
}
search2=search2->next;
}
search2=b;
if(entryfound==false){
sum->value=search1->value;
}
sum->row=search1->row;
sum->column=search1->column;
search1=search1->next;
next=(Node *)malloc(sizeof(Node));
sum->next=next;
sum=sum->next;
}
search1=b;
search2=a;
while(search1->next!=0){
entryfound=false;
while(search2->next!=0){
if(search1->row==search2->row && search1->column==search2-
>column){
sum->value=search1->value+search2->value;
entryfound=true;
break;
}
search2=search2->next;
}
search2=a;
if(entryfound==false){
sum->value=search1->value;
}
sum->row=search1->row;
sum->column=search1->column;
search1=search1->next;
next=(Node *)malloc(sizeof(Node));
sum->next=next;
sum=sum->next;
}
sum->next=0;
return start;
}

void printLL(Node *a){


Node *dimensioncheck=a;
int rows=0;
int cols=0;
while(dimensioncheck->next!=0){
if(dimensioncheck->row>rows){
rows=dimensioncheck->row;
}
if(dimensioncheck->column>cols){
cols=dimensioncheck->column;
}
dimensioncheck=dimensioncheck->next;
}
int i,j;
for(i=1;i<=rows;i++){
for(j=1;j<=cols;j++){
Node* search=a;
while(search->next!=0){
if(search->row==i && search->column==j && search->value!=0)
{
printf("%d ",search->value);
/*if(j<cols||i<rows){
printf(" ");
}*/
break;
}
search=search->next;
}
}
}
}

int main( int argc, char** argv ) {


A->next=0;
B->next=0;
if(argc!=3) {printf("needs two matrices \n"); exit(0);}
read_matrix(A, argv[1]);
read_matrix(B, argv[2]);
Node *C=AddMatrices(A,B);
printf("Matrix 1: ");
printLL(A);
printf("\n");
printMatrix(A);
printf("\nMatrix 2: ");
printLL(B);
printf("\n");
printMatrix(B);
printf("\nMatrix Result: ");
printLL(C);
printf("\n");
printMatrix(C);
}

You might also like