Это список с двойной связью , да?Что это значит?Убедитесь, что вы обновляете все соответствующие ссылки в правильном порядке.Кроме того, убедитесь, что все соответствующие узлы существуют.
Редактировать:
Давайте рассмотрим ваши утверждения по порядку.
Перед началом работы у вас естьprev
, свойство которого succ
указывает на узел-преемник.(Или так? Может ли быть исключение? Как бы вы справились с таким исключением, если оно существует?) prev.succ.pred
должно совпадать с prev
при условии, что prev.succ
указывает на узел-преемник.
Теперь, ваши первые два оператора устанавливают ins.pred
и ins.succ
.По сути, это правильная идея, но посмотрите мои вопросы выше.
Теперь вы установите prev.succ
на ins
.Сосредоточьтесь на этом утверждении.Есть ли информация, которую вы сейчас потеряли?Что именно точно делает следующее утверждение?Это то, что вы хотели?
Я думаю, это лучшее из того, что я могу сделать, не отдавая решения полностью.
Правка для задачи с бесконечным циклом:
Проблема, с которой вы столкнулись, заключается в разнице между передачей параметров по значению и передачей параметров по ссылке.Поскольку вы передаете по ссылке, вы передали ссылку на один и тот же объект (B) дважды.Это означает, что в итоге вы сделали следующее:
Первый вызов:
B.succ = first;
B.succ.pred = B; /* why not just first.pred = ins? */
first = B;
Теперь для первого установлено значение B. Итак, второй вызов с использованием B:
B.succ = B;
B.succ.pred = B; /* so, now B is its own pred and succ */
first = B; /* no change here */
Итак, теперь сначала B, first.succ - B, first.succ.succ - B и т. Д., Следовательно, бесконечный цикл.