【问题标题】:Copying and then sorting a linked list复制然后排序链表
【发布时间】:2011-04-24 20:53:38
【问题描述】:

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

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++ 或 Java(或 C,来吧)编写你自己的链表类?
  • @unapersson:这是一个作业
  • @VanDarg 然后将其标记为“作业”。恕我直言,这仍然是浪费时间,而且您仍然需要说明您使用的是哪种语言(C 或 C++)。
  • 你想制作一个指向节点的指针列表,然后对其进行排序,而不复制节点或干扰原始列表,是吗?

标签: c++ sorting linked-list


【解决方案1】:

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 语言了,但应该可以)

【讨论】:

  • 是的,我使用的是 c++ 编译器。有没有办法制作一个仅引用现有节点的列表?
  • @VanDarg:那为什么要标记问题c
  • @VanDarg : 关键是 c 标签不合适,因为代码无效 C. 选择一种语言。
  • @Brian Roach:谢谢,有问题我会回帖
  • 这个解决方案在C。然而您已将问题标记为C++
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
  • 2021-09-13
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
相关资源
最近更新 更多