Я пишу программу, в которой мне нужно поменять местами два смежных узла в двусвязном списке, используя только указатели без обмена данными, и это не работает.
Я застрял на некоторое время. Я пытался скопировать некоторые решения, найденные в Интернете, но ничего не работает. Вот инкриминируемая функция (где b -> следующая):
t_chstat *swap_node(t_chstat **a, t_chstat **b)
{
(*a)->next = (*b)->next;
(*b)->prev = (*a)->prev;
(*a)->prev = (*b);
(*b)->next = (*a);
if ((*b)->prev != NULL)
(*b)->prev->next = (*b);
if ((*a)->next != NULL)
(*a)->next->prev = (*a);
return (*b);
}
Когда я попытался поместить printfs в каждую строку, чтобы попытаться выяснить, в чем может быть проблема, я понял, что первая инструкция изменяет значение (* b) и делает его (* b) -> следующим, хотя я чувствую, как это должно только изменить адрес, содержащийся в узле (* a). Я понятия не имею, почему он это делает и как это исправить.
Вот определение t_chstat:
typedef struct s_chstat
{
char *path;
struct s_chstat *next;
struct s_chstat *prev;
} t_chstat;