我对C ++比较陌生,我有一个我真的不明白的问题。我的代码创建了一个链表。它实际上比这长,但为了这个问题,我把它砍了下来。
当我运行代码时,它会添加三个节点,然后当它删除带有b
的节点时,它会调用delete
运算符并最终删除该节点,但之后似乎回到delete
运算符(当我单步执行它)时它会杀死我的整个列表。
#include <iostream>
#include <string>
#include <cstdlib>
#include <cstdio>
using namespace std;
class CLinkedList
{
protected:
class ip_uri_store
{
public:
string uri, ip;
ip_uri_store* next;
ip_uri_store(const string& URI, const string& IP) {uri = URI, ip = IP, next = NULL;}
};
typedef ip_uri_store* nodeAddress;
nodeAddress head;
void AddNode(const string&, const string&, nodeAddress);
void DeleteNode(const string&, nodeAddress, nodeAddress);
public:
CLinkedList() {head = NULL;}
void AddNode(const string& URI, const string& IP) {AddNode(URI, IP, head);}
void DeleteNode(const string& URI) {DeleteNode(URI, head, head);}
};
void CLinkedList::AddNode(const string& URI, const string& IP, nodeAddress node)
{
nodeAddress temp = new ip_uri_store(URI, IP);
temp->uri = URI;
temp->ip = IP;
temp->next = head;
head = temp;
}
void CLinkedList::DeleteNode(const string& URI, nodeAddress node, nodeAddress behindNode)
{
if(node)
{
if(!node->uri.compare(URI))
node == head ? head = head->next : behindNode->next = node->next;
else
DeleteNode(URI, node->next, node);
delete node;
}
}
int main(int argc, char* argv[])
{
CLinkedList lList;
lList.AddNode("a", "1");
lList.AddNode("b", "2");
lList.AddNode("c", "3");
lList.DeleteNode("b");
return 0;
}
答案 0 :(得分:3)
即使比较失败(即delete node;
),您也在呼叫node->uri != URI
。
if(!node->uri.compare(URI))
{
node == head ? head = head->next : behindNode->next = node->next;
delete node;
}
else
DeleteNode(URI, node->next, node);
此外,情况似乎已经倒转。
答案 1 :(得分:1)
首先,你应该使用std :: list并避免重塑世界。 无论如何,如果由于某种原因你坚持这个实现:
同样,你应该认真考虑使用标准类......
答案 2 :(得分:0)
您正在所有节点上调用delete。它需要在条件内移动,因此您只删除与URI匹配的节点
if(!node->uri.compare(URI)) {
node == head ? head = head->next : behindNode->next = node->next;
delete node;
} else {
DeleteNode(URI, node->next, node);
}