我有以下代码。目的是,每个节点都存储一个索引,并且我希望将该节点以升序插入列表中。例如,如果列表当前具有1、3、4、8、9和10,我希望能够插入索引为2的节点,使其为1、2、3、4、8、9和10。
void createNode(int index) {
Node *newNode = new Node();
newNode->index = index;
traverse(newNode, head);
}
这将创建节点并存储索引值。
void traverse(Node *newN, Node *head) {
if (head == NULL) {
newN->next = NULL;
head = newN;
}
else if (head->index < newN->index) {
newN->next = head->next;
head->next = newN;
}
else
traverse(newN, head->next);
}
这是一个递归函数,用于遍历列表并查找要插入节点的位置。如果head为null,则假定列表为空(或者看到此函数是递归的,它已经到达列表的末尾)。否则,它会检查任何高于其索引的值,并且在遇到该索引时,应将自身插入到索引后面。
void display(Node *head) {
if (head == NULL) return;
cout << head->data << " " << head->index << " ";
display(head->next);
}
这应该显示它。但是什么都没有给我。在每个if条件上使用cout进行调试以查看执行了什么,这表明第一个if条件一直在执行。但是列表中什么也没有写。
任何帮助,非常感谢。
更新:
void createNode(int index) {
Node *newNode = new Node();
newNode->index = index;
if (head == NULL) {
newNode->next = NULL;
head = newNode;
}
traverse(newNode, head);
}
void traverse(Node *newN, Node *head) {
if (head->index < newN->index) {
newN->next = head->next;
head->next = newN;
}
else
traverse(newN, head->next);
}
这可行,所以我猜不是指针问题?
答案 0 :(得分:3)
您不会更改任何内容:
head = newN;
因为它被传递为:
void traverse(Node *newN, Node *head) {
如果需要更改它,则需要传递对指针的引用:
void traverse(Node *newN, Node *&head) {
您也不应使用Node *head
之类的原始指针,而应使用智能指针。