C 是否移动双链接列表中的项目范围?[丙]

C 是否移动双链接列表中的项目范围?[丙],c,list,pointers,struct,C,List,Pointers,Struct,我想问你一个建议。我必须创建一个函数来交换双链表中两个项目范围的位置(不创建新节点) 比如: ‘B’,‘C’换成‘E’,‘F’ 因此: 我想做的是改变现状- 指针prec(上一个)的'B'=指针prec'E'和'C'=指针的指针succ

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

比如:

‘B’,‘C’换成‘E’,‘F’

因此:

我想做的是改变现状-

指针
prec
(上一个)的
'B'
=
指针
prec
'E'
'C'
=
指针
成功的指针
成功的
(下一个)

最后,指针
prec
=
指针
prec
succ
指针
=/code>指针
succ

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

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

有人能帮我创建一个类似的函数吗?我的头出现了分段错误: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
类似地,您可以遍历列表并将其拆分为五个子列表(可能为空):

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


    一旦有了子列表,就可以按所需顺序将它们连接在一起。最后,别忘了维护列表的开始和结束变量。

    在使用双链接列表时,必须更改所有相关项目的指针

    因此,仅交换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;
    

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

    绘制两个图形,一个在交换之前,一个在交换之后。突出显示需要更改的指针(有多少个?)。然后将图形带到终端并键入代码。之后:处理一些特殊情况(当一个或两个交换的段位于列表的末尾时),Als决定如果这些段接触或重叠,您希望发生什么。使用调试器和单步执行您的函数并检查变量的中间值。嗯,如果您没有显示任何代码,很难猜测错误在哪里。。。一个常见的问题是:如果在用
    指针prec'E'
    擦除之前没有保存'B'的
    指针prec(previous)的值,那么当您试图使用它设置
    指针prec'E'
    @SergeBallesta时,它将丢失。我已经用代码更新了OP。。你认为我在哪里犯了错误?说说我是什么,j和k,为什么k从来没有被使用过……谢谢你的回答,我在OP上画了一个草图,你能检查一下吗?谢谢
    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;
    }
    
    range1->prec=metaSup;
    metaSup->succ= range1;
    range1->succ=last;
    last->prec = range1;
    range2->prec=firstRange1;
    firstRange1->succ = range2;
    range2->succ=metaInf;
    metaInf->prec=range2;