繁体   English   中英

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

[英]C Copying a linked list with two pointers

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

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。

这是我的解决方案:

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

void *Malloc(size_t size)
{
    void *ptr = NULL;
    if ((ptr = malloc(size)) == NULL)
    {
        perror("alloc");
        exit(1);
    }

    return ptr;
}

TEMPLOYEE *cloneList(TEMPLOYEE *src)
{
    TEMPLOYEE *newList = (TEMPLOYEE *)Malloc(sizeof(TEMPLOYEE));
    newList->m_Bak = NULL;

    TEMPLOYEE *copy = newList;
    TEMPLOYEE *current = src;

    while (current != NULL)
    {
        newList->m_Name = strdup(current->m_Name);  // need free
        newList->m_Next = NULL;

        if (current = current->m_Next)
        {
            newList->m_Next = (TEMPLOYEE *)Malloc(sizeof(TEMPLOYEE));
            newList->m_Next->m_Bak = newList;
            newList = newList->m_Next;
        }
    }

    return copy;
}

希望我能正确理解您的问题...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM