2016-01-31 5 views
-4

Одно из моих лабораторных заданий в университете - читать имена из файла * .txt в связанном списке структур, а затем передавать список функции, которая печатает имена на экране. Кажется, проблема заключается в том, где я назначил значение указателей и передал их моей функции. Я был бы признателен, если бы кто-нибудь мог указать, где я ошибаюсь.Назначение определений связанных списков C++

person.h:

#ifndef PERSON_H 
#define PERSON_H 
#include<string> 
#include<fstream> 
#include<iostream> 
using namespace std; 

struct Person 
{ 
    Person *next; 
    string name; 
}; 

void walklist(Person *head_Ptr); 

#endif PERSON_H 

person.cpp:

#include "person.h" 

void walklist(Person*head_Ptr) 
{ 
    Person *cur; 
    for (cur = head_Ptr; cur!=NULL; cur=cur->next) 
    { 
     cout<< cur->name<<endl; 
    } 
} 

main.cpp

#include<string> 
#include<fstream> 
#include<iostream> 
#include"person.h" 

using namespace std; 

int main() 
{ 
    string myfilename, names_in; 

    cout<<"Please enter the name of the file to open"; 
    cin>>myfilename; 

    fstream infile; 
    infile.open(myfilename.c_str()); 

    if(infile.bad()) 
    { 
     cerr<<"There has been a problem opening the file"<<endl; 
     system("PAUSE"); 
     return -1; 
    } 

    Person *head_Ptr = NULL, *last_Ptr = NULL, *temp_Ptr; 

    while(infile.good()) 
    { 
     getline(infile, names_in); 

     temp_Ptr = new Person; 
     temp_Ptr->name = names_in; 
     temp_Ptr->next = head_Ptr; 

     if(last_Ptr != NULL) 
     { 
      last_Ptr->next = temp_Ptr; 
     } 
     if(head_Ptr==NULL) 
     { 
      head_Ptr = last_Ptr; 
     } 
    } 

    walklist(head_Ptr); 

    system("Pause"); 
    return 0; 
} 
+1

Какая ошибка? Печатается ли неправильно? – Stefan

+0

Использование 'using namespace std;' не является хорошей идеей. http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice –

+2

Запустите код шаг за шагом с отладчиком, и вы легко увидите свою проблему. –

ответ

2

Не должно быть

temp_Ptr->next = nullptr; // temp_Ptr will be the new last element 
           // so make sure that its next points to null 

    if(last_Ptr != NULL) 
    { 
     last_Ptr->next = temp_Ptr; // Update next pointer of the current last 
            // element to point to the new last element 
    } 

    last_Ptr = temp_Ptr;   // Update last to be the new element 

    if(head_Ptr==NULL) 
    { 
     head_Ptr = temp_Ptr;  // Update head if needed (i.e. when null) 
    } 
+0

Ты просто избил меня к этому :-) хотя я не уверен, что ОР хочет круговой список или нет. – Stefan

+0

@Stefan - спасибо за то, что вы не просто отправляете тот же ответ :-) К сожалению, многие пользователи SO это делают. Даже много минут спустя. В любом случае - в отношении «кругового списка» я предположил, что это ошибка, поскольку «walklist» будет проблематичным в его текущей форме. – 4386427

+0

ВАШИ ПАРЫ УДИВИТЕЛЬНЫ !!! Это была единственная лаборатория, которую я не смог сделать весь этот год, и это разрушило мою душу! Это! Он отлично работает, и вы даже прокомментировали код. Благодарю тебя, кучка джентльменов. – J0rdy

0

Похоже, вы на правильном пути. Ошибка в этом коде:

if(last_Ptr != NULL) 
    { 
     last_Ptr->next = temp_Ptr; 
    } 
    if(head_Ptr==NULL) 
    { 
     head_Ptr = last_Ptr; 
    } 

первый раз, когда вы получаете здесь, как и last_Ptrhead_Ptr равны нулю. Поэтому вы пропустите первое задание, но затем назначьте last_Ptr в head_Ptr. Тогда они все равно будут NULL.

+0

Что бы я вместо этого сделал? – J0rdy

+0

Вы не устанавливаете 'last_Ptr' ни в чем, нигде. Возможно, при добавлении первого узла, 'last_Ptr' и' head_Ptr' должны быть одинаковыми? –

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