在我正在处理的遗留程序中,链表有几个结构,如下所示:
typedef struct Unit_Cell
{
short Type ;
char Name[x] ;
short X ;
short Y ;
struct Unit_Cell *Next;
} Unit_Cell ;
typedef struct
{
Unit_Cell *Start;
Unit_Cell *Current;
} List_Cell;
我有一个指向包含所有单元格的List_Cell结构的指针。
List_Cell *FullList; # malloc'ed, with added elements etc etc
对于新的开发,我需要将此完整列表的一个子集与如下所示的新结构相关联:(简化(
typedef struct Unit_NewElement
{
char Name[y];
int Value;
List_Cell *ListCells;
struct Unit_NewElement *Next;
} Unit_NewElement;
typedef struct
{
Unit_NewElement *Start;
Unit_NewElement *Current;
} List_Cell;
创建新元素为:
Unit_NewElement *NewElement; # malloc'ed, with added elements etc etc ...
# EXCEPT LIST CELLS !
循环查看完整的单元格列表,我正在进行计算以了解当前单元格是否需要与我的元素结构相关联。
基本上,我们会做这样的事情:
# Keeping the last element
Unit_Cell *Temp = NewElement->ListCells->Current;
# Replacing last element
NewElement->ListCells->Current = FullList->Current;
# Setting temp element (which is now our previous), next pointer to the new current
Temp->Next = NewElement->ListCells->Current;
但这样做,我实际上是在破坏原始的"完整列表"列表。我不想要。
我需要能够为我需要的每个 NewElements 添加完整列表中的单元格,而不会影响完整列表本身。
memcpy是要走的路吗?
memcpy(Element->ListCells->Current, FullList->Current, sizeof(Unit_Cell));
如何处理复制的结构中还有一个指针的事实?
那么在没有memcpy的情况下直接复制数据呢:
*Element->ListCells->Current = *FullList->Current;
谢谢
我认为为了获得列表的真实副本,您需要做的是malloc
和memcpy
的组合,还必须覆盖复制的Next
指针。
由于我不知道您的子列表是如何创建的,因此我建议使用给定的起始单元格和要复制的单元格数量之类的内容 - 然后您可以这样做:
ListCell *copyList(UnitCell *from, int n)
{
int i = 0;
if (!from || n <= 0)
return NULL;
ListCell *newList = (ListCell*)malloc(sizeof(ListCell));
newList->Start = NULL;
newList->Current = NULL;
while (from && i++ < n)
{
if (!newList->Start)
{
newList->Start = (UnitCell*)malloc(sizeof(UnitCell));
memcpy(newList->Start, from, sizeof(UnitCell));
newList->Current = newList->Start;
}
else if (newList->Current)
{
newList->Current->Next = (UnitCell*)malloc(sizeof(UnitCell));
memcpy(newList->Current->Next, from, sizeof(UnitCell));
newList->Current = newList->Current->Next;
}
from = from->Next;
}
// Next-pointer of last cell still points to source list cell
if (newList->Current)
newList->Current->Next = NULL;
return newList;
}
(我实际上没有测试此代码,因此可能会留下一些错误(