views:

100

answers:

4

hey there, Im having problems displaying my results in this program but the program compiles. Any idea as to what is going wrong?. The purpose of the program is to take two, 2 by 2 matrixes and add them to create the matrix called result. but when it comes to displaying the values in each matrix (A,B and result) it hangs. why does at the search(A,0,0) call?

-thanks

#include <stdio.h>

int gvalue;

struct Node {
    int row;
    int column;
    int value;
    Node *next;
};

void AddNode(Node *&listpointer,int r,int c,int v);
void getValue(Node *listpointer, int grow, int gcol);
void search(Node *listpointer, int srow, int scol);
void display(Node *listpointer,int drow,int dcol,int dvalue);
Node *A,*B,*result;

int main(){
    A = NULL;
    B = NULL;
    result = NULL;

    int row1p1,row1p2,row2p1,row2p2; //row 1 position 1 etc

    //matrix A values!
    printf("Enter the first row of values for matrix A: ");
    scanf("%d %d",&row1p1,&row1p2);
    printf("\nEnter the second row of values for matrix A: ");
    scanf("%d %d",&row2p1,&row2p2);

    AddNode(A,0,0,row1p1); //matrix created...
    AddNode(A,0,1,row1p2);
    AddNode(A,1,0,row2p1);
    AddNode(A,1,1,row2p2);

    //matrix B values!
    printf("\n\nEnter the first row of values for matrix B: ");
    scanf("%d %d",&row1p1,&row1p2);
    printf("\nEnter the second row of values for matrix B: ");
    scanf("%d %d",&row2p1,&row2p2);

    AddNode(B,0,0,row1p1); //matrix created...
    AddNode(B,0,1,row1p2);
    AddNode(B,1,0,row2p1);
    AddNode(B,1,1,row2p2);


    //next part...
    int a_row1p1,a_row1p2,a_row2p1,a_row2p2;
    int b_row1p1,b_row1p2,b_row2p1,b_row2p2;
    int sum;
    //-------------------------------------------------------------------------------|
    getValue(A,0,0);            //RESULT NODE for position 0,0
    a_row1p1=gvalue;
    getValue(B,0,0);
    b_row1p1=gvalue;

    sum=a_row1p1+b_row1p1;
    AddNode(result,0,0,sum);   

    getValue(A,0,1);                //RESULT NODE for position 0,1
    a_row1p2=gvalue;
    getValue(B,0,1);
    b_row1p2=gvalue;

    sum=a_row1p2+b_row1p2;
    AddNode(result,0,1,sum); 

    getValue(A,1,0);                //RESULT NODE for position 1,0
    a_row2p1=gvalue;
    getValue(B,1,0);
    b_row2p1=gvalue;

    sum=a_row2p1+b_row2p1;
    AddNode(result,1,0,sum); 

    getValue(A,1,1);                //RESULT NODE for position 1,1
    a_row2p2=gvalue;
    getValue(B,1,1);
    b_row2p2=gvalue;

    sum=a_row2p2+b_row2p2;
    AddNode(result,1,1,sum); 
    printf("success\n");
    //-------------------------------------------------------------------------------|
    search(A,0,0);
    printf("success\n"); //issue????
    search(A,0,1);
    search(A,1,0);
    search(A,1,1);


    search(B,0,0);
    search(B,0,1);
    search(B,1,0);
    search(B,1,1);

    search(result,0,0);
    search(result,0,1);
    search(result,1,0);
    search(result,1,1);



    return 0;
}

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;
}

void getValue(Node *listpointer, int grow, int gcol){
    Node *current;
    current = listpointer;
    while (current != NULL){
        if (current == NULL){break;}
        if ( (current->row == grow ) && (current->column == gcol) ){
            gvalue = current->value;
            break;
        }
        current = current->next;
    }
}

void search(Node *listpointer, int srow, int scol){
    Node *current;
    current = listpointer;
    while (current != NULL){
        if (current == NULL){break;
        }
        if ( (current->row == srow) && (current->column == scol) ){
            display(current,srow,scol,current->value); //call to display
        }
    }
}

void display(Node *listpointer,int drow,int dcol,int dvalue){
    if (listpointer == A){
        printf("\n\nMatrix A\n");
    }
    if (listpointer == B){
        printf("Matrix B\n");
    }
    if (listpointer == result){
        printf("Matrix Result\n");
    }
    //---------------------------------------------------------|
    if ( (drow == 0) && (dcol == 0) ){
        printf("%d ",dvalue);
    }
    if ( (drow == 0) && (dcol == 1) ){
        printf("%d\n",dvalue);
    }
    if ( (drow == 1) && (dcol == 0) ){
        printf("%d ",dvalue);
    }
    if ( (drow == 1) && (dcol == 0) ){
        printf("%d\n\n",dvalue);
    }

}
+2  A: 

I'm assuming that this is homework. How is the loop going to end if current does not meet either of the two conditions you check. You need to set current to the next node of the list at some point.

 while (current != NULL){
        if (current == NULL){break;
        }
        if ( (current->row == srow) && (current->column == scol) ){
            display(current,srow,scol,current->value); //call to display
        }
    }
rerun
It's only one condition that's being check 2 times, `exit if current is NULL` ...
stefanB
ahh rite..i added a " break; " after the last if statement in the while loop but now no values are being printed on the screen?
sil3nt
What do you think break is going to accomplish. You need to move to the next node.
rerun
Ahh thank you!!! you guys are life savers! :)
sil3nt
A: 

You never update current.

If current is not NULL when you enter search you end up in while loop forever.

void search(Node *listpointer, int srow, int scol){
    Node *current;
    current = listpointer;
    while (current != NULL){
        if (current == NULL){break;
        }
        if ( (current->row == srow) && (current->column == scol) ){
            display(current,srow,scol,current->value); //call to display
        }
    }
}
stefanB
If you step through with debugger you would find this out. Btw the check `if current == NULL then break` is not needed because the loop will exit `if current is NULL`
stefanB
A: 

Your search should look like (not the best way of doing it...I'm just giving a way that works by making little changes to existing code):

void search(Node *listpointer, int srow, int scol){
        Node *current;
        current = listpointer;
        while (current != NULL){
                if ( (current->row == srow) && (current->column == scol) ){
                        display(current,srow,scol,current->value); //call to display
                }
                current = current->next;
        }
}

In the display method, you are printing (1,0) value instead of (1,1)

if ( (drow == 1) && (dcol == 0) ){
        printf("%d\n\n",dvalue);
}

should be:

if ( (drow == 1) && (dcol == 1) ){
        printf("%d\n\n",dvalue);
}

There is a redundant if check in the getValue function.

codaddict
A: 

Given that

The purpose of the program is to take two, 2 by 2 matrixes and add them to create the matrix called result.

I am wondering why three 2-dimensional arrays like the following is not sufficient. What am I missing?

#define N 2

int a[ N ][ N ];
int b[ N ][ N ];
int result[ N ][ N ];

for( i = 0; i < N; ++i )
  for( j = 0; j < N; ++j )
     result[ i ][ j ] = a[ i ][ j ] + b[ i ][ j ];
ArunSaha