Ошибка сортировки при вставке двойного списка - PullRequest
2 голосов
/ 28 апреля 2010

Я реализовал сортировку вставок в списке двойных ссылок (от высшего к низшему) из файла с разрешением 10000 дюймов и вывод в файл в обратном порядке.

Насколько мне известно, я реализовал такую ​​программу, однако заметил, что в выходном файле одно число неуместно. Все остальные номера в правильном порядке.

Число не на месте является повторяющимся числом, но остальные повторения этого номера расположены в правильном порядке. Просто странно, как этот номер неправильно расположен. Также несортированный номер только в 6 местах не синхронизирован.

Я уже несколько дней просматривал свою программу, не зная, в чем проблема, поэтому я обращаюсь к вам за помощью.

Ниже указан код,

(примечание: может ли мой вопрос быть удален самостоятельно? Скорее, мои коллеги не считают мой код, если нет, то как его можно удалить?)

    void DLLIntStorage::insertBefore(int inValue, node *nodeB)
{
    node *newNode;
    newNode = new node();
    newNode->prev = nodeB->prev;
    newNode->next = nodeB;
    newNode->value = inValue;

    if(nodeB->prev==NULL)
    {
        this->front = newNode;
    }
    else
    {
        nodeB->prev->next = newNode;
    }
    nodeB->prev = newNode;
}
void DLLIntStorage::insertAfter(int inValue, node *nodeB)
{
    node *newNode;
    newNode = new node();
    newNode->next = nodeB->next;
    newNode->prev = nodeB;
    newNode->value = inValue;

    if(nodeB->next == NULL)
    {
        this->back = newNode;
    }
    else
    {
        nodeB->next->prev = newNode;
    }   
    nodeB->next = newNode;
}
void DLLIntStorage::insertFront(int inValue)
{   
    node *newNode;
    if(this->front == NULL)
    {
        newNode = new node();
        this->front = newNode;
        this->back = newNode;
        newNode->prev = NULL;
        newNode->next = NULL;
        newNode->value = inValue;
    }
    else
    {
        insertBefore(inValue, this->front);
    }

}   
void DLLIntStorage::insertBack(int inValue)
{   
    if(this->back == NULL)
    {
        insertFront(inValue);
    }
    else
    {
        insertAfter(inValue, this->back);
    }
}

ifstream& operator>> (ifstream &in, DLLIntStorage &obj)
{   
    int readInt, counter = 0;               

    while(!in.eof())
    {
        if(counter==dataLength) //stops at 10,000
        {
            break;
        }   

        in >> readInt;

        if(obj.front != NULL )
        {   
            obj.insertion(readInt);         
        }
        else
        {
            obj.insertBack(readInt);
        }
        counter++;
    }       
    return in;
}
void DLLIntStorage::insertion(int inValue)
{
    node* temp;
    temp = this->front;

    if(temp->value >= inValue)
    {
        insertFront(inValue);
        return;
    }
    else
    {       
        while(temp->next!=NULL && temp!=this->back)
        {
            if(temp->value >= inValue)
            {
                insertBefore(inValue, temp);
                return;
            }
            temp = temp->next;
        }
    }

    if(temp == this->back)
    {
        insertBack(inValue);
    }
}

Спасибо, что уделили время.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2010

Мне не нравится эта часть

else
{       
    while(temp->next!=NULL && temp!=this->back)
    {
        if(temp->value >= inValue)
        {
            insertBefore(inValue, temp);
            return;
        }
        temp = temp->next;
    }
}

if(temp == this->back)
{
    insertBack(inValue);
}

Представьте, что произойдет, если inValue больше всех значений, кроме this-> back-> value. Вместо этого он вставляется в конец перед этим -> назад. Кстати, вы вставляете равные целые числа в обратном порядке, они читаются. Для целых чисел это не имеет большого значения, но может, если Вы вставите другие объекты. Я бы изменил код метода вставки так:

node* temp;
temp = this->front;
while(temp!=NULL)
{
    if(temp->value > inValue)
    {
        insertBefore(inValue, temp);
        return;
    }
    temp = temp->next;
}
insertBack(inValue);
0 голосов
/ 28 апреля 2010

Просто несколько замечаний.

while(!in.eof())

Это не остановит внутреннюю часть цикла от появления ошибки EOF. Вы хотите

while ( in >> readInt )

Кроме того,

if(this->front == NULL)

и

void DLLIntStorage::insertion(int inValue)
{
    node* temp;
    temp = this->front;

    if(temp->value >= inValue)

не смешивать. Либо передняя часть может быть NULL, либо нет. Кроме того, вам нужно решить, использовать ли temp->next!=NULL или temp!=this->back, но не оба, в качестве условия завершения цикла.


Я полагаю, что из-за некоторого несоответствия между несколькими соглашениями о связывании ошибочное значение оказывается в середине списка.

...