排序链接列表 - 移动节点或交换数据成员?

时间:2016-05-27 05:21:23

标签: c++ linked-list

我有一个简单的问题。我正在开发一个C ++应用程序,它是一个联系人列表应用程序。它存储多人的姓名,地址,号码,年龄等。我正在使用stucts和链表(节点)。我正在构建排序列表功能,以按字母顺序排列列表。我现在想知道通过移动整个结构或通过交换每个节点内的数据成员来实际重新排序列表是否更好。起初,我考虑过移动节点,但现在交换数据成员似乎更安全,因为我不必重新排序列表。无论如何,我不知道其中任何一方是否拥有任何好处。

编辑:这是我正在处理的源代码。请注意,排序功能不完整。此外,我仍然是一名新手程序员,因此从专业角度来看,编码可能会有很多问题。除此之外,我还没有接近完成它。我只是在编程课程的暑假期间编写它来练习编码。

[url]

/*.html = authc

5 个答案:

答案 0 :(得分:2)

首先 - 您正在重新排序这两种情况下的列表。

第二 - 交换两个节点通常需要五个操作:

  1. 将节点从第一个节点更改为指向第二个节点。
  2. 从第二个节点返回节点一,指向第一个节点。
  3. 将第一个节点的next指针存储在临时指针中。
  4. 将第一个节点的next指针更改为第二个节点的next指针。
  5. 将第二个节点的next指针更改为临时指针。
  6. 交换两个变量至少需要三次操作:

    1. 将第一个变量存储在临时变量中。
    2. 将第一个变量更改为第二个变量。
    3. 将第二个变量更改为第一个变量。
    4. 但现在将其乘以结构成员的数量。

      结构应该至少有2个数据成员 - 一个指针和一个有效负载 - 所以你要看的是至少6个操作。对于结构中的每个成员,这将增加3。所以你最好只是交换节点。

答案 1 :(得分:1)

没有记忆应该移动。链表中的节点不是在内存中排序,而是仅通过指向列表中下一个/上一个节点的指针相互关联。只需几个指针分配即可完成操作。

答案 2 :(得分:1)

交换数据更加昂贵和复杂。例如,要交换数据,您需要交换名称,地址,数字,年龄等。

另一方面,交换节点意味着只需交换列表中的两个内存位置地址。因此,交换节点是非常可取的。

其次,如果您向节点添加更多元数据字段,则无需更改排序代码以交换新添加的数据字段。

答案 3 :(得分:1)

如果节点数据大小较大,那么最好交换节点的位置而不是交换节点的数据(交换数据将是错误的选择)。

选择移动指针实现而不是交换数据的原因:

  1. 假设您想在一段时间后在联系人列表中添加新字段。如果您交换数据,则每次更改联系人列表字段时都必须更改代码。

  2. 随着联系人列表中的字段数增加,交换数据的开销将增加。

答案 4 :(得分:1)

因此,您有一个要排序的链接列表。要正确有效地执行此操作,您必须使用正确的排序算法,在本例中为合并排序。当然,您不应该交换节点的数据。

点击此链接:http://www.geeksforgeeks.org/merge-sort-for-linked-list/