2010-12-09 104 views
4

我正在创建可添加,查看和编辑学生信息的学生列表(链接列表)。我有两个字段,分别是学生名字和学生成绩,并且我在列表中添加新学生,并按照学生的成绩降序排列。编辑链接列表中的节点

我已完成添加和查看部分。问题在于编辑部分,因为我需要编辑信息,然后我需要再次对它进行排序,以便它将位于列表的正确位置。

例如,我必须按照他们的成绩排列3的学生信息:

student1 90 -> student2 85 -> student3 80 -> NULL 

然后我需要编辑STUDENT2的成绩,以75所以编辑链表现在应该安排如下:

student1 90 -> student3 80 -> student2 75 -> NULL 

我该怎么做?你不需要给我任何代码。我只想提供一些关于如何实现我的程序的编辑部分的建议。我正在考虑创建一个新节点(使用编辑后的信息),删除旧节点并将编辑后的节点插入到列表中。我的逻辑正确吗?还是有更好的方法来解决我的问题。

+0

[设置定时器计数如何@newbieatc上岗前长过类似的问题] – 2010-12-09 14:26:06

+0

@paul她今天不在线... :) – newbie 2010-12-09 14:32:52

回答

2

基本上你的想法是正确的,但我不会创建一个新的节点。我会做的将是:

  1. 确定值是否增加或减少(和更新节点)。
  2. 从列表中取消链接节点。
  3. 向前或向后搜索(取决于等级的增加或减少)以获得正确的位置。
  4. 将节点链接到新位置。

请注意,将列表索引到数组等等可能会比直线遍历更快地进行搜索。如果你已经有了这样的机制,当找到重新插入节点的位置时,使用它可能会更快。

+0

这也是正确的,但这意味着他可以编辑链接列表节点,但是他必须强制另一个完整的O(N)检查。如果他在第2步之后做了你所说的,并且之后立即编辑了一个节点(“自动”而不必调用一个额外的函数),那将会更好。这是我从你的描述中了解到的,否则请澄清。 +1 – Muggen 2010-12-09 14:26:04

3

您可以通过

  • 删除目标节点
  • 编辑目标节点数据
  • 使用现有的逻辑插入节点重新插入节点完成自己的目标。
+0

谢谢... :) – newbie 2010-12-09 14:37:48

1

你可以做一个编辑指定节点的函数。扫描列表直到找到该节点,然后直接编辑它。当然你会使用一个指针。对于排序的一部分,说你有n个节点,每个节点i与节点进行比较后,并交换它们,如果你是比较一个较大:

for every node n1 in list 
    for every remaining node n2 in list 
     if n2->grade > n1->grade 
      swap 'em 

可以交换它们复制他们的记忆,所以你将不需要改变任何指针。

+1

是的..但是我需要排列按照等级划分它... – newbie 2010-12-09 14:23:38

3

单链表?

找到您要编辑的节点,并保留指向前一节点的指针或编写例程以检索前一节点。

从链接的列表中删除您的节点(通过设置previous_node->旁边thisOne->下一个)

完成相应的修改。 。

插入在列表中的合适的位置的新的节点(通过遍历列表unti下一节点是小于已编辑的值

拼接编辑成列表(editedNode->下一= nextNode;电流 - >未来= editedNode)

随着双向链表,你可以只用“其他” /返回/向上链接,找到以前的节点