Массив связанных списков в C ++ - PullRequest
2 голосов
/ 11 мая 2009

Код для контекста:

class WordTable
{
    public:
        WordTable();
        ~WordTable();

        List* GetListByAlphaKey(char key);
        void AddListByKey(char key);
        bool ListExists(char key);
        bool WordExists(string word);
        void AddWord(string word);
        void IncrementWordOccurances(string word);
        void Print();
    private:     
        List *_listArray[33];
        int _GetIndexByKey(char key);
};


class TableBuilder
{
    public:
    TableBuilder();
    ~TableBuilder();
    void AnalyzeStream(fstream &inputStream);        
    void PrintResults();
    private:
        void _AnalyzeCursor(string data);
        bool _WordIsValid(string data);
        WordTable* _WordTable;        
};

struct Element {
public:
   string Word;
   int Occurances;
   Element* Next;
};


class List
{
    public:
        List();
        ~List();

        Element* AddElement(string word);       
        void DeleteElement(Element* element);       
        void Print();       
        void Delete();
        Element* First;
        bool WordExists(string word);
        void IncrementWordOccurances(string word);      
    private:
        void _PrintElementDetails(Element* element);
};

Требования
Я должен проанализировать текст, создать массив связанных списков (где массив содержит список для каждой буквы; список содержит каждое слово, найденное в тексте), а затем распечатать результаты.

Задача Я не могу инициализировать массив списков в WordTable.cpp. Я знаю, что что-то неправильно понял, но у меня нет идей и времени. Кто-нибудь?

P.s. Да, это домашнее задание. Хватит давать советы о лучших практиках, пожалуйста ...:)

Ответы [ 4 ]

4 голосов
/ 11 мая 2009

Инициализация для _listArray будет выглядеть следующим образом:

WordTable::WordTable() {
  for (int i=0; i<33; i++)
    _listArray[i] = new List();
}

Вы действительно не говорите, в чем именно проблема, поэтому я не уверен, поможет ли это ...

3 голосов
/ 11 мая 2009

Похоже, вы оптимизируете свои связанные списки, имея массив из них, по одному на каждую первую букву слова. Не делай этого.

Используйте std :: map. Где строка - это слово, а int - ваш счет.

РЕДАКТИРОВАТЬ: Если вы игнорируете мой совет ... Как уже было указано, ваш _listArray на самом деле является массив указателей, а не массив объектов. Я думаю, что вы хотели массив объектов. Поскольку массив имеет фиксированную длину, а List имеет конструктор по умолчанию, самый простой способ сделать это - просто сказать

List _listArray[33];

Если вы хотите динамическое распределение, вы можете сделать это вместо:

List* _listArray;

А в конструкторе:

_listArray = new List[33];

А в деструкторе:

delete[] _listArray;
3 голосов
/ 11 мая 2009

Это потому, что вы создаете массив указателей на списки. Либо измените его на List _listArray [33]; или инициализировать его так:

for ( int i = 0; i < 33; ++i ) {
    _listArray[i] = new List();
}

// and to access methods
_listArray[i]->AddElement( "word" );
0 голосов
/ 11 мая 2009

Пожалуйста, не изобретайте велосипед (снова) Используйте std :: list, он работает правильно, безопаснее, стандартнее.

Второе: у вас проблемы с дизайном: атрибут элемента в списке открыт, но у вас есть закрытый метод ???.

...