В чем проблема с моим классом LinkedList?

class LinkedList
{
 private:
 int data; 
 LinkedList *ptr; 
public:
 LinkedList(int i_data) 
 { 
 data = i_data; 
 ptr = 0; 
 } 
 ~LinkedList() 
 { 
 delete ptr ; 
 } 
 void insert(LinkedList *node) 
 { 
 while(this->ptr!= 0) 
 this = this->ptr; 
 this->ptr= node; 
 } 
}

Я создам голову node, как head = new LinkedList(4), и тогда будет звонить как head->insert(new LinkedList(5)) и впоследствии. Не могли бы вы рассказать мне, что выше класс представляет собой связанный список. Я думаю, что у него есть node, который содержит адрес следующего node. Пожалуйста, поправьте меня, если я ошибаюсь

6 ответов

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

Одна вещь, которую я бы изменил, - это метод insert. ИМХО, удобнее для этого метода взять тип данных, в этом случае int, и пусть класс LinkedList возьмет на себя задачу выделения структуры данных.

Например.

void insert(int data) {
 while(this->next != 0) 
 this = this->next; 
 this->next = new LinkedListNode(data); 
}


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

С точки зрения кода вы не можете назначить this, поэтому метод insert не будет компилироваться - используйте здесь хвостовую рекурсию. На слегка более высоком уровне вы должны предпочесть списки инициализации для назначения в теле конструкторов. Вы можете использовать интеллектуальные указатели, чтобы облегчить необходимость ручного управления памятью, даже если в этом простом случае это не будет проблемой.

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

class List {
public:
  List();    // creates an empty list
  void append( int value ); // adds a new element at the tail of the list
 // push_front( value ) in STL sequence containers
 void insert( int value ); // inserts a new element before the head of the list
 // push_back( value ) in STL sequence containers
 // some way of iterating (I like STL iterators,
 // but Java style iterator --even if worse-- could suffice)
};

На самом деле мне хотелось бы получить больше вещей в интерфейсе, но приведенный выше подход является минимальным (где деструктор не включен, но, конечно, я хочу, чтобы ресурсы управлялись реализацией!). Теперь, с вашим определением LinkedList (который на самом деле ближе к определению node), вы не можете создавать пустые списки. Вы можете append в конце списка, но вы не можете вставить его перед первым элементом списка. Вы не предложили средства для извлечения данных из списка (!!)

Если вы задумаетесь над дополнительными функциями, которые могут возникнуть из связанного списка (удаление определенного элемента через итератор, чтобы вы могли искать значение X и удалять его из списка, вставлять в заданный позицию в списке, а не только голову или хвост...), вы придумаете другие требования в интерфейсе, а затем вам нужно будет выполнить эти требования в коде, что всегда намного проще:)


У вас есть последний node рядом с NULL, а также

void insert (LinkedList * node) {  while (this- > next!= 0)   this = this- > next;

this->next = node; 
node->next = 0;

}


Моя проблема в том, что вы не переопределили список из узлов списка. Это приводит к тому, что проблема не может иметь пустой список без указателя NULL:

Я создам головку node как head = new LinkedList (4)

  • Итак, у меня был бы связанный класс списка (который не нужно динамически выделять)
  • У меня будет класс node (внутренний), который содержит данные и указатель на следующий
  • Я бы обновил интерфейс, чтобы взять объект данных (как описано в Jared Par).

код:

class LinkedList
{
 struct Node
 {
 Node(int d): data(d) {next = NULL;}
 ~Node() {delete next;}
 int data;
 Node* next;
 };
 std::auto_ptr<node> head;
 Insert(int data)
 {
 if (head.get() == NULL)
 {
 head.reset(new Node(data));
 }
 else
 {
 Node* loop;
 for(loop = head.get();loop->next != NULL;loop = loop->next) {};
 loop->next = new Node(data);
 }
 }
};
LinkedList list;
</node>


  • Ваш класс не закрыт. Добавьте }; в самом конце.
  • Скобка, которая должна закрывать конструктор, является открывающей.
  • Это связанный список в порядке, но проще использовать отдельные классы node и list, поскольку в вашем случае управление памятью полностью зависит от пользователя, что делает использование этого класса болью.


Где член 'next' определен?

Ваша вставка() использует 'this- > next', но есть только данные участников 'и' ptr '.

licensed under cc by-sa 3.0 with attribution.