2016-08-03 6 views
-2

私は初心者のプログラマーです。一週間前に私はリンクリストに紹介されましたが、私はまだこれを回避するために苦労しています。Cプログラミング:リンクリストの最後の要素をポップする方法は?

現在、リンクリストから最後の要素を削除するのに役立つ関数を作成しようとしています。私はここで何が間違っているのか、いくつかの説明に感謝します。ご意見ありがとうございます。

私はここで、現在の構造体に

に触れたり、変更することはできませんよ、私の構造体である:

typedef struct node { 
    ElemType val; 
    struct node *next; 
} NODE; 

struct list_struct { 
    NODE *front; 
    NODE *back; 
}; 

そしてHERESに私の現在のコード:リストが空の場合

、我々は何もしないし、任意の値 を返します。リストの最後の要素が削除され、 の値が返されます。

ElemType lst_pop_back(LIST *l) { 


    NODE * p = l->front; 
    NODE * trail = l->front; 


    if(p == NULL) return 0; 

    if(lst_len(l) == 1){ 
     free(p); 
     l->front = NULL; 
     l->back = NULL; 
    } 
    else{ 
     p=p->next; 

     while(p != NULL){ 

      if(p->next == NULL) free(p); 

      trail = trail->next; 
      p=p->next; 
     } 
     trail= trail->next; 
     trail->next= NULL; 

    } 
    return 0; 
} 

私はMAC上のXcodeを使用していると私が得るエラーは次のとおりです。スレッド1:EXC_ACCESS(コード= 1、アドレス= 0x8の)

+3

*私は私がここで間違って何をやっているいくつかの説明をいただければ幸いです* - なぜあなたはあなたが何か間違ったことをやっていると思いますか。?エラー/セグメンテーション/予期しない結果が表示されていますか? –

+2

これで、見出しを二重リンクリストに変更しました。だから今私は元の "トピックから外れた"コメントに戻ります。あなたが単独でリンクされたリストだけを持っているなら、 'list'structの' back'メンバのポイントは何ですか? – John3136

+1

また、単独リンクされたリストを作成するときに間違っているようです。だから、ソースコードのその部分を追加してください。 – mash

答えて

-1

私はときに、あなたが取得しているエラーが発生したと思いますすでに割り当て解除されているものにアクセスしてみてください。あなたはここでこれをやっています:

リスト構造にはバックポインタが含まれているので、私はあなたのお手伝いをすることをお勧めします。 p->nextがリストのバックポインタと同じものを指すまでpがリスト内を移動するようにしてから、p->nextをnullにします。

また、POPまたはREMOVEをリストから削除する必要がありますか?あなたの質問は、削除を言うが、関数の名前はlst_pop_backです。ポップしている場合は、最後の値も返す必要があります。

+2

あなたはそれが二重自由であると思いますか? – mash

+0

popが削除して戻ります。私はOPがその部分を明確にしていると思いますが、使用できるものを実装していないにもかかわらず、戻り値の型はint型のtypemefのようなElemTypeです。 – mash

0

XCodeエラーEXC_BAD_ACCESS(code=1, address=0x8)は、誰かがアクセスできないメモリにアクセスしようとしていることを意味します。 XCodeの境界チェックは良いと言われているので、それらを信頼させてください。 OPが私たちに正確な行番号を教えてくれるわけではないが、推測できるのはちょっと残念だ。私はKaterina B.とここで同意し、犯人と同じ行を想定します。具体的には

ElemType lst_pop_back(LIST * l) 
{ 
    // p and trail point to the first node 
    NODE *p = l->front; 
    NODE *trail = l->front; 

    if (p == NULL) 
    return 0; 

    if (lst_len(l) == 1) { 
    free(p); 
    l->front = NULL; 
    l->back = NULL; 
    } else { 
    p = p->next; 
    // Now: trail->next points to the old p 
    // and p to p->next, that is: trail points 
    // to the node before p 

    // while trail is not the last node 
    while (p != NULL) { 
     // if p is the last node 
     if (p->next == NULL){ 
     // release memory of p, p points to nowhere from now on 
     free(p); 
     } 
     // Following comments assume that p got free()'d at this point 

     // because trail points to the node before p 
     // trail->next points to the node p pointed to 
     // before but p got just free()'d 
     trail = trail->next; 
     // p got free()'d so p->next is not defined 
     p = p->next; 
    } 
    // assuming p got free()'d than trail->next is one step 
    // further into unknown, pardon, undefined territory 
    trail = trail->next; 
    trail->next = NULL; 

    } 
    return 0; 
} 
関連する問題