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;