Как читать из файла в двусвязный список?

Это небольшая часть моего проекта в школе. Я сохранил свои данные в текстовом файле в этой форме:

bike
dock
car

Теперь я хотел бы прочитать данные из этого файла в двусвязный список. Это код, который я использовал.

#include <iostream>
#include <strings.h>
#include <fstream>

using namespace std;

class item
{
public:
    string name;
    item *next;
    item *previous;
};

class list:private item
{
    item * first;
public:
    list();
    void load();
    void display();
};

list::list()
{
    first = NULL;
}

void list::load()
{
    item *current;
    ifstream fin;

    fin.open("List.txt");

    current=new item;

    while(!fin.eof())
    {
        fin>>current->name;
        current->previous=NULL;
        current->next=NULL;
    }

    fin.close();

    first=current;
}

Теперь проблема в том, что я не могу сохранить каждое слово файла в новом узле. Этот код сохраняет последнее слово файла в первом узле списка. Я понятия не имею, как это сделать. Я не так хорош в связанных списках. Может ли кто-нибудь помочь мне решить эту проблему?


person Vipanchith Reddy    schedule 24.08.2015    source источник
comment
Вы выделяете только один элемент с new вне цикла. Вы должны выделять новый элемент для каждого слова, прочитанного из файла.   -  person Jabberwocky    schedule 24.08.2015
comment
По какой причине вы не используете std::list?   -  person user657267    schedule 24.08.2015
comment
Вы пытаетесь сделать слишком много сразу. Прежде чем беспокоиться о файловом вводе-выводе, вам следует попробовать составить список из жестко закодированных данных.   -  person Beta    schedule 24.08.2015
comment
Вы делаете new item вне цикла, поэтому вы получаете только один узел в списке. Кроме того, использование while(!fin.eof) почти всегда неправильно.   -  person Bo Persson    schedule 24.08.2015
comment
@Beta он, наверное, хочет потренироваться.   -  person Jabberwocky    schedule 24.08.2015
comment
Я все еще изучаю С++. Наш учитель только начал учить нас связным спискам. Нас ничего не учили о std::list . Вот почему я его не использую.   -  person Vipanchith Reddy    schedule 24.08.2015
comment
@VipanchithReddy В этом случае вы можете четко указать в вопросе, что это домашнее задание, иначе вы просто получите 4-строчное решение с использованием библиотеки.   -  person user657267    schedule 24.08.2015
comment
Прости. Я забыл упомянуть об этом. Теперь я добавил это к вопросу.   -  person Vipanchith Reddy    schedule 24.08.2015
comment
@Michael Walz Я знаю, что создаю только один узел. Это проблема. Я понятия не имею, как хранить каждое слово в отдельном узле.   -  person Vipanchith Reddy    schedule 24.08.2015
comment
@VipanchithReddy вам нужен один узел для каждого слова. Возьмите лист бумаги и карандаш и нарисуйте связанный список. Я думаю, что вы упускаете самые основы.   -  person Jabberwocky    schedule 24.08.2015


Ответы (1)


Что ж, попробуйте что-то подобное для функции загрузки (не тестировалось):

void list::load()
{
    item *current;
    item *prev;
    ifstream fin;

    fin.open("List.txt");


    prev = NULL;
    while(!fin.eof())
    {
        current=new item;
        if (first == NULL) // we set first the first time
            first = current;
        fin>>current->name;
        current->previous=prev;
        current->next = NULL;
        if (prev != NULL)
            prev->next=current;
        prev = current; // we store the current as the prev for next iteration
    }

    fin.close();
}
person Guillaume Kiz    schedule 24.08.2015
comment
(prev != NULL) должно устанавливать prev->next, тогда как current->previous всегда будет = prev (даже если его значение NULL) - person softwarenewbie7331; 24.08.2015
comment
Это сработало после внесения этого изменения. Проблема заключалась в том, что я фактически тестировал пример кода в новом проекте, в котором не было текстового файла. Таким образом, у него не было файла для загрузки. Спасибо за помощь. - person Vipanchith Reddy; 24.08.2015