2017-01-16 17 views
2
#include<stdio.h> 
#include<stdlib.h> 

typedef struct dlist 
{ 
    int data; 
     struct dlist *next, *prev; 
}dlist; 

dlist* insert_begin(dlist *h,int d) 
{ 
    dlist *temp = (dlist*)malloc(sizeof(dlist)); 
    temp->data = d; 
    temp->next = temp->prev= NULL; 
    if(h==NULL) 
    { 
     h=temp; 
     // t=temp; 
    } 
    else 
    { 
     temp->next = h; 
     h->prev = temp; 
     h = temp; 
    } 
    return h; 
} 
dlist* delete_begin(dlist *h) 
{ 
    dlist *r = h; 
    if(r==NULL) 
    { 
     printf("empty list"); 
     return 0; 
    } 
    else 
    { 
     dlist *ptr = r; 
     //ptr = r; 
     r=r->next; 
     r->prev = NULL; 
     free(ptr); 
    } 
    return r; 
} 
dlist* delete_end(dlist *h) 
{ 
    dlist *r = h; 
    if(r==NULL) 
    { 
     printf("empty list"); 
     return 0; 
    } 
    else 
    { 
     while(r->next) 
      r=r->next; 

     dlist *p = r; 
     (r->prev)->next= NULL; 
     free(p); 
     return r; 
    } 

    //return r; 
} 
void display(dlist *h) 
{ 
    dlist *r = h; 
    // printf("%d",r->data); 

    //printf("ajay"); 
    while(r) 
    { 
     printf("%d ---- >",r->data); 

     r=r->next; 
    } 
} 
void main() 
{ 
    dlist *d=NULL; 

    d = insert_begin(d,2); 
    d= insert_begin(d,3); 
    d= insert_begin(d,4); 
    d= insert_begin(d,5); 
    display(d); 
    d = delete_begin(d); 
    printf("After deletion1"); 
    display(d); 
    d= delete_end(d); 
    printf("After deletion2"); 
    display(d);        // infinite elements are displaying on screen 

} 

上記は、ダブルリンクリストの要素の挿入と削除のために書いていたコードです。私の部分を挿入し、最初からノードを削除すると、どちらも絶対にうまく動作しています。私はdelete_end()関数の問題に直面しています。 コードをコンパイルして実行すると、画面上に連続して印刷されています。助けが必要。ダブルリンクリストの要素の挿入と削除

+0

次の関数の実装を提案することができます。あなたは 'h'、' r'、 'p'を持ち、すべてが同じものを指しています。あなたは 'p'を作成し、何もしないで、' free() 'します。 – mhodges

答えて

3

delete_end()において、コードは、1つのノードリストの場合、r != NULLが、r->prev == NULLr->next == NULLを処理しません。これは、コードが(r->prev)->next = NULLを試行するときに問題が発生します。

delete_begin()ノードリストも1つも処理されません。 r=r->nextr == NULLと、それに続いてr->prev == NULLと設定できます。

delete_end()に戻ると、hではなくrが返されます。

+0

ok。それは1つの場合、私に通知をもたらす...しかし、私は4つのノードを挿入し、次に私は1つを削除しようとしています。したがって、1ノードリストのケースはまだ発生していません。 –

+0

@AjayKhetan - 私の答えを更新しました。リストが空でない場合、delete_end()はhを返す必要がありますが、代わりにrを返します。 – rcgldr

+0

ありがとうございます1ノードリストの場合は問題です。それと一緒に、私は最初のノードのアドレスを返す必要があり、私は最後のノードのアドレスを返しています。とった。 –

0

この機能には、少なくとも2つの深刻な問題があります。

それはあなたがリストの先頭ノードを指すポインタを返す必要が原因ループ

while(r->next) 
    r=r->next; 

にヘッドノードのアドレスと等しくすることができポインタrを返すまず第一に。

また、ポインタrがヘッドノードを指している場合、r->prevNULLに等しくなります。したがって、このステートメント

(r->prev)->next= NULL; 

は、プログラムの動作が未定義になる可能性があります。

私はあなたのdelete_end()関数は、本当に意味がない

dlist* delete_end(dlist *h) 
{ 
    if(h == NULL) 
    { 
     printf("empty list"); 
    } 
    else 
    { 
     dlist **r = &h; 

     while ((*r)->next) r = &(*r)->next; 

     dlist *p = *r; 

     if ((*r)->prev) 
     {   
      (*r)->prev->next = NULL; 
     } 

     *r = (*r)->prev; 

     free(p); 
    } 

    return h; 
} 
関連する問題