我有一个节点链表,每个节点定义为:
struct Node {
char name[14];
int counts[130];
char gender;
Node *nextPtr;
};
我正在使用以下代码复制此链接列表:
// Create a copy of the current list
Node *tempPtr;
while (headPtr != NULL) {
tempPtr = new Node;
tempPtr = headPtr;
// Advance the list
headPtr = headPtr->nextPtr;
} // End while loop
我需要复制列表以便我可以对其进行排序,我不想对原始列表进行排序。排序将根据counts []数组的某个位置的值降序。我想知道是否有人可以告诉我,我是否正确地复制了清单?如果我能够了解如何进行排序并对此列表进行排序。我已经用Java写了这个没有问题的,我为知道太少的c编程语言而道歉。任何输入将不胜感激。谢谢。
道歉,我要用c ++编程语言写这个。但是,我不允许使用C ++类。我只能使用C ++ I / O流,参考参数和动态内存分配。
我的主要目标是创建一个指向现有节点的指针列表,然后对其进行排序,而不复制节点或干扰原始列表。
答案 0 :(得分:3)
C中没有new
这样的东西。你使用的是c ++编译器吗?
忽略这一点,问题是你没有复制任何内容,实际上是在创建内存泄漏:
tempPtr = new Node;
tempPtr = headPtr;
您在堆上创建一个新节点,将指针指定给tempPtr
...然后将tempPtr
重新分配给headPtr
。你刚丢失了新分配的Node
(内存泄漏)。
要制作列表的副本,您需要遍历现有列表,将数据复制到要添加到新列表的新节点中。
Node *oldNode = headPtr;
Node *newHead = malloc(sizeof(struct Node));
Node *tail = newHead;
while(oldNode != NULL)
{
memcpy(tail, oldNode, sizeof(struct Node));
oldNode = oldNode->nextPtr;
if (oldNode != NULL)
{
tail->nextPtr = malloc(sizeof(struct Node));
tail = tail->nextPtr;
}
}
(未经测试,我暂时没有做过C但应该这样做)