为什么链表中的排序功能(通过交换数据进行排序)不起作用

时间:2018-08-07 15:36:08

标签: c++ sorting

当我运行此函数时,它不返回任何数字就返回所有数字?当我使用for循环时,它工作得很好吗?有人可以告诉我我要去哪里了吗?

struct node //structure node 
{
    int info;
    struct node *link;
};

void sort(struct node *start)       //function for sorting
{
    struct node *p,*temp;
    int r;
    p = start;
    temp = p->link;
    while(p != NULL)      //first loop
    {
        while(temp != NULL)    //second loop
        {
            if(temp->info < p->info)
            {
                r=p->info;
                p->info = temp->info;
                temp->info = r;
            }
            temp = temp->link;
        }
        p = p->link;
    }
}

2 个答案:

答案 0 :(得分:4)

在外部while循环的第一次迭代之后,temp将是NULL。但是,temp不在内部while循环中设置,因此它将保持NULL。仅当start->info不是最小的数字时,数字才会改变。

将分配temp = p->link 移到外部while循环中:

void sort(struct node *start)
{
    struct node *p,*temp;
    int r;
    p = start;
    while(p != NULL)
    {
        temp = p->link;        // <-------
        while(temp != NULL)
        {
            if(temp->info < p->info)
            {
                r=p->info;
                p->info = temp->info;
                temp->info = r;
            }
            temp = temp->link;
        }
        p = p->link;
    }
}

答案 1 :(得分:2)

在代码中,您正在内部循环中移动temp指针,直到它到达NULL,但在外部循环中您并未将其设置回temp = p->link;

请在

之后添加temp = p->link;
while(p != NULL)      //first loop
    {

更新后的功能应如下所示:

void sort(struct node *start)
{
    struct node *p,*temp;
    int r;
    p = start;
    while(p != NULL)
    {
        temp = p->link;
        while(temp != NULL)
        {
            if(temp->info < p->info)
            {
                r=p->info;
                p->info = temp->info;
                temp->info = r;
            }
            temp = temp->link;
        }
        p = p->link;
    }
}