如何在C

时间:2019-06-15 14:58:30

标签: c swap doubly-linked-list

我正在编写一个程序,其中我需要仅使用指针来交换双链表中的两个相邻节点,而无需交换数据,这是行不通的。

我被困了一段时间。我试图复制一些在互联网上找到的解决方案,但似乎没有任何效果。这是隐式函数(其中b是a-> next):

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)-> next,即使我感到就像它应该只更改(* a)节点中包含的地址。我不知道为什么要这么做以及如何解决。

这是t_chstat的定义:

typedef struct  s_chstat
{
    char            *path;
    struct  s_chstat    *next;
    struct  s_chstat    *prev;
}               t_chstat;

1 个答案:

答案 0 :(得分:0)

未经测试(可能我错过了一些东西

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;
}