我的代码适用于链表开头的元素,但不适用于中间或末尾的元素。感谢您的帮助!
void remove(){
if (!head)
printf("\nNo nodes to delete. List is empty.");
else{
int n;
struct node* help = head;
printf("Enter an element to delete: ");
scanf("%d", &n);
if(head->data == n){
help-> next->prev = 0;
head = help -> next;
} else{
while(help -> next){
if(help -> data == n){
help -> next -> prev = help -> prev;
help -> prev -> next = help -> next;
}
else help = help -> next;
}
}
}
}
最佳答案
首先,使用 NULL 而不是 0 来表示 NULL。在C语言中,你需要这样做。在 C++ 中,它是可选的,但您标记了问题 C。
help-> next->prev = 0;
你永远不会检查是否有第二个元素。如果列表只有一个元素,则此操作会失败 - 因此它甚至不适用于第一个元素。
while(help -> next){
if(help -> data == n){
这将阻止您删除最后一个元素,因为一旦到达(但在处理之前)最后一个元素,您就不再查看列表。但即使你没有,接下来的几行:
help -> next -> prev = help -> prev;
help -> prev -> next = help -> next;
如果它是最后一个,将会导致你崩溃,因为它不会检查后面是否还有另一个元素。
此外,箭头 ->
前后的空格也很少见。我建议不要再这样做了。
关于c - 从双向链表中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18506897/