gpt4 book ai didi

c++ - C++中有序链表类的插入函数问题

转载 作者:行者123 更新时间:2023-11-28 08:22:50 27 4
gpt4 key购买 nike

我有一个模板类 OList,它是一个有序链表(元素按升序排列)。它有一个名为 void insert(const T & val) 的函数,可以将一个元素插入列表中的正确位置。例如,如果我有一个值为 { 1,3,5 } 的整数 OList 并调用了 insert(4),则 4 将插入到 3 和5,制作 OList { 1,3,4,5 }

现在,当我将元素插入 EMPTY OList 时,我所做的工作正常。但是,当我使用以下代码时:

OList<char> list;
for (int i = 0; i < 3; i++) {
list.insert('C');
list.insert('A');
}
printInfo(list);

printList(list) 应该输出:

List = { A,A,A,C,C,C }  Size = 6        Range = A...C

相反,它输出:

List = { A,C,C,C, 

随后出现运行时错误。

我现在已经搞砸了大约 5 个小时,但我似乎没有取得任何进展(除了得到不同的错误输出和错误)。

有三段相关的代码:OList 的默认构造函数、operator<<、printInfo()、insert() 和用于插入的帮助函数,它找到要插入元素的节点。我看不出有任何理由提供 operator<< 或 printInfo(),因为它们在其他地方似乎工作正常。

// default constructor
OList() {
size = 0;
headNode = new Node<T>;
lastNode = new Node<T>;
headNode->next = lastNode;
lastNode->next = NULL;
}


void insert(const T & val) {
if ( isEmpty() ) {
lastNode->data = val;
}
else {
Node<T> * pre = headNode;
Node<T> * insertPoint = findInsertPoint(pre, val);
Node<T> * insertNode = new Node<T>;
insertNode->data = val;
insertNode->next = insertPoint;
pre->next = insertNode;

// why is pre equal to headNode?
// I thought I changed that when using it
// with findInsertPoint()
cout << (pre == headNode) << endl;
}

size++;
}

// returns the node AFTER the insertion point
// pre is the node BEFORE the insertion point
Node<T> * findInsertPoint(Node<T> * pre, const T & val) {
Node<T> * current = pre->next;

for (int i = 0; (i < getSize()) && (val > current->data); i++) {
pre = current;
current = current->next;
}

return current;
}

lastNode 只是列表中的最后一个节点。headNode 是一个“虚拟节点”,不包含任何数据,仅用作列表的起始位置。

提前致谢。我真的不好意思在互联网上寻求作业帮助,尤其是因为我确定主要问题是我对指针缺乏透彻的理解。

最佳答案

你把指向pre的指针按值传递给findInsertPoint,所以它被复制了,函数改变了指针的拷贝,当函数返回时,它仍然是旧的pre,而不是函数内部的pre。

如果要更改指针,必须将指针传递给函数的指针(或指针的引用)。

关于c++ - C++中有序链表类的插入函数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5160924/

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