在双链接列表中插入和删除元素

时间:2017-01-16 17:58:30

标签: c data-structures doubly-linked-list

#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()函数中遇到问题。 当我编译并运行代码时,它会在屏幕上不断打印。需要帮助。

2 个答案:

答案 0 :(得分:3)

delete_end()中,代码不处理1个节点列表的情况,其中r != NULLr->prev == NULLr->next == NULL。当代码尝试(r->prev)->next = NULL时会出现问题。

delete_begin()也不处理1节点列表。 r=r->next可以设置r == NULL,然后设置r->prev == NULL

返回delete_end(),代码应返回h,而不是r

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