我是编程的新手,我有这份工作,目标是使用这些功能先打印0123456789,然后再打印9876543210

bool List::SortSwap()
{
    bool doswap = true;
    ListElement *i =this-> head;
    ListElement *prev =this-> head;
    ListElement *b = i->next;

    while (doswap= true) {
        for (i; i != NULL; i = i->next) {
            if (i != this-> head) {
                prev->next = i;
            }
            if (i->value < b->value) {
                swap(prev, i, b);
                doswap = true;
            }
        }

        doswap= false;
    }

    return doswap;
}


void List::swap(ListElement * prev, ListElement * a, ListElement * b)
{
    prev->next = b;
    b->next = a;
}

因此,如果doswap为true,则它应该通过我的链表,并且如果它的值小于随后的值,则交换元素,当我运行该程序时,没有任何反应,我的列表不会打印到屏幕上

最佳答案

如果ba的后继者,而aprev的后继者,则必须将b替换为prev的后继者,然后将a替换为b的后继者,以交换ab:

void List::swap( ListElement * prev, ListElement * a, ListElement * b)
{
    a->next = b->next; // put successor of b in place of succesor of a
    b->next = a;       // put a in place of successor of b
    prev->next = b;    // put b in place of succesor of prev
}

要按顺序交换列表元素,必须先处理列表的前两个元素。因此,其余列表将逐步进行。如果到达最后一个列表元素的前任,则终止。
bool List::SortSwap()
{
    if ( head == nullptr || head->next == nullptr )
        return false;

    bool anySwapped = false;
    // hadle head of list and its successor
    if ( head->value < head->next->value )
    {
        ListElement *temp = head;
        head = head->next;       // successor of head becomes new head
        temp->next = head->next; // successor of old head becomes successor of new head
        head->next = temp;       // new head becomes succesor of old head
        anySwapped = true;
    }

    // continue until predecessor of tail is found
    ListElement *prev = head;
    while ( prev->next != nullptr && prev->next->next != nullptr )
    {
        ListElement *a = prev->next;
        ListElement *b = a->next;
        if ( a->value < b->value )
        {
            swap( prev, a, b );
            anySwapped = true;
        }
        prev = prev->next; // step one forward
    }

    return anySwapped;
}

注意(doswap= true)是一个赋值。循环while (doswap= true)是无限的。

08-24 18:09