我正在编写一个程序,其中我需要仅使用指针来交换双链表中的两个相邻节点,而无需交换数据,这是行不通的。
我被困了一段时间。我试图复制一些在互联网上找到的解决方案,但似乎没有任何效果。这是隐式函数(其中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;
答案 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;
}