Eh oui, il y a une mauvaise connexion ici. Dessinez des images!
Imaginer les choses ressembler à ceci, d'abord:
curr
|
v
+----------+ +----------+
| next | ----------------------> | next | --> ...
+----------+ +----------+
... <-- | prev | <---------------------- | prev | <-- ...
+----------+ +----------+
+----------+
| next |
+----------+
| prev |
+----------+
^
|
ins
Tout d'abord, vous exécutez cur->next = ins;
, qui fait cela:
curr
|
v
+----------+ +----------+
| next | -----------+ | next | --> ...
+----------+ | +----------+
... <-- | prev | <----------+----------- | prev | <-- ...
+----------+ v +----------+
+----------+
| next |
+----------+
| prev |
+----------+
^
|
ins
Notez que nous n'avons plus un pointeur sur l'élément qui était à l'origine après curr
- oups! Ce sera un problème plus tard.
Maintenant, nous faisons ins->prev = curr;
, qui ressemble à ceci:
curr
|
v
+----------+ +----------+
| next | -----------+ | next | --> ...
+----------+ | +----------+
... <-- | prev | <----------+----------- | prev | <-- ...
+----------+ v +----------+
^ +----------+
| | next |
| +----------+
+---------- | prev |
+----------+
^
|
ins
Maintenant, nous écrivons ins->next = curr->next;
. Mais oups! Notez que curr->next
points ins
, donc nous venons d'ajouter un cycle ici:
curr
|
v
+----------+ +----------+
| next | -----------+ | next | --> ...
+----------+ | +----------+
... <-- | prev | <----------+----------- | prev | <-- ...
+----------+ v +----------+
^ +----------+
| | next | --+
| +----------+ |
+---------- | prev | <-+
+----------+
^
|
ins
Et enfin, vous écrivez cur->next->prev = ins;
Mais oups!curr->next
est encore prev
, donc nous obtenons un autre cycle:
curr
|
v
+----------+ +----------+
| next | -----------+ | next | --> ...
+----------+ | +----------+
... <-- | prev | <----------+----------- | prev | <-- ...
+----------+ v +----------+
+----------+
+-> | next | --+
| +----------+ |
+-- | prev | <-+
+----------+
^
|
ins
Le problème ici est que vous perdez la trace de la cellule pointée par curr->next
après la première affectation, de sorte que vous perdez la possibilité de regarder au bon endroit.
Et si vous démarrez en écrivant quelque chose comme ça?
DList* next = curr->next;
puis utilisez next
au lieu de curr->next
dans certains de ces contextes?
Au moment où vous faites 'ins-> next = cur-> next', vous avez déjà défini' cur-> next = ins'. Donc, vous vous retrouvez avec 'ins-> next == ins' –
@IgorTandetnik étape-2-1 est réglé pour hook ins et cur-> nœud suivant, il y en a deux donc je pense que je dois accrocher avec les deux –
Eh bien, oui, c'est votre intention - mais vous avez perdu votre pointeur sur le noeud ** cur-> next' d'origine ** à ce moment-là. 'cur-> next' ne pointe plus vers le noeud original, mais vers' ins' à la place. –