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

Move range of items in a double linked list? [C]

我想问你一个建议。我必须创建一个函数,在双 linked list.

中交换两个项目范围(不创建新节点)的位置

喜欢:

ABCDEFG

'B','C' 换成 'E','F'

所以:

AEFDBCG

我想做的是改变 -

'B'的指针prec(上一个)=指针prec'E'succ的指针(下一个) 21=] = 'F' 的指针 succ

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

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

另一种方法是创建一个函数,该函数接受单个项目并将节点移动到所需位置。

有人可以帮我创建一个做类似事情的函数吗?我的脑袋出现分段错误:P

结构是这样的:

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

更新:

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

nodo *ScambiaSottoliste(nodo *lista,int i,int j){ //I first position, J second position

    nodo *firstRange1, *range1, *metaInf, *metaSup, *range2, *last;

    range1=RicercaPosizione(lista, i); //Reserch position I
    firstRange1=range1->prec;
    metaInf=range1->succ;
    range2=RicercaPosizione(lista, j); //research position J
    metaSup=range2->prec;
    last=range2->succ;

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

return lista;
}

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

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

  1. 第一个范围之前的列表
  2. 第一个范围
  3. 在第一个范围之后和第二个范围之前列出
  4. 第二范围
  5. 第二个范围后的列表

在此拆分过程中,您可以检测重叠和给定范围的顺序。 整数类型状态变量有助于跟踪您在迭代期间附加到的子列表。

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

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

因此,如果只交换 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;

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