gpt4 book ai didi

c - 如何在C中交换双向链表中的两个相邻项

转载 作者:行者123 更新时间:2023-11-30 19:26:46 25 4
gpt4 key购买 nike

我正在编写一个程序,其中我需要仅使用指针而不交换数据来交换双向链表中的两个相邻节点,但它不起作用。

我已经被困了一段时间了。我尝试复制在互联网上找到的一些解决方案,但似乎没有任何效果。这是被牵连的函数(其中 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;

最佳答案

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

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

关于c - 如何在C中交换双向链表中的两个相邻项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56611485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com