2015-04-10 4 views
0

Я новичок в C++. Я пытаюсь реализовать LinkedList, для которого я создал два класса: Node и LinkedList.Создание нового экземпляра класса C++ приводит к дублированию

Я создал несколько тестовых функций. Один для тестирования Node, а другой - для проверки функции isEmpty от LinkedList. Однако, когда я пытаюсь их протестировать. Что создано в 'testNode() ends up being in the same Node I create inside LinkedList as head`.

Это может быть тривиальный вопрос, однако, как новичок в C++, эта концепция до сих пор не ясна для меня. Я хотел бы знать, почему это относится к тому же экземпляру, созданному ранее.

#include <iostream> 
#include <assert.h> 

using namespace std; 

class Node 
{ 
    private: 
     int data; 
     int next; 

    public: 

     int getData(){return data;} 
     void setData(int new_data) {data = new_data;} 

     int getNext(){return next;} 
     void setNext(int new_next) {next = new_next;} 

}; 


class LinkedList 
{ 
    Node head; 
    Node head2; 

    public: 

     bool isEmpty() 
     { 
      if (head.getData() == 0) {return true;} 
      return false; 
     } 

}; 

void testNode() 
{ 
    Node aNode; 
    aNode.setData(15); 
    aNode.setNext(23); 

    assert (aNode.getData() == 15); 
    assert (aNode.getNext() == 23); 
} 

void testEmptyLinkedList() 
{ 
    LinkedList ll; 
    assert (ll.isEmpty() == true); 
} 
+1

Вы никогда не инициализируете 'data' или' next' в конструкторе, что приводит к неопределенному поведению при попытке чтения значений из них. –

+1

Всегда полезно практиковать и изучать новые вещи и испытывать проблемы, возникающие из определенного дизайна, но имейте в виду, что вам следует избегать связанных списков в C/C++. Существует видео от создателя языка C++, объясняющего, почему вам следует избегать этого дизайна и вместо этого использовать 'std :: vector'. поищи это! – Barracuda

+0

@Barracuda благодарит за информацию. Я делаю это как часть процесса обучения на C++. Я буду помнить об этом, когда буду работать. Хорошая информация !. – lv10

ответ

2

Инициализация данных.

int data = 0; 
int next = 0; 

Live On Coliru

#include <iostream> 
#include <cassert> 

using namespace std; 

class Node { 
    private: 
    int data = 0; 
    int next = 0; 

    public: 
    int getData() { return data; } 
    void setData(int new_data) { data = new_data; } 

    int getNext() { return next; } 
    void setNext(int new_next) { next = new_next; } 
}; 

class LinkedList { 
    Node head; 
    Node head2; 

    public: 
    bool isEmpty() { 
     if (head.getData() == 0) { 
      return true; 
     } 
     return false; 
    } 
}; 

void testNode() { 
    Node aNode; 
    aNode.setData(15); 
    aNode.setNext(23); 

    assert(aNode.getData() == 15); 
    assert(aNode.getNext() == 23); 
} 

void testEmptyLinkedList() { 
    LinkedList ll; 
    assert(ll.isEmpty() == true); 
} 

int main() { 
    testEmptyLinkedList(); 
} 
+0

Что делать, если у меня есть Узел, данные которого на самом деле 0, а следующий Узел также равен 0. (Не уверен, что это возможно по идее LinkedLists). Был бы в этом случае способ инициализировать его NULL? – lv10

0

Если ваше намерение осуществить LinkList, каждый узел списка должен содержать адрес следующей.

Так что «следующий» будет объявлен как указатель на узел. То же самое для первого узла списка.

class Node { 
private: 
    int data; 
    Node *next; 
    .... 
}; 

class LinkedList { 
private: 
    Node *head; 
    ... 
}; 
Смежные вопросы