C 复制带有两个指针的链表

标签 c pointers linked-list char assert

这是一个学校项目,我需要完成一个功能来复制如下所示的员工链接列表

typedef struct TEmployee
{
    struct TEmployee * m_Next;
    struct TEmployee * m_Bak;
    char * m_Name;
} TEMPLOYEE;

这是我的复制功能

TEMPLOYEE * cloneList(TEMPLOYEE * src)
{
    TEMPLOYEE* current = src;
    TEMPLOYEE* newList = NULL;
    TEMPLOYEE* tail = NULL;

    while(current != NULL)
    {
        if(newList==NULL)
        {
            newList = (TEMPLOYEE*)malloc(sizeof(TEMPLOYEE));
            newList -> m_Name = current -> m_Name;
            newList -> m_Next = NULL;
            newList -> m_Bak = NULL;
            tail = newList;
        }
        else
        {
            tail -> m_Next = (TEMPLOYEE*)malloc(sizeof(TEMPLOYEE));
            tail = tail -> m_Next;
            tail -> m_Name = current -> m_Name;
            tail -> m_Next = NULL;
            tail -> m_Bak = current -> m_Bak;
        }
        current = current -> m_Next;
    }

    return newList;
}

这工作正常,但它没有正确复制 m_Bak,因此当我尝试此断言时,m_Next 和 m_Bak 应该相同,但事实并非如此

assert ( b && ! strcmp ( b -> m_Name, "Maria" ) && b -> m_Bak == b -> m_Next );

感谢任何帮助。

最佳答案

这一行

tail -> m_Bak = current -> m_Bak;

是错误的,因为它使新列表指向当前列表。

你更需要:

    else
    {
        tail -> m_Next = (TEMPLOYEE*)malloc(sizeof(TEMPLOYEE));
        tail -> m_Next -> m_Bak = tail;  // New line
        tail = tail -> m_Next;
        tail -> m_Name = current -> m_Name;
        tail -> m_Next = NULL;
        // tail -> m_Bak = current -> m_Bak; Delete this line
    }

请注意,您的代码不会复制名称,因此两个列表将指向相同的名称对象。如果您想复制名称的真实副本,请查看 strdup

另请注意:

您不需要转换 malloc 返回的值。但是,您应该检查 malloc 是否返回 NULL

关于C 复制带有两个指针的链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53977592/

相关文章:

c - 使用 dlmalloc 的段错误

在链表中创建和添加数据

c - C 中的 Strlen 指针

c - 如何在c中从char*访问char[]?

c - 解除分配链表

Java/安卓 : LinkedList race condition

c - 如何指向一个指针的指针

c - 使用 C 访问 Berkeley DB 结构内的值

c - mcisendstring 返回空字符串

c - 为什么显示 "Invalid type conversion"?