2017-01-16 52 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

你delete_end()函數沒有真正意義。你有'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->next可以設置爲r == NULL,然後是r->prev == NULL

回到delete_end(),代碼應該返回h,而不是r

+0

好的。這是一種情況,你給我帶來的通知...但我已經插入4節點,然後我試圖刪除一個。所以1個節點列表案例還沒有出現。 –

+0

@AjayKhetan - 我更新了我的答案,如果列表不是空的,delete_end()需要返回h,但它會返回r。 – rcgldr

+0

thanx很多..那1個節點列表的情況是一個問題。與此同時,我必須返回第一個節點的地址,並且返回最後一個節點的地址。得到它了。 –

0

該函數至少有兩個嚴重問題。

所有它的指針r可以不等於頭節點的地址返回由於循環

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

但是你需要返回一個指向列表的頭節點指針的第一。

另外,如果指針r指向頭節點,那麼r->prev等於NULL。因此,此聲明

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

可能會導致程序未定義的行爲。

我可以建議如下函數實現

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; 
}