在双链接列表中插入和删除元素 #包括 #包括 类型定义结构数据列表 { 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);//屏幕上显示无限元素 }
上面是我试图编写的代码,用于在双链接列表中插入和删除元素。我的插入部件和从一开始就删除节点,两者都工作得非常好。我在delete_end()函数中遇到了问题。 当我编译并运行代码时,它会在屏幕上连续打印。需要帮助。在在双链接列表中插入和删除元素 #包括 #包括 类型定义结构数据列表 { 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()
中,代码不处理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;
}