Sinlge 链表,C++,删除所有和搜索功能的问题



我试图实现一个链表。但是,我在搜索和删除功能方面遇到问题。我遇到了分段错误,我不知道为什么。有人可以解释我,我做错了什么,以及如何改进这段代码才能工作吗?谢谢

#include <iostream>
class T
{
private:
float t;
public:
T *next;
T()
{
this->t = 0.0;
this->next = NULL;
}
float getT()
{
return this->t;
}
T(float t, T* next)
{
this->t = t;
this->next = next;
}
T(const T& tx)
{
this->t = tx.t;
this->next = tx.next;
}
void print()
{
std::cout << this->t << "n";
}
};
class MyList
{
private:
T *head;
public:
T* add_T(T *x)
{
T *new_head = new T(*head);
new_head -> next = head;
head = new_head;
return head;
}
void print()
{
for(T *curr = head; curr != NULL; curr = curr->next)
curr->print();
}
void delete_all()
{
T *x = head;
while (x!= NULL)
{
head = head->next;
delete x;
x = head;
}
head = NULL;
}
T * search_val(T * k)
{
if (this->head == NULL)
return NULL;
if (this->head->getT() == k->getT())
return this->head;
return search_val(this->head->next);
}
};
int main()
{
MyList ml;
T a,b,c;
ml.add_T(&a);
ml.add_T(&b);
ml.add_T(&c);
ml.print();
T *y = new T(3.14, NULL);
T *x = ml.search_val(y);
ml.delete_all();
delete x,y;
return 0;
}

看起来你的列表头没有初始化(应该可能是0(。 为什么您的T* add_T(T *x)会创建一个新元素?它可能应该只是将给定的元素插入到列表中,而不是创建一个新元素。如果你的 List 类有一个T head;你可以通过调用类似的东西来添加元素

T* next = t.head;
t.head = x;
x->next = next;

在这种情况下,销毁列表将为空,因为列表元素来自堆。

class MyList
{
private:
T *head;
public:
T* add_T(T *x)
{
T *new_head = new T(*head);
new_head -> next = head;
head = new_head;
return head;
}

Q1:head构建MyList时指向什么?
A1:我们无法知道(这是未定义的(。

Q2:为什么add_T()不使用x参数?
A2:它实际上并没有添加x指向的元素,而是复制当前head

修复这两个错误将使您走得更远。

另请参阅:如何调试小程序。

你在main()中处理节点的方式都是错误的。 列表之外的代码应侧重于,而不是节点

您没有初始化列表的head成员,因为MyList缺少默认构造函数。

add_T()完全无视其x论点。 而是创建head节点的副本,然后将该副本插入列表的前面。

您正在尝试deletesearch_val()delete该节点后返回的节点delete_all()该节点。

尝试更多类似的东西:

#include <iostream>
class MyNode
{
public:
float data;
MyNode *next;
MyNode(float data = 0.0f, MyNode* next = NULL)
: data(data), next(next)
{
}
void print() const
{
std::cout << data << std::endl;
}
};
class MyList
{
private:
MyNode *head;
public:
MyList()
: head(NULL)
{
}
~MyList()
{
delete_all();
}
MyNode* addToFront(float value)
{
head = new MyNode(value, head);
return head;
}
/*
MyNode* addToBack(float value)
{
MyNode **curr = &head;
while (*curr != NULL)
curr = &((*curr)->next);
return (*curr = new MyNode(value));
}
*/
void print() const
{
for(MyNode *curr = head; curr != NULL; curr = curr->next)
curr->print();
}
void delete_all()
{
for(MyNode *curr = head; curr != NULL; curr = head)
{
head = curr->next;
delete curr;
}
}
MyNode* search_val(float value)
{
for(MyNode *curr = head; curr != NULL; curr = curr->next)
{
if (curr->data == value)
return curr;
}
return NULL;
}
};
int main()
{
MyList ml;
ml.addToFront(3.14f);
ml.addToFront(2.99f);
ml.addToFront(1.25f);
ml.print();
if (ml.search_val(3.14f) != NULL)
std::cout << "found" << std::endl;
else
std::cout << "not found" << std::endl;
return 0;
}

相关内容

  • 没有找到相关文章

最新更新