我正在尝试使用一个指针p_previous
对链接列表进行冒泡排序。指针应该向前看一个节点并向前看两个节点,如果第一个大于第二个节点,则使用临时变量切换它们,而p_previous
保持在交换之外。 p_previous
还应检查两个节点以查看列表预告片是否存在,停止排序。老实说,当谈到泡泡排序时,我不知道我在做什么,链表实现没有帮助。
以下是一些代码:
int sort_list(ID_NUMBER *p_list, int list_count)
{
ID_NUMBER *p_previous = p_list; /* Previous node, use to swap next */
ID_NUMBER *p_temp; /* Temporary variable */
int count; /* Counts number of nodes passed */
for(count = 0; count < list_count; count++)
{
while(p_previous->p_next_student->p_next_student != NULL)
{
if(p_previous->p_next_student->student_id >
p_previous->p_next_student->p_next_student->student_id)
{
p_temp = p_previous->p_next_student->p_next_student;
p_previous->p_next_student = p_temp->p_next_student;
p_temp = p_previous->p_next_student;
p_previous->p_next_student = p_temp;
}
p_previous = p_previous->p_next_student;
}
}
return 0;
}
这就是我所知道的。
如果这是我输入的列表。
ħ - →1 - →3 - →2 - →4 - &GT;吨
1和3已按顺序排列,向下移动p_previous
。
3和2出现故障,将temp
变量指向2。
将3分指向数字4。
将2分指向数字3。
将1分指向数字2.
我认为我应该怎么做,我只是不知道如何将它放入代码中。
我非常确定while
循环里面的for
循环是必要的。
如果有人可以提供帮助,那就太棒了。
另外,如果您需要更多信息,请询问。
答案 0 :(得分:1)
这里有几个基本问题(比如你不能改变列表中的第一项),但最基本的是你的交换:
p_temp = p_previous->p_next_student->p_next_student;
p_previous->p_next_student = p_temp->p_next_student;
p_temp = p_previous->p_next_student;
p_previous->p_next_student = p_temp;
所以我们说我们有三个项目,我们称之为A B C.我们想要A C B.现在你开始做:
p_previous = A
p_temp = A->next->next = C
这是错误的方式。 我们将在C处指向A->。问题是,当我们这样做时,我们将失去B. p_temp应该存储B。
p_temp = A->next = B
p_previous->next= p_previous->next->next = C
p_temp->next= p_previous->next->next = {whatever came after}
p_previous->next->next= p_temp = B
然后你只需处理其他问题,例如当你的列表只有一个项目时崩溃。
您也可以这样做:
for(count = 0; count < list_count; count++)
{
p_previous = p_list;
这样你就可以通过列表冒泡值N次,而不只是一次。