【发布时间】:2020-02-26 11:49:39
【问题描述】:
这是一个类项目的链表实现,除了这个功能外,它都可以工作。我已将 seg-fault 的位置缩小到指示的行(包含在 'std::cout...' statments 中。
// Purpose: removes a section of a lists
// Parameters: start pointer to the begining of the section to remove.
// end pointer to the end of the section to remove.
// Preconditions: start and end are pointers to nodes in this list.
// start precedes end in this list.
// Postconditions: elements between start and end (inclusive) are removed
// from the list.
template<typename T>
void LinkedList<T>::clip(LLNode<T>* start, LLNode<T>* stop)
{
if(m_size > 2)
{
LLNode<T>* walker = m_head;
LLNode<T>* hold;
LLNode<T>* deleter;
while(walker != start)
{
hold = walker;
walker = walker -> m_next;
}
int i;
//TODO: seg-fault here
if(stop == NULL)
{
hold -> m_next = NULL;
}
else if(stop -> m_next == NULL)
{
hold -> m_next = NULL;
}
else
{
std::cout << "error on next line\n";
hold -> m_next = stop -> m_next;
std::cout << "oh... i guess it's fixed...\n";
}
if(hold -> m_next == NULL)
{
m_back = hold;
}
stop -> m_next = NULL;
walker = start;
while(walker != NULL && walker -> m_next != NULL)
{
hold = walker;
walker = walker -> m_next;
delete deleter;
deleter = hold;
i++;
}
delete walker;
delete deleter;
m_size -= i;
}
else
{
clear();
}
}
输出如下:
下一行出错
分段错误(核心转储)
任何帮助将不胜感激!
【问题讨论】:
-
当
start等于head 时,您不处理这种情况(那时hold尚未初始化!)。 -
谢谢!我没有抓住那个!但是,问题仍然存在于列表中间的开始和结束。 :/ 编辑:即使我的测试没有使用头部作为开始,它修复了它。我将发布更新的代码作为解决方案!谢谢!
-
你不需要单独处理
stop->m_next和nullptr,这也包括在 else 后面。你应该更喜欢 C++ keywords (nullptr) 而不是旧的(过时的?)C macros (NULL)。 -
你可以更简单地删除:
while(walker) { hold = walker; walker = walker->m_next; delete hold; ++i; } /*no deletes afterwards*/ -
if(m_size >/*!*/ 2) { } else { clear(); }- 如果stop是start的直接继任者或者 start 是第二个元素?你不想同时删除这两个元素......
标签: c++ linked-list segmentation-fault