这让我发疯。绝对疯狂。我的节点结构是这样的:
typedef struct s_num
{
int num;
struct s_num *prev;
struct s_num *next;
} t_num;
以下
swap
功能显然不起作用:
void swap(t_num **head)
{
t_num *first;
t_num *second;
t_num *last;
first = *head;
second = (*head)->next;
first->prev = second;
first->next = second->next;
second->next->prev = first;
second->next = first;
last = find_last_node(head);
last->next = second;
second->prev = last;
*head = last->next;
}
辅助函数
find_last_node(t_num **head)
编写如下:
t_num *find_last_node(t_num **head)
{
t_num *curr;
if (!*head)
return (NULL);
return ((*head)->prev);
}
我真的在试图解决这个问题时失去了理智。我知道这些类型的链表是如何工作的,但是为什么列表的其余部分总是丢失,这是没有意义的。我使用旋转功能,它基本上将头部向后/向前移动一个节点,并且它不会妨碍列表的打印。请帮我理解。
我尝试交换循环双向链表的头和第二个元素,但这实际上导致了其他节点丢失。
find_last_mode
返回 (*head)->prev
。在调用它的地方,*head
和first
相等,因此它返回first->prev
。 first->prev
是 second
。所以 last = find_last_node(head);
实际上是 last = second;
,接下来是 second->next = second;
和 second->prev = second
,这不是你想要的。您需要在更改 last
之前设置 first->prev
。