复制然后排序链表

时间:2011-04-24 20:53:38

标签: c++ sorting linked-list

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

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流,参考参数和动态内存分配。

我的主要目标是创建一个指向现有节点的指针列表,然后对其进行排序,而不复制节点或干扰原始列表。

1 个答案:

答案 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但应该这样做)