2012-03-13 56 views
1

您好,我有一个家庭作业,需要将两个矩阵.txt文件读入两个链接列表(存储列,行和值),然后将两个列表一起添加并打印出总结矩阵。在两个链接列表中总结特定值的问题

将矩阵读取到链接列表可以正常工作,并将这些列表作为矩阵进行打印。不过,我坚持如何将这两个列表添加在一起。理想情况下,如果在将一个列表与另一个列表进行比较时列值和行值相同,则应该将该值相加。如果它们不相同,那么它应该只打印该值。我想创建一个新的列表大小的组合列表,然后比较元素和添加所有其他人的方式去,但我似乎无法让它超过节点推进。

在此先感谢您的帮助。

#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); 
} 
+1

我不明白你为什么需要一个组合列表。为什么不按顺序遍历每个列表,只需添加相应的值并正确显示即可? – 2012-03-14 00:08:05

回答

0

下面是一些代码,将增加存储在链接列于两个2 x 2矩阵。

#include <stdio.h> 
#include <stdlib.h> 

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

void main() 
{ 
    int prev_node_row = 0; 
    Node * matrix1; 
    Node * matrix2; 
    Node * m1cur; 
    Node * m2cur; 

    Node m1n0 = {0,0,1,NULL}; 
    Node m1n1 = {0,1,2,NULL}; 
    Node m1n2 = {1,0,3,NULL}; 
    Node m1n3 = {1,1,4,NULL}; 

    Node m2n0 = {0,0,5,NULL}; 
    Node m2n1 = {0,1,6,NULL}; 
    Node m2n2 = {1,0,7,NULL}; 
    Node m2n3 = {1,1,8,NULL}; 

    matrix1 = &m1n0; 
    m1n0.next = &m1n1; 
    m1n1.next = &m1n2; 
    m1n2.next = &m1n3; 

    matrix2 = &m2n0; 
    m2n0.next = &m2n1; 
    m2n1.next = &m2n2; 
    m2n2.next = &m2n3; 

    m1cur = matrix1; 
    m2cur = matrix2; 
    while (m1cur != NULL && m2cur != NULL) 
    { 
     if (prev_node_row < m1cur->row) 
     { 
      printf("\n"); 
     } 
     printf("%d ", m1cur->value + m2cur->value); 
     prev_node_row = m1cur->row; 
     m1cur = m1cur->next; 
     m2cur = m2cur->next; 
    } 
} 

INITIALIZED MATRIX 1

1 2 
3 4 

INITIALIZED MATRIX 2

5 6 
7 8 

OUTPUT

6 8 
10 12