2016-09-30 4 views
1

は次のとおりです。ポップ機能

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関数は、スタックに複数の値がある場合に機能しますが、スタック内に単一の値がある場合にはセグメンテーションフォルトが発生します。 私のデバッガによると、問題は

prev->next=NULL; 

でpopFromTop方法である誰かが私は問題が何であるかを理解する助けていただけますか?ポップで唯一のノードがある場合、

+3

'prev'がNULLの場合、' prev-> next'を 'NULL'に設定しようとしません。また、唯一のノードを削除した場合は、 '* hd'を' NULL'に設定する必要があります。 –

+1

'popFromTop'を呼び出す前に空のチェックが必要です。実際の問題とは関係のない – BLUEPIXY

+2

が、それはポップとプッシュの両方のための完全なリストのトラバースを必要とするなぜあなたは、スタックの最上位としてリストの尾を使用していますか?それは非効率的です。リストの* head *をスタックの一番上にして、pushとpopの両方がトラバーサルなしですぐにアクセスできるようにします。 – 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

()prevは常にNULLです。したがって、prev->next = NULLの前に条件を入れてください。 0のノードが存在する場合、currは(ポップにもNULLである)ので、あなたもそれを処理することがあります:

はまた、1以上のバグがあります。

関連する問題