这是一个学校项目,我需要完成一个功能来复制如下所示的员工链接列表
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/