在链接列表中交换值

时间:2018-07-14 11:29:17

标签: c++ sorting linked-list

我想在链表中排序,在不改变地址的情况下更改节点之间的值,当我放置交换条件时,我无法在其中放置任何代码。我尝试插入printf并更改值(在swap旁边),并导致错误。

我想知道我的代码中哪一部分是错误的,以及如何在不对结构进行太多更改的情况下解决此问题,该代码是根据我学到的东西进行实验的,谢谢高级人员

    #include <stdio.h>
    #include <stdlib.h>

    typedef struct Nodes
    {
        int value;
        Nodes* next,*prev;
        Nodes(int val)
        {
            value = val;
            next = prev = NULL;
        }
    }Nodes;
    Nodes *head,*tail,*curr;

    void display()
    {
        curr = head;
        while(curr)
        {
            printf("%d ",curr->value);
            curr=curr->next;
        }
    }

    void swap(Nodes *a,Nodes *b)
    {
        int temp = a->value;
        a->value = b->value;
        b->value = temp;
    }
    void sort()
    {
        curr = head;
        while(curr)
        {
            Nodes *next = curr->next;
            if(curr->value > next->value && next != NULL)
            {
    //          this space cant code anything or it will break
    //          swap(curr,next);
            }
            curr = next;
        }
    }

    void insert(int val)
    {
        if(!head)
        {
            head = tail = new Nodes(val);
        }
        else
        {
            curr = new Nodes(val);
            tail->next = curr;
            curr->prev = tail;
            tail = curr;
        }
    }

    int main()
    {
        insert(8);
        insert(3);
        insert(20);
        display();
        puts("");
        sort();
        display();
        return 0;
    }

1 个答案:

答案 0 :(得分:0)

if(curr->value > next->value && next != NULL)
//                              ^^^^^^^^^^^^   too late!

a && b首先检查a,并且仅在a为true时才对b求值–因此,只有在已经拥有next是nullptr的值进行评估访问了*next(如果可能的话,如果next nullptr,程序可能已经崩溃了)。因此,反过来检查:

if(next && curr->value > next->value)

然后您的排序算法不完整,看起来很像冒泡排序,但是只有一个“冒泡”出现...