Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 克隆链接列表会导致分段错误_C++_Algorithm_Linked List - Fatal编程技术网

C++ 克隆链接列表会导致分段错误

C++ 克隆链接列表会导致分段错误,c++,algorithm,linked-list,C++,Algorithm,Linked List,我试图将一个链表克隆到另一个链表,但我遇到了分段错误。我有一个结构,有两个指针m_Next和m_Bak,还有一个存储名称的char指针。我正在尝试用C++做这件事。我需要克隆src并返回一个克隆的链表 TEMPLOYEE * cloneList ( TEMPLOYEE * src ) { TEMPLOYEE* curr = src, *temp; while (curr) { temp = curr->m_Next;

我试图将一个链表克隆到另一个链表,但我遇到了分段错误。我有一个结构,有两个指针
m_Next
m_Bak
,还有一个存储名称的char指针。我正在尝试用C++做这件事。我需要克隆
src
并返回一个克隆的链表

TEMPLOYEE        * cloneList    ( TEMPLOYEE       * src ) {

    TEMPLOYEE* curr = src, *temp;

    while (curr) {
        temp = curr->m_Next;
        temp->m_Name = new char[strlen(curr->m_Name) + 1];
        strcpy ( temp->m_Name, curr->m_Name);
        curr->m_Next->m_Next = temp;
        curr = temp;
    }

    curr = src;

    while (curr) {
        curr->m_Next->m_Bak = curr->m_Bak->m_Next;

        curr = curr->m_Next?curr->m_Next->m_Next:curr->m_Next;
    }

    TEMPLOYEE* original = src, *copy = src->m_Next;

    temp = copy;

    while (original && copy)
    {
        original->m_Next =
                original->m_Next? original->m_Next->m_Next : original->m_Next;

        copy->m_Next = copy->m_Next?copy->m_Next->m_Next:copy->m_Next;
        original = original->m_Next;
        copy = copy->m_Next;
    }

    return temp;
  }
编辑:

我找到了问题所在

TEMPLOYEE        * cloneList    ( TEMPLOYEE       * src ) {
    if(!src) return NULL;
    TEmployee * current = src;

    while(current){
        TEmployee * current_next = current->m_Next;
        current->m_Next  =  newEmployee(current->m_Name,current->m_Next);
        current->m_Next->m_Next = current_next;
        current = current_next;
    }
    current = src;

    TEmployee * clone_head  = current->m_Next;

    while(current){
        TEmployee * clone = current->m_Next;
        if(current->m_Bak){
            clone->m_Bak    = current->m_Bak->m_Next;
        }
        current = clone->m_Next;
    }

    current = src;

    while(current){
        TEmployee * clone  = current->m_Next;
        current->m_Next = clone->m_Next;
        if(clone->m_Next){
            clone->m_Next = clone->m_Next->m_Next;
        }
        current = current->m_Next;
    }
    return clone_head;

}

一个突出的问题是,在克隆列表时,克隆的是数据,而不是要存储数据的节点。这意味着您将覆盖现有列表,最终得到一个节点,该节点将自身作为
next
引用(循环链接)


因此,在克隆列表时,除了通过复制数据外,还需要分配新的
TEMPLOYEE
节点(到
temp
)。别忘了记住你分配给调用者的第一个字符(新的克隆列表的头)。

注意,行
temp->m_Name=new char[strlen(curr->m_Name)+1]表示您没有使用C;这是一个C++构造。我可以使用C++而不是STL库。一些调试思路:1。从应用程序获取堆栈跟踪(您可以在
gdb
中运行它,直到它崩溃并运行
bt
to)2。通过运行代码查看无效访问可能发生的位置3。使用
gdb
的函数检查在什么情况下看不到预期的行为。如果我没有弄错的话,请确保在某个地方,正确地实现三的规则将完全消除克隆函数的需要。如果这里的目标是克隆链接列表,那么它在这里做的事情就有了根本性的问题。典型的链表克隆操作是在单个
while
循环中完成的。我在这里看到三个
while
循环,每一个循环的目的似乎都有点可疑,而且似乎很可能,除了其他一切之外,它还像筛子一样泄漏内存。尤其是第一个循环的结果。你需要后退一步,为了弄清真相。