帮助显示两个矩阵的总和(使用链表)

时间:2010-03-02 02:17:51

标签: c++ matrix linked-list sparse-matrix

嘿那里,我在这个程序中显示我的结果时遇到了问题,但程序编译了。知道出了什么问题吗?该程序的目的是采用2×2矩阵并添加它们以创建名为result的矩阵。但是当涉及在每个矩阵(A,B和结果)中显示值时,它会挂起。为什么在搜索(A,0,0)调用?

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

}

4 个答案:

答案 0 :(得分:2)

我假设这是家庭作业。如果当前电流不符合您检查的两个条件中的任何一个,循环将如何结束。您需要在某个时刻将当前设置为列表的下一个节点。

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

答案 1 :(得分:0)

您永远不会更新current

如果输入搜索时当前不为NULL,则会在while循环中结束。

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

答案 2 :(得分:0)

您的搜索应该是这样的(不是最好的方式...我只是通过对现有代码进行少量更改来提供一种方法):

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

在显示方法中,您打印(1,0)值而不是(1,1)

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

应该是:

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

如果检查getValue函数,则存在冗余。

答案 3 :(得分:0)

鉴于此

  

该计划的目的是采取   2,2乘2矩阵并将它们添加到   创建一个名为result的矩阵。

我想知道为什么像下面这样的三个二维数组是不够的。我错过了什么?

#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 ];