删除链表的第一个和最后一个元素时遇到问题。当我试图删除第一个元素时,我的代码什么都不做(当我打印一个列表时,删除的元素仍然存在)。当我试图删除最后一个时,控制台显示核心转储。
这是我的代码:
void Delete_element(point del, node *elem) {
struct node *temp = elem;
if(elem->p.x==del.x && elem->p.y == del.y) {
elem=elem->next;
return;
} else {
while(elem->next->next!=NULL) {
if(elem->next->p.x==del.x && elem->next->p.y==del.y) {
temp=elem->next;
elem->next=elem->next->next;
elem->prev=temp->prev;
return;
}
temp=temp->next;
}
}
if(elem->next->p.x==del.x && elem->next->p.y==del.y) {
elem->next=NULL;
}
}
编辑:修复后
void Delete_element(point del, node *& elem){
struct node *temp = elem;
if(elem->p.x==del.x && elem->p.y == del.y){
temp = elem->next;
free(elem);
elem=temp;
return;
}else{
while(elem->next->next!=NULL)
{
if(elem->next->p.x==del.x && elem->next->p.y==del.y)
{
temp=elem->next;
elem->next=elem->next->next;
elem->next->prev=elem;
return;
}
elem=elem->next;
}}
if(elem->next->p.x==del.x && elem->next->p.y==del.y){
elem->next=NULL;
return;
}
}
现在删除中间元素已被破坏。
请帮忙
答案 0 :(得分:1)
首先,您实际上并没有删除任何内容。但是,您正在留下悬空指针,导致内存泄漏。在每种情况下,你应该删除一些东西。这就是为什么你仍然看到数据而不是垃圾或某种崩溃。
其次,你看起来有一个无限循环。当你点击你的while循环时你永远不会改变elem所以elem-> gt; next-> next永远不会改变。
第三,为什么要删除while循环中的elem->?删除elem以避免混淆。
编辑:
你无法改变这样的元素。把elem想象成你传入的整数或浮点数。如果你想让elem保持头部变化,你将不得不传入指向elem的指针,这最终成为指针的指针。
答案 1 :(得分:0)
我相信你至少有两个错误:
为了修改第一个元素,您必须在修改此指针时传递对第一个指针的引用。使用方法:
void Delete_element(point del, node *& elem)
从中间删除元素似乎被打破了。 而不是:
elem->prev=temp->prev
你应该:
elem->next->prev=element