2016-08-10 6 views
0

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

код:

struct Node { 
int data1; 
Node* next; 
}; 

void firstElement(Node *&head, int d) 
{ 
Node* temp = new Node; 
temp->data1 = d; 
temp->next = NULL; 
head = temp; 
} 

void insert(Node *&node, int data) 
{ 
Node* temp = new Node; 
temp->data1 = data; 
temp->next = NULL; 


while(node) 
{ 
    if(node->next == NULL) 
    { 
     node->next = temp; 
     return; 
    } 
    node = node->next; 
} 

} 

void display(Node *&node) 
{ 
while(node != NULL) 
{ 
    cout << node->data1 << endl; 
    node = node->next; 
} 
} 

int main() 
{ 
Node* head; 

firstElement(head, 1); 
insert(head, 2); 
insert(head, 3); 
insert(head, 4); 
insert(head, 5); 
insert(head, 6); 
insert(head, 7); 
insert(head, 8); 
insert(head, 9); 
insert(head, 10); 

display(head); 

} 

В выходных данных, он только дает мне дорожит 9 and 10 только то есть последние 2 элементов. Похоже, это просто замена значений. Однако я не понимаю. Для моего узла temp я уже инициализирую его до следующего i.e temp->next = NULL. И в функции insert(), я использую if condition, чтобы добавить только следующий узел, если его NULL.

Любые предложения?

+3

Что вы наблюдали при пошаговом через YOUT код построчно с помощью отладчика? –

+1

Я не использовал C++ в течение многих лет, но «* &» действительно прав в этом случае? –

+1

@StefanAgartsson Он просто берет ссылку на указатель – Garf365

ответ

3

Проблема возникает из insert функция. Он принимает Node* & так, как только вы

node = node->next; 

в цикле, он будет изменять переменную, используемую в качестве вызывающего абонента в списке параметров узла. Удалить & и ваша проблема решена:

void insert(Node* node, int data) 
+0

Рекомендуем изменить «исходный список» на «переменную, используемую вызывающим пользователем как параметр« node », для дополнительной ясности. – user4581301

+0

Да. это сработало. и если он добавит '* &', тогда мне пришлось передать этот параметризованный узел на новый узел, а затем добавить temp к этому новому узлу, например 'Node * n = node; while (n) ...... n-> next = temp; .... n = n-> next; ' Но я не понял, как вы сказали, это изменит исходный список. Если он заменил оригинал, не должен ли он показывать мне только 10? почему «9 и 10»? – nix

+0

Спасибо за ваше предложение, оно отредактировано;) – Omar