【问题标题】:Double Linked List Insertion Sorting Bug双链表插入排序错误
【发布时间】:2010-04-28 00:44:18
【问题描述】:

我在一个包含 10,000 个整数的文件的双链接列表(从最高到最低)中实现了插入排序,并以相反的顺序输出到文件。

据我所知,我已经实现了这样一个程序,但是我注意到在输出文件中,一个数字不合适。其他所有数字都按正确顺序排列。

错位的数字是重复的数字,但该数字的其他重复顺序正确。奇怪的是这个数字是如何被错误地放置的。此外,未排序的数字只有 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);
    }
}

感谢您的宝贵时间。

【问题讨论】:

  • 您不能删除您的问题。完全常用的数据结构并不经常被盗。
  • 好的,谢谢,我想我对我的代码相当防御。
  • 为什么不用标准模板库,很好用。
  • 如果您希望人们为您调试代码,请发布可编译的内容以及演示所需的任何输入数据。您发布的代码无法编译。 DLLIntStorage 未定义。
  • 我认为从我发布的代码中足以让您了解发生了什么以及它在哪里出错了。正如我所说,数据输入是 10,000 个整数,只有一个节点不合适。

标签: c++ linked-list insertion-sort


【解决方案1】:

我不喜欢这部分

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 之外的所有值会发生什么。它被插入到最后而不是 this->back 之前。顺便说一句,您正在以相反的顺序插入相等的整数,它们被读取。对于整数来说,这并不重要,但如果你插入了其他对象,它就可以了。我会将插入方法的代码更改为:

node* temp;
temp = this->front;
while(temp!=NULL)
{
    if(temp->value > inValue)
    {
        insertBefore(inValue, temp);
        return;
    }
    temp = temp->next;
}
insertBack(inValue);

【讨论】:

  • 干杯,我现在明白问题的原因了。
【解决方案2】:

只是一些评论。

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,但不能同时使用两者作为循环终止条件。


我的猜测是多个链接约定之间的一些不一致导致错误的值被推到列表的中间。

【讨论】:

  • 感谢您提供有关稍微改进代码的提示,您的观点围绕着循环终止,我将对其进行研究。我不确定哪些多个链接约定可能导致单个问题。谢谢。
猜你喜欢
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
  • 2018-05-15
相关资源
最近更新 更多