2015-05-07 3 views
-1

Простите меня. Я новичок в C++. Я попытался добавить третий узел в качестве головного узла и инициализировать 5 для данных, но кажется, что он разрушает простейший список ссылок из 1-> 2.добавление новых узлов на голову

так токовый выход только на выходах

5 

и мой ожидаемого результата будет

5 
1 
2 

, что я пытался.

#include <iostream> 

struct node { 
    int data; 
    node *next; 
}; 

int main(int argc, const char * argv[]) 
{ 
    node* n; 
    node * head; 
    node * tmp; 

    //create head node. 
    n = new node; 
    n->data=1; 
    tmp = n; 
    head = n; 

    //create a new node after head node and link it with head node 
    n = new node; 
    n->data=2; 
    tmp->next=n; 
    tmp=tmp->next; 

    //inserting before head node 
    n = new node; 
    head = n; 
    n->data=5; 
    n->next = head; 
    tmp = head; 

    //end of linked list 
    n->next=NULL; 

    //print 
    while (head != NULL) { 
     std::cout<< head->data << std::endl; 
     head = head->next; 
    } 
    return 0; 
} 
+0

Создание 'InsertNode()' функция, так что вы не должны повторяться. – 0x499602D2

ответ

0

Следующий код решит вашу проблему, но это не очень хороший способ написать список.

#include <iostream> 

struct node { 
    int data; 
    node *next; 
}; 

int main(int argc, const char * argv[]) 
{ 
    node* n; 
    node * head; 
    node * tmp; 

    //create head node. 
    n = new node; 
    n->data=1; 
    tmp = n; 
    head = n; 

    //create a new node after head node and link it with head node 
    n = new node; 
    n->data=2; 
    tmp->next=n; 
    tmp=tmp->next; 

    //inserting before head node(the following i have changed!) 
    n = new node; 
    n->data=5; 
    n->next = head; 
    head = n; 

    //end of linked list 
    tmp=NULL; 

    //print 
    while (head != NULL) { 
     std::cout<< head->data << std::endl; 
     head = head->next; 
    } 
    return 0; 
} 
0

Эта строка устанавливает next в первого узла к NULL, не последний:

//end of linked list 
n->next=NULL; 

Кроме того, вы назначьте next из n себе:

head = n; 
n->next = head; 

Вы должны установить next из n перед переназначением head.

Если вы хотите установить последний узел next, использовать что-то вроде:

n->next->next->next = NULL; 

Однако, вы бы лучше с помощью конструкторы для инициализации данных и написание функций-членов для управления данными, а не делать это вручную.

0

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

Попробуйте это:

struct node { 
    int x; 
    node *next; 
}; 

int main() 
{ 
    node *root;  // This won't change, or we would lose the list in memory 
    node *conductor; // This will point to each node as it traverses the list 

    root = new node; // Sets it to actually point to something 
    root->next = 0; // Otherwise it would not work well 
    root->x = 12; 
    conductor = root; // The conductor points to the first node 
    if (conductor != 0) { 
    while (conductor->next != 0) 
     conductor = conductor->next; 
    } 
    conductor->next = new node; // Creates a node at the end of the list 
    conductor = conductor->next; // Points to that node 
    conductor->next = 0;   // Prevents it from going any further 
    conductor->x = 42; 
} 
+0

Ваше вступительное заявление неверно. OP создает новые узлы и правильно вставляет их в tmp. Вставка OP в главном коде перезаписывает указатель на голове, прежде чем связывать существующий список с новым узлом, уничтожая весь список. – user4581301

+0

Мое предложение было неясным, да, отредактировано. – MisterPatate

0

Этот фрагмент кода

//inserting before head node 
    n = new node; 
    head = n; 
    n->data=5; 
    n->next = head; 
    tmp = head; 

    //end of linked list 
    n->next=NULL; 

не имеет смысла.

Вы назначили n на голову.

head = n; 

, а затем назначенный элемент данных рядом с адресом самого узла, поскольку голова уже равна n.

n->next = head; 

После этого переназначен П-> следующая

n->next=NULL; 

Таким образом, в настоящее время головной узел имеет элемент данных, далее, равно NULL и в самом деле ваш список содержит только головку.

Программа может быть записана следующим образом

#include <iostream> 

struct node { 
    int data; 
    node *next; 
}; 

int main(int argc, const char * argv[]) 
{ 
    node * n; 
    node * head = NULL; 
    node * tail = NULL; 

    //create head node. 
    n = new node; 
    n->data = 1; 
    n->next = NULL; 
    tail = n; 
    head = n; 

    //create a new node after head node and link it with head node 
    n = new node; 
    n->data = 2; 
    n->next = NULL; 

    tail->next = n; 
    tail = n; 

    //inserting before head node 
    n = new node; 
    n->data = 5; 
    n->next = head; 
    head = n; 

    //print 
    for (n = head; n != NULL; n = n->next) { 
     std::cout<< n->data << std::endl; 
    } 

    return 0; 
} 
+0

Быстрое объяснение того, почему назначение n в голову, просто переписать узел ввода в список и потерять список, значительно повысит этот ответ. – user4581301

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