冒泡用一个指针排序链表

时间:2013-12-05 17:46:49

标签: c sorting pointers linked-list

我正在尝试使用一个指针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循环是必要的。

如果有人可以提供帮助,那就太棒了。

另外,如果您需要更多信息,请询问。

1 个答案:

答案 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次,而不只是一次。