移动双链表中的项目范围? [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
其余的也一样
您可以遍历列表并将其分成五个(可能为空)子列表:
- 第一个范围之前的列表
- 第一个范围
- 在第一个范围之后和第二个范围之前列出
- 第二范围
- 第二个范围后的列表
在此拆分过程中,您可以检测重叠和给定范围的顺序。
整数类型状态变量有助于跟踪您在迭代期间附加到的子列表。
获得子列表后,您可以按所需顺序将它们合并在一起。最后,不要忘记维护您的列表开始和结束变量。
当您使用双链表时,您必须更改所有相关项的指针。
因此,如果只交换 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;
但是要交换节点范围,您必须使用类似的技术只交换每个范围的初始节点和终端节点。
我想问你一个建议。我必须创建一个函数,在双 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 其余的也一样
您可以遍历列表并将其分成五个(可能为空)子列表:
- 第一个范围之前的列表
- 第一个范围
- 在第一个范围之后和第二个范围之前列出
- 第二范围
- 第二个范围后的列表
在此拆分过程中,您可以检测重叠和给定范围的顺序。 整数类型状态变量有助于跟踪您在迭代期间附加到的子列表。
获得子列表后,您可以按所需顺序将它们合并在一起。最后,不要忘记维护您的列表开始和结束变量。
当您使用双链表时,您必须更改所有相关项的指针。
因此,如果只交换 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;
但是要交换节点范围,您必须使用类似的技术只交换每个范围的初始节点和终端节点。