c - C复制带有两个指针的链表
问题描述
这是一个学校项目,我需要完成一个函数来复制一个看起来像这样的员工链接列表
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
推荐阅读
- spring - 用于不同 oauth 客户端的多个 Springfox SecurityConfigurations
- c# - WPF Datagrid 列在编辑期间未更新
- python - 来自多个输入文件的多线 seaborn 图
- java - 使用 java 8 流创建二维列表
- python - 使用 post 请求在 django 中更新和保存 dict
- javascript - 数组在 C 中的行为很奇怪?
- mongodb - 如何获取 mongodb 中的嵌套对象值?
- android - Android Retrofit + Rxjava flowable 过早完成
- c - 如何使用没有循环的模式更新 C 中的数组,使用模式的 memcpy
- informatica - 无法启动 Informatica 服务器