复制链表,然后对其排序

Copying and then sorting a linked list

本文关键字:排序 然后 链表 复制      更新时间:2023-10-16

我有一个节点链表,每个节点定义为:

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一段时间,但应该这样做)

相关文章: