2017-01-16 53 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; 
}