2015-10-28 4 views
0

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

template <typename T> 
class LinkedList 
{ 
private: 
    struct Node { 
     string name; 
     int age; 
     int location; 
     Node* next; 
     Node* previous; 
     Node(T info){ name = info->getName(); age = info->getAge; location = info->getLocation; next = NULL; previous = NULL; } 


    }; 
    Node* head = NULL; 
    Node* tail = NULL; 

Это при условии, что (T данные) является указателем на объект класса, который был создан из:

#include "Person.h" 


Person::Person(string name, int age, int location) 
{ 
    this->name = name; 
    this->age = age; 
    this->location = location; 
} 


Person::~Person() 
{ 
} 

string Person::getName() 
{ 
    return name; 
} 

int Person::getAge() 
{ 
    return age; 
} 

int Person::getLocation() 
{ 
    return location; 
} 

Я хочу, чтобы иметь возможность создать Person от моего лица класса, а затем хранения этого человека (имя, возраст и местоположение) в моем связанном списке:

Person* newPerson = new Person(name, age, location); 
LL.insert(newPerson); 

LL связанный список Я создал внутри моей main.cpp и вставки является функцией моего связного списка.

Возможно, это не лучший способ сделать это, но могу ли я это сделать?

+0

Да. его ваш список .. вы получаете какую-либо ошибку? или это больше вопрос дизайна? – Nandu

+0

Я рекомендую изучить STL. Есть ли причина, по которой вы хотите изобрести колесо? Посмотрите на «список», например, – Elyasin

+0

Как уже упоминалось, просмотрите ['std :: list'] (http://en.cppreference.com/w/cpp/container/list), чтобы увидеть интерфейс для связанного, который работает с любым типом. Однако вы должны знать, что вам следует предпочесть ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector) поверх других контейнеров. В современных системах иерархия латентности памяти делает векторы более эффективными, чем списки. – legalize

ответ

1

Да, вы можете использовать указатели для других объектов. В вашем случае объект человека.

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

class LinkedList 
{ 
    private: 
    struct Node { 
     Person *person; 
     Node *next; 
    }; 
    Node* head = NULL; 
    Node* tail = NULL; 
}; 

В качестве альтернативы вы можете использовать связанный список недействительных указателей

class LinkedList 
{ 
    private: 
    struct Node { 
     void *data; 
     Node *next; 
    }; 
    Node* head = NULL; 
    Node* tail = NULL; 
}; 

Использование шаблонного типа вы можете убедиться в том, что содержание все того же типа.

template <typename T> 
class LinkedList 
{ 
     private: 
     struct Node { 
      T *data; 
      Node *next; 
     }; 
    Node* head = NULL; 
    Node* tail = NULL; 
}; 

У меня нет доступа к компилятору C++ в данный момент, поэтому синтаксису может потребоваться исправление.

Кстати, использование хвостового элемента, по-видимому, означает, что вы пытаетесь создать двойной список. Если вам не нужно идти назад в списке, это необязательно.

+0

Вы всегда можете скопировать/вставить свой код в http://gcc.godbolt.org/ (где он будет скомпилирован как C++, а не c. AFAIK, godbolt не имеет надлежащей опции C.) –

+0

@PeterCordes Спасибо за Подсказка. Не знал об этом. – Sammy

4

Связанный список - это структура данных, которая определяет определенную взаимосвязь между несколькими элементами данных.

Эти данные обычно являются строками или целями, как вы отметили. Но это может быть что угодно.

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

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