2016-10-11 3 views
0

私はちょうど何時間も問題を抱え、自分のコードがどこで壊れているのか探していました。私はリンクされたリストを削除する方法を知っているが、何かが動作しません。CでリンクされたLIstを削除する

まず、int型と2 struct * nextおよび* prevのdataypeを持つ非常に単純な構造体です。

struct _list_{ 
    struct _list_ *next; 
    struct _list_ *prev; 
    float distance; 
} 

ここで私はpush_front関数を作成しており、うまく動作します。私は私が探している結果を得る。しかし、今私はpop_front関数を作成して何かが欠落しています。

この関数は距離を返し、リンクリストからそのリストを削除する必要がありますが、それを行うことはできません。ここ

は、私はあなたに感謝し、すべてのヘルプは素晴らしいことだ

int pop_front(list** header) 
{ 
    float number = (*header)->data; 
    list *head = *header; 
    list *remove = head; 

    // This should check if the pointer is pointing at the first element 
    while (head->prev != NULL) { 
    head = head->prev; 
    } 

    if (head) { 
    head = head->next; 
    free(remove); 
    remove = head; 
    remove->prev = NULL; 
    //if i remove the code below then i get this error 
    //*** Error in `./double_ended_queue.out': double free or 
    //corruption (fasttop): 0x0000000001d5a050 *** 
    //Pop up: 3 pointer: 3 Aborted (core dumped) 
    *header = *remove; 
    //And with this code i get a Segmentation fault (core dumped 
    return number; 
    } 
    return 0; 
} 

を書いたコードです。

P.S.リンクされたリストのすべての質問をここでチェックし、役に立たなかった。

+1

「delete」は予約済みのキーワードです。名前を変更してください。 – learner

+1

これはCですし、 'delete'という名前の変数を使うこともできますが(私はそれはお勧めしませんが)、そうでないといけません。いずれにせよ、*両方の言語タグを使うのは間違っています。 – usr2564301

+0

sryがC++タグ – twistedhat

答えて

0

あなたはどこからこの宿題を手に入れていますか? API sux。あなたがintを返すか、フロートしますか

:とにかくPointer Dequeue - pointer training

:ここでは、他の誰かがほぼ同じ宿題(左多くの問題を持っている私の答え、を指すリンクを)持っていたのですか?要素データはfloat型で、変数 "number"もありますが、関数はintを返します。そう

int pop_front(list** header) 
{ 
    float number = (*header)->data; 

、ここにあなたが実際に削除する要素を検索する...あなたは...その後

list *head = *header; 
    list *remove = head; 

    // This should check if the pointer is pointing at the first element 
    while (head->prev != NULL) { 
    head = head->prev; 
    } 

を削除しますが、しようとしている要素の値を取得します。天気はあなたが*ヘッダーポインタを調整する必要があり、あなたがチェックする必要があり、今

int pop_front(list** header) 
{ 
    list * head = *header; 
    while (head->prev) head = head->prev; 

(とすぐにそれを行う):

明らかに、あなたはそれを他の方法でラウンドを行う必要があり

if (*header == head) { 
     *header = head->next; 
    } 

ここで唯一行うことは、リストからオブジェクトを削除し、その値を取得して戻り値の前にメモリを解放することです。

head->next->prev = NULL; 
    float retval = head->data; 
    free(head); 
    return retval; 
} 

運動があなたに残されたよう:空のリストがクラッシュしないことを、確認してください;)

/編集:これはまた、最後の要素の除去のためにクラッシュしますので、次の2つの演習が残っています;)

+0

1つの簡単な質問ができます*ヘッダー= NULL; c? – twistedhat

+0

最後の要素を取り出します。 – twistedhat

+0

はい。 "* header"はオブジェクトであり、 "header"はそれを指し、constではないので値を割り当てることができます。 NULLは値です。したがって、NULLを割り当てることができます。 –

関連する問題