2016-09-30 2 views
1
вино-

Я создаю стек, используя связанный список в C. Код выглядит следующим образом:Pop Функция В Linked Результаты Список Stack в Сегментация C

struct node{ 
    int xposition; 
    int yposition; 
    struct node* next; 
}; 

void pushToTop(struct node** hd, int x, int y){ 
    struct node* curr= *hd; 
    struct node* prev=NULL; 

    while(curr!=NULL){ 
     prev=curr; 
     curr= curr->next; 
    } 
    struct node* ptr= (struct node*)malloc(sizeof(struct node)); 
    ptr->xposition=x; 
    ptr->yposition=y; 
    ptr->next=curr; 

    if(prev==NULL){ 
     *hd= ptr;} 
    else{ 
     prev->next=ptr; 
    } 
} 

void popFromTop(struct node** hd){ 

    struct node* curr= *hd; 
    struct node* prev=NULL; 
    while (curr->next !=NULL) { 
     prev=curr; 
     curr=curr->next; 
    } 

    free(curr); 
    prev->next= NULL; 

} 

Функция Нажмите работает 100% времени , Функция pop работает, если в стеке есть несколько значений, но приводит к ошибке сегментации, когда в стеке есть одно значение. По моему отладчику, проблема в методе popFromTop с

prev->next=NULL; 

Может кто-то пожалуйста, помогите мне понять, в чем проблема?

+3

Если 'prev' является NULL, вы не хотите пытаться установить' prev-> next' в 'NULL'. Кроме того, если вы удаляете единственный узел, вам нужно установить '* hd' значение' NULL'. –

+1

И нужно выполнить пустой чек перед вызовом 'popFromTop'. – BLUEPIXY

+2

Не связанный с реальным вопросом, но почему вы используете хвост списка как вершину стека, так как для этого требуется обход полного списка как для поп, так и для нажатия? Это неэффективно. Используйте * head * списка как верхнюю часть стека, чтобы сразу нажать и поп получить доступ к нему без какого-либо обхода. – kaylum

ответ

3

Как уже упоминалось в комментариях @DavidSchwartz. Добавить, если условие.

void popFromTop(struct node** hd){ 

    struct node* curr= *hd; 
    //Base condition to handle empty list 
    if(*hd == NULL) 
     return; 

    struct node* prev=NULL; 
    while (curr->next !=NULL) { 
     prev=curr; 
     curr=curr->next; 
    } 

    free(curr); 
    if(prev != NULL) 
     prev->next= NULL; 
    else 
     *hd = NULL; 

} 
+0

Большое вам спасибо! Это работает. Я отсутствовал в базовых случаях, и проблема @DavidSchwartz указала. – Alcore

1

Если есть только один узел, в pop() prev всегда NULL. Поэтому поставьте условие до prev->next = NULL.

Также есть еще одна ошибка: если есть 0 узлов, curr также является NULL в pop(), поэтому вы также можете обработать это.

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