我正在尝试使用冒泡排序交换单链表的两个指针。
我已经做了比较功能,并且它的工作正常。
在swap函数中,交换工作正常,我设法在节点和node->next
之间交换,虽然链表“丢失”节点的信息(交换后),所以第一个节点在链接列表中是node->next
。
我正在使用一个通用函数来执行冒泡排序并调用compare函数和交换函数。
知道为什么会这样吗?
void swap_arr(void **arr,int i , int j)
{
Team *teamList = (Team*) arr ;
Team *teamI = (Team*) arr , *teamJ ;
Team *temp ;
Team *temp1;
int z;
// Receives instead i
for(z=0; z<i; z++)
teamI = teamI->next;
//teamJ is the i+1
teamJ = teamI->next;
temp = teamI;
temp1 = teamJ->next;
teamI = teamJ ;
teamJ = temp;
if (temp1->next->next==NULL)
teamJ->next = NULL;
else
teamJ->next = temp1->next;
teamI->next = teamJ;
if (temp1==NULL)
teamJ->next=NULL;
else
teamJ->next = temp1;
}
答案 0 :(得分:3)
对于交换两个节点(a,b),您需要访问指向第一个节点的“外部”节点(o)。 (并且在a和b之后还有一个节点p。(p也可以是NULL,但这并不重要)
旧情况:
o->next == a
a->next == b
b->next == p
新情况:
o->next == b
b->next == a
a->next == p
如果实际上 节点,则只能执行。 (因此:有一个o->下一个指针),所以你需要特殊的代码来处理a是链头的情况。
但是没有:o-&gt; next只是一个“struct llist *”,因此可以使用任何指向llist的指针。在大多数情况下,最简单的解决方案是为交换函数使用指针指针参数;指向指针的指针既可以指向链的头部,也可以指向某个节点的 - >下一个指针。
答案 1 :(得分:0)
我还尝试使用冒泡排序实现链表的排序,尽管您可以在代码中进行修改而不是编写交换功能,您只需在代码中交换它们,并且每次需要时都需要指向相邻节点的3个不同指针。您可以找到已实施的代码here。