Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在双链接列表中插入和删除元素 #包括 #包括 类型定义结构数据列表 { int数据; 结构数据列表*下一个,*上一个; }数据列表; 数据列表*插入\开始(数据列表*h,整数d) { dlist*temp=(dlist*)malloc(sizeof(dlist)); 温度->数据=d; temp->next=temp->prev=NULL; if(h==NULL) { h=温度; //t=温度; } 其他的 { 温度->下一步=小时; h->prev=温度; h=温度; } 返回h; } 数据列表*删除\开始(数据列表*h) { dlist*r=h; if(r==NULL) { printf(“空列表”); 返回0; } 其他的 { dlist*ptr=r; //ptr=r; r=r->next; r->prev=NULL; 免费(ptr); } 返回r; } 数据列表*删除\结束(数据列表*h) { dlist*r=h; if(r==NULL) { printf(“空列表”); 返回0; } 其他的 { while(r->next) r=r->next; dlist*p=r; (r->prev)->next=NULL; 自由基(p); 返回r; } //返回r; } 无效显示(数据列表*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=插入开始(d,2); d=插入开始(d,3); d=插入开始(d,4); d=插入开始(d,5); 显示器(d); d=删除\开始(d); printf(“删除后1”); 显示器(d); d=删除_结束(d); printf(“删除后2”); display(d);//屏幕上显示无限元素 }_C_Data Structures_Doubly Linked List - Fatal编程技术网

在双链接列表中插入和删除元素 #包括 #包括 类型定义结构数据列表 { int数据; 结构数据列表*下一个,*上一个; }数据列表; 数据列表*插入\开始(数据列表*h,整数d) { dlist*temp=(dlist*)malloc(sizeof(dlist)); 温度->数据=d; temp->next=temp->prev=NULL; if(h==NULL) { h=温度; //t=温度; } 其他的 { 温度->下一步=小时; h->prev=温度; h=温度; } 返回h; } 数据列表*删除\开始(数据列表*h) { dlist*r=h; if(r==NULL) { printf(“空列表”); 返回0; } 其他的 { dlist*ptr=r; //ptr=r; r=r->next; r->prev=NULL; 免费(ptr); } 返回r; } 数据列表*删除\结束(数据列表*h) { dlist*r=h; if(r==NULL) { printf(“空列表”); 返回0; } 其他的 { while(r->next) r=r->next; dlist*p=r; (r->prev)->next=NULL; 自由基(p); 返回r; } //返回r; } 无效显示(数据列表*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=插入开始(d,2); d=插入开始(d,3); d=插入开始(d,4); d=插入开始(d,5); 显示器(d); d=删除\开始(d); printf(“删除后1”); 显示器(d); d=删除_结束(d); printf(“删除后2”); display(d);//屏幕上显示无限元素 }

在双链接列表中插入和删除元素 #包括 #包括 类型定义结构数据列表 { int数据; 结构数据列表*下一个,*上一个; }数据列表; 数据列表*插入\开始(数据列表*h,整数d) { dlist*temp=(dlist*)malloc(sizeof(dlist)); 温度->数据=d; temp->next=temp->prev=NULL; if(h==NULL) { h=温度; //t=温度; } 其他的 { 温度->下一步=小时; h->prev=温度; h=温度; } 返回h; } 数据列表*删除\开始(数据列表*h) { dlist*r=h; if(r==NULL) { printf(“空列表”); 返回0; } 其他的 { dlist*ptr=r; //ptr=r; r=r->next; r->prev=NULL; 免费(ptr); } 返回r; } 数据列表*删除\结束(数据列表*h) { dlist*r=h; if(r==NULL) { printf(“空列表”); 返回0; } 其他的 { while(r->next) r=r->next; dlist*p=r; (r->prev)->next=NULL; 自由基(p); 返回r; } //返回r; } 无效显示(数据列表*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=插入开始(d,2); d=插入开始(d,3); d=插入开始(d,4); d=插入开始(d,5); 显示器(d); d=删除\开始(d); printf(“删除后1”); 显示器(d); d=删除_结束(d); printf(“删除后2”); display(d);//屏幕上显示无限元素 },c,data-structures,doubly-linked-list,C,Data Structures,Doubly Linked List,上面是我试图编写的代码,用于在双链接列表中插入和删除元素。我的插入部件和从一开始就删除节点,两者都工作得非常好。我在delete_end()函数中遇到了问题。 当我编译并运行代码时,它会在屏幕上连续打印。需要帮助。在delete_end()中,代码不处理1节点列表的情况,其中r!=空,但r->prev==NULL和r->next==NULL。当代码尝试(r->prev)->next=NULL时,会出现问题 delete\u begin()也不处理1节点列表r=r->next可以设置r==NULL

上面是我试图编写的代码,用于在双链接列表中插入和删除元素。我的插入部件和从一开始就删除节点,两者都工作得非常好。我在delete_end()函数中遇到了问题。 当我编译并运行代码时,它会在屏幕上连续打印。需要帮助。

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

delete\u begin()
也不处理1节点列表
r=r->next
可以设置
r==NULL
,后跟
r->prev==NULL


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

函数至少有两个严重问题

首先,它返回指针
r
,由于循环的原因,指针可能与头节点的地址不相等

#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

}
但是,您需要返回指向列表头节点的指针

另外,如果指针
r
指向头部节点,则
r->prev
等于
NULL
。因此,这项声明

while(r->next)
    r=r->next;
可能导致程序的行为未定义

我可以建议以下函数的实现

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

您的delete_end()函数实际上没有意义。您有
h
r
p
,它们都指向同一事物。创建
p
,对其不做任何操作,然后
free()
it.ok。这是一个案例,你把通知带给我。。。但是我已经插入了4个节点,然后我正在尝试删除一个。所以1节点列表的情况还没有出现。@AjayKhetan-我更新了我的答案,如果列表不是空的,delete_end()需要返回h,但它返回的是r.thanx。。1节点列表案例是一个问题。除此之外,我还必须返回第一个节点的地址,并返回最后一个节点的地址。知道了。
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;
}