移动双链表中的项目范围? [C]

时间:2015-02-06 13:34:26

标签: c list pointers struct

我想问你一个建议。我必须创建一个函数,在双linked list中交换两个项目范围的位置(不创建新节点)。

像:

ABCDEFG

' B',' C'换到' E' F'

这样:

AEFDBCG

我想要做的是改变 -

prec 'B'指针= prec的指针'E'(上一个)和succ的指针'C'(下一个) =的{​​{1}}指针succ

最后指针'F' prec 'E'指针= prec'B'指针succ 'F'指针= succ

我试图应用我所说的但我认为我在代码上犯了很多错误。

另一种方法是创建一个获取单个项目并将节点移动到所需位置的函数。

有人可以帮助我创建一个类似的功能吗?我的头脑正在进行分段错误:P

结构是这样的:

'C'

更新

根据Axel的建议,我做了类似的事情。现在我只是交换一个项目,之后我将迭代这个函数。 我无法使调试器工作,但我正在努力解决问题。

struct nodo {
char info;
struct nodo *succ;
struct nodo *prec;
};
typedef struct nodo nodo;

3 个答案:

答案 0 :(得分:1)

您可以遍历列表并将其拆分为五个(可能为空)子列表:

  1. 在第一个范围之前列出
  2. 第一个范围
  3. 在第一个范围之后和第二个范围之前列出
  4. 第二范围
  5. 第二个范围后的列表
  6. 在此拆分过程中,您可以检测重叠和给定范围的顺序。 整数类型状态变量有助于跟踪迭代期间要附加的子列表。

    获得子列表后,您可以按所需顺序将它们连接在一起。最后,不要忘记维护列表的开始和结束变量。

答案 1 :(得分:1)

当您使用双链表时,您必须更改所涉及的所有项目的指针。

因此,只需交换2个项目(提供的代码)即可:

range1->prec=metaSup;
metaSup->succ= range1;
range1->succ=last;
last->prec = range1;
range2->prec=firstRange1;
firstRange1->succ = range2;
range2->succ=metaInf;
metaInf->prec=range2;

但要交换到节点范围,您只能使用类似的技术交换每个范围的初始节点和终端节点。

答案 2 :(得分:0)

让我们假设我们想要将a& b之间的一组元素与d& e之间的元素交换 现在, 设置d&的右指针的右指针。将b的左指针设置为等于e的左指针。反之亦然 将组2的右指针设置为最后一个元素指向b 同样,其余的