2015-01-23 5 views
-1

Я понимаю общую концепцию преемника в BST. Все еще есть что-то не так с моим кодом, и я не понимаю, в чем проблема.BST, преемник, код выпуска

Компилятор запускает программу, которая начинается и заканчивается через пару секунд. Я считаю, что это ошибка типа «segmentation fault» (я использую Windows и Dev C++).

#include <stdio.h> 
#include <stdlib.h> 
struct Node{ 
    int data; 
    struct Node* next; 
}; 

struct Node* head; 

struct Node* GetNewNode(int x){ 
    struct Node* newNode= (struct Node*)malloc(sizeof(struct Node)); 
    newNode->data = x; 
    newNode->next =NULL; 
return newNode; 
} 

void InsertAtHead(int x){ 
    struct Node* newNode = GetNewNode(x); 
    if(head==NULL){ 
     head=newNode; 
     return;} 
newNode->next=head; 
head=newNode; 
} 

void Print(){ 
    struct Node* temp=head; 
    printf("forward:"); 
    while(temp!=NULL){ 
     printf("%d", temp->data); 
     temp = temp->next; 
} 
printf("\n"); 
} 

void ReversePrint(struct Node* p){ 
    if(p==NULL){ 
     return; 
    } 
    ReversePrint(p->next); 
    printf("%d",p->data); 
} 

int main(void){ 
    head=NULL; 
    InsertAtHead(2); Print(); ReversePrint(2); 
    InsertAtHead(4); Print(); ReversePrint(4); 
    InsertAtHead(6); Print(); ReversePrint(6); 

} 
+1

Что это за 'ReversePrint (2)'? –

+1

Если у вас есть сообщение об ошибке, сообщите сообщение об ошибке __exact__. То, что вы считаете, может быть неточным. –

+0

выполните с помощью отладчика – pm100

ответ

0

Ваш код имеет несколько ошибок упомянуть

  1. Вы всегда reassiging head в функции InsertAtHead(). Вместо этого вы должны сохранить ссылку на хвост списка и обновить следующий узел при каждом вызове до InsertAtHead().

  2. Вы передаете целое число ReversePrint(), которое ожидает указатель struct Node, вызывающий ошибку сегментации.

  3. Вы никогда не освобождаете узлы. Я не добавил функцию FreeNodes(), ее вам должно быть легко реализовать.

Это исправленная версия кода, надеюсь, что это поможет вам увидеть, что ваши ошибки

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

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

struct Node* head; 
struct Node* tail; 

struct Node* GetNewNode(int x) { 
    struct Node* newNode = malloc(sizeof(struct Node)); 

    if (newNode == NULL) 
     return NULL; 
    newNode->data = x; 
    newNode->next = NULL; 

    return newNode; 
} 

void InsertAtHead(int x) { 
    struct Node* newNode = GetNewNode(x); 
    if (head == NULL) { 
     head = newNode; 
     tail = head; 
     return; 
    } 
    if (tail != NULL) 
     tail->next = newNode; 
    tail = newNode; 
} 

void Print(){ 
    struct Node* current = head; 

    printf("forward:\n"); 
    while (current != NULL) { 
     printf("\t%d\n", current->data); 
     current = current->next; 
    } 
    printf("\n"); 
} 

void ReversePrint(struct Node *node) { 
    if (node == NULL) { 
     return; 
    } 
    ReversePrint(node->next); 
    printf("%d\n", node->data); 
} 

int main(void) { 
    InsertAtHead(2); 
    InsertAtHead(4); 
    InsertAtHead(6); 

    Print(); 
    ReversePrint(head); 

    return 0; 
} 

вам не нужно явно инициализировать глобальные переменные 0 или NULL.

+0

Спасибо большое! :) – ninigi

+0

@ninigi вы можете принять ответ, если он сработает для вас. –

+0

Как я могу это сделать? – ninigi

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