2016-02-22 2 views
-5

Я пытаюсь сделать простую вставку Узел в последнюю позицию связанного списка. Но у меня проблемы.Вставить связанный список

#include <stdio.h> 
#include <stdlib.h> 
#include <iostream> 

using namespace std; 

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

Node* Insert(Node* head, int data); 
Node* print(Node* head); 
void ReverseIterative(); 


Node* Insert(Node* head, int data) 
{ 
    Node* newNode; 
    newNode->data = data; 
    newNode->next = NULL; 

    if(head == NULL) 
    { 
     return newNode; 
    } 

    Node* curr=head; 
    while(curr->next!=NULL) 
    { 
     curr=curr->next; 
    } 
    curr->next = newNode; 
    return head; 
} 

Node* printList(Node* head) 
{ 
    while(head) 
    { 
     cout<<head->data; 
     head=head->next; 
    } 
    cout<<endl; 
} 

int main() 
{ 
    struct Node* head = NULL; 
    head = Insert(head, 2); 
    head = Insert(head, 4); 
    printList(head); 
    return 0; 
} 

Я не уверен, что я делаю неправильно. Пожалуйста, помогите ~! Я просмотрел свою логику, и все должно быть правильно. Возможно, я создаю новый узел в insert(). Я думаю, что с моим синтаксисом что-то не так, но я не уверен, что это такое. Я действительно ненавижу, когда это произойдет ...

Спасибо за вашу помощь

+3

«Бегущий в беду» не очень хорошее описание вашей проблемы, не так ли? ** ** ** **. – OldProgrammer

+0

Почему вы думаете, что это ваш синтаксис? Вы получаете ошибку компилятора? Если да, то что это? – ClickRick

+3

Идеальное время, чтобы перестать смотреть на код и пройти через него с помощью отладчика. Указатель будет указывать. У одного из вас нет. – user4581301

ответ

2

В вашей Insert функции, вы никогда не выделяют newNode.

Node* newNode; 

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

Node* newNode = new Node(); 

Программа работает правильно после фиксации этого, и выход:

24 

http://ideone.com/16XL5W

EDIT: Regard ИНГ свой комментарий ниже, следующие строки ничего не выделяют:

Node* newNode; 
struct Node* newNode; 

Они просто объявить переменные, так как вы определили их в качестве указателей (*). Указатели просто указывают на объект в куче. Чтобы фактически создать объект в куче, вам необходимо использовать new Node().

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

Вы можете использовать malloc, если хотите, но вы программируете на C++, поэтому, как правило, никогда не используйте malloc, если вам действительно не нужно.

Если вы используете совместимый компилятор, используйте shared_ptr s, тогда вам не придется беспокоиться о том, что вы new.

+0

Обратите внимание, что использование общих указателей для связанных списков [может иметь серьезные недостатки] (http://stackoverflow.com/questions/17804235/shared-pointers-delete-recursive-data-structures-recursively-and-the-stack-overf? s = 1 | 0.7271), ограничивая их в глубине распределения. –

+0

@ πάνταῥεῖ Хороший момент. В этом случае это не имеет большого смысла, но в более высокоуровневых приложениях 'shared_ptr' предпочтительнее в большинстве случаев. –

+0

Я читаю язык программирования C прямо сейчас. Одним из примеров является Точка точки построения точки (int x, int y) { {{{{{{}}} {{{}} {} {{} {{} {{} ... температура возврата; } Он не выполняет struct point temp = new point() – Telenoobies

0

Помимо Node* newNode распределения (неинициализированная переменная ошибки), следующий выбросит ошибку возвращаемого значения:

Node* printList(Node* head) 
{ 
    while (head) 
    { 
     cout << head->data; 
     head = head->next; 
    } 
    cout << endl; 
} 

Вы установили Node* в качестве возвращаемого типа, но эта функция не имеет return значения. Поскольку эта функция распечатывает ваш список, ему ничего не нужно возвращать. Измените тип возврата на void.

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