2012-03-13 3 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

Я не понимаю, почему вам нужен комбинированный список. Почему бы вам не перебирать каждый список в последовательности и просто добавлять соответствующие значения и отображать их прямо тогда? –

ответ

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

инициализируется МАТРИЦА 1

1 2 
3 4 

INITIALIZED МАТРИЦА 2

5 6 
7 8 

ВЫХОД

6 8 
10 12 
Смежные вопросы