2016-04-21 3 views
1

Я только начал изучать связанный список, и я пытаюсь извлечь определенную информацию из файла и вставить ее в связанный список, используя функцию push. Когда я пытаюсь просмотреть информацию, чтобы увидеть, правильно ли она вставлена, она просто отображает последнюю строку информации снова и снова. Что я делаю не так? Это мой код:Добавление данных в связанном списке

struct Country 
{ 
    string name; 
    double population; 
}; 

struct Node 
{ 
    Country ctry; 
    Node *next; 
}; 
Node *world; 

void push(Node *&world); 

int main() 
{ 
    push(world); 
    return 0; 
} 

void push(Node *&world) 
{ 

    ifstream inFile("file.csv"); 

    if (!inFile.fail()) 
    { 
     cout << "File has opened successfully." << endl; 
    } 

    if (inFile.fail()) 
    { 
     cout << "File has failed to open." << endl; 
     exit(1); 
    } 

    double temp, temp1, temp2, temp3, population; 
    string countryName; 
    Node *top = new Node; 

    for (int i = 0; i < 300; i++) 
    { 
     if (inFile.eof()) 
     { 
      top->next = NULL; 
      break; 
     } 

     inFile >> temp >> temp1 >> temp2 >> temp3 >> population; 
     getline (inFile,countryName); 

     top -> ctry.population = population; 
     top -> next = world; 
     world = top; 

     top -> ctry.name = countryName; 
     top -> next = world; 
     world = top; 
    } 

    for (int j = 0; j < 5; j++) 
    { 
     cout << top -> ctry.name << endl; 
     top -> next; 
    } 
} 
+0

См. [Почему ostream :: eof() плохо?] (Http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) –

ответ

1

"world" - это начало вашего связанного списка.

Node *top = new Node; 

Здесь вы создали новый узел. Я пропущу часть, в которой вы заполнили ее содержимое.

top -> next = world; 
    world = top; 

«Мир» - это текущий указатель на начало списка, как я уже упоминал. Теперь вы сохранили его в верхнем next. Затем вы установите world, чтобы указать на новый узел. Это стало новым началом вашего списка. Это отлично.

top -> next = world; 
    world = top; 

Вы случайно продублировали несколько строк кода. Так как «top» в это время является тем же самым указателем, что и «мир», вы просто устанавливаете узел в верхней части списка, чтобы указать на себя. Это ваш бесконечный цикл.

+0

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

+0

@ H.C Если концепция узлов вас сбивает с толку, тогда, возможно, вам стоит начать писать связанный список простого типа, например 'int'. И перед этим нарисуйте полями и линиями, как каждая операция будет выглядеть. – PaulMcKenzie

0

Вы выделяете память только для одного узла и используете его все время. Поместите ниже строку в петле для решения вашей проблемы:

Node *top = new Node; 
0

Ну, есть несколько проблем с кодом, который я вижу.

Во-первых, эта линия не делает ничего:

top -> next; 

Если вы переборе связанного списка для чтения значения хранятся вы, вероятно, хотите сделать что-то вдоль линий:

for (;;) 
{ 
    cout << world -> ctry.name << endl; 
    if (world->next == null) break; 
     else world = world -> next; 
} 

у вас есть пара дублируются линии и круговая связь в цикле создания:

top -> next = world; 
    world = top; 

    top -> ctry.name = countryName; 
    top -> next = world; 
    world = top; 

Я думаю, что это то, что вы имели в виду сделать:

world = top; 
for (int i = 0; i < 300; i++) 
{ 
    if (inFile.eof()) 
    { 
     top->next = NULL; 
     break; 
    } else top = top -> next; 

    inFile >> temp >> temp1 >> temp2 >> temp3 >> population; 
    getline (inFile,countryName); 

    top -> ctry.population = population; 
    top -> ctry.name = countryName; 
    top -> next = new Node; 

} 

Наконец, сохранить себя вызов функции и использовать еще:

if (!inFile.fail()) 
{ 
    cout << "File has opened successfully." << endl; 
} else { 
    cout << "File has failed to open." << endl; 
    exit(1); 
} 

Я надеюсь, что это поможет вам получить на правильном пути.

+0

Я пробовал ваши циклы для создания связанного списка и отображения данных в связанном списке. Он отобразит последнюю строку и выйдет из цикла. –

+0

Хорошо, дело в том, чтобы вы начали. Не писать свою программу для вас. – jbrove

Смежные вопросы