gpt4 book ai didi

c++ - 链表调试(删除C++关键字很神秘)?

转载 作者:行者123 更新时间:2023-11-28 02:54:28 25 4
gpt4 key购买 nike

我正在尝试解决一个问题:从单向链表中删除一个节点只给出指向该节点的指针。我的做法是将列表中下一个元素的数据覆盖到列表的当前元素上。

在下面的代码中,我有两个版本的删除代码:deleteNode 和 deleteNode2。

void deleteNode(Node * x) {

while(x->next != NULL){
x->data = x->next->data;
x = x->next;
}

delete x;
x=NULL;

}

void deleteNode2(Node * x) {

while(x->next->next != NULL){
x->data = x->next->data;
x = x->next;
}

x->data = x->next->data;
delete x->next;
x->next=NULL;

}

我初始化列表:1,2,3,4,5 并尝试删除节点 3。对于 deleteNode,输出是:1,2,4,5,0 而对于 deleteNode2:1,2,4, 5

此外,当我从 deleteNode2 中删除“x->next=NULL”行时,它的输出与 1 相同。我的问题是,delete 语句在 C++ 中如何工作?它是否将地址指向的所有位都设置为0?

对于 deleteNode(..),x 指针已被删除,但它没有适本地设置为 NULL,因为它打印 0 而不是跳过它。对于 deleteNode2,语句“x->next=NULL”等同于 deleteNode 中的“x=NULL”,因为两个指针在概念上都指向相同的地址,但它们的作用不同?

其余代码如下所示:

#include<iostream>
#include<stdlib.h>

using namespace std;

class Node {
public:
int data;
Node * next;

Node ( int a ) {
data = a ;
next = NULL;
}

};

bool appendToTail ( Node * ptr, int a ){

while (ptr->next != NULL)
ptr = ptr->next;

if (ptr==NULL) {
return false;
}
else {
ptr->next = new Node(a);
}

}

void printList (Node * head) {

while (head!=NULL){

cout<<head->data<<endl;
head = head->next;

}

}

int main(void) {

Node * head;
head = new Node(1);
appendToTail(head,2);
appendToTail(head,3);
appendToTail(head,4);
appendToTail(head,5);

Node * i = head->next->next;

printList(head);
cout<<"removed:"<<endl;

deleteNode2(i);

printList(head);

return 0;

}

最佳答案

关于为什么 x 不变的答案可以用一个更简单的程序来证明:

#include <iostream>

void foo(int x)
{
x = 10; // change it to 10
}

int main()
{
int num = 4;
foo(num);
std::cout << num; // num is still 4! Why?
}

那么为什么 num 还是 4?为什么值没有变成 10?查找“按值传递”,因为这就是您在指针代码中所做的。

您应该通过引用传递指针,或者传递指向指针的指针(如果您需要进一步解释,请修改上面的示例,使返回 foo 时 num 等于 10)。

关于c++ - 链表调试(删除C++关键字很神秘)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22308320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com