Как поменять местами два смежных элемента в двусвязном списке в C - PullRequest
0 голосов
/ 15 июня 2019

Я пишу программу, в которой мне нужно поменять местами два смежных узла в двусвязном списке, используя только указатели без обмена данными, и это не работает.

Я застрял на некоторое время. Я пытался скопировать некоторые решения, найденные в Интернете, но ничего не работает. Вот инкриминируемая функция (где 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;

1 Ответ

0 голосов
/ 15 июня 2019

Не проверено (возможно, я что-то пропустил

typedef struct str_t 
{
    struct str_t *prev;
    struct str_t *next;
}str_t;

void swap(str_t *a, str_t *b)
{
    str_t *saved_prev = a -> prev;
    str_t *saved_next = a -> next;

    a -> next = b -> next;
    a -> prev = b -> prev;

    if(b -> next) (b -> next) -> prev = a;
    if(b -> prev) (b -> prev) -> next = a;

    if(saved_prev) saved_prev -> next = b;
    if(saved_next) saved_next -> prev = b;

    b -> prev = saved_prev;
    b -> next = saved_next;
}
...