2010-03-02 14 views
2

嘿那里,我有问题显示我的结果在这个程序,但程序编译。任何想法是什么问题?该程序的目的是取两个2×2的矩阵并添加它们以创建称为结果的矩阵。但是当涉及在每个矩阵(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); 
    } 

} 
+1

您是否设法缩小到比您的整个应用程序短? – stefanB 2010-03-02 02:19:58

+0

我缩小了问题的显示功能,我似乎无法得到任何值在这个时候打印到屏幕上 – silent 2010-03-02 02:34:20

回答

2

我假定这是功课。如果电流不符合您检查的两个条件中的任何一个,循环将如何结束。您需要在某个点将电流设置到列表中的下一个节点。

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

这只是一个条件,是检查2次,'退出,如果电流为NULL' ... – stefanB 2010-03-02 02:31:23

+0

ahh rite ..i在while循环中的最后一条if语句之后添加了一个“break”,但是现在没有值正在打印在屏幕上? – silent 2010-03-02 02:33:15

+0

你认为休息是如何完成的。您需要移动到下一个节点。 – rerun 2010-03-02 02:36:00

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

如果你通过调试程序,你会发现这一点。顺便说一句,检查'如果current == NULL然后break'是不需要的,因为如果current为NULL,循环将退出 – stefanB 2010-03-02 02:29:54

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函数中检查,则存在冗余。

0

鉴于

该计划的目的是通过2点矩阵采取 二,2并将它们添加到 创建一个名为结果矩阵。

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

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