我有一个节点链表,每个节点定义为:
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流、引用参数和动态内存分配。
我在这里的主要目标是创建一个指向现有节点的指针列表,然后在不复制节点或干扰原始列表的情况下对其进行排序。
在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一段时间,但应该这样做)