C++ 插入已排序的双链接列表c++;

C++ 插入已排序的双链接列表c++;,c++,doubly-linked-list,C++,Doubly Linked List,尝试修复我的双链表代码,以便在插入时排序,任何想法。这是我的。它插入到列表中,只是未排序。我已经为此挣扎了一段时间了。非常感谢 template <typename T> bool DoublyLinkedList<T>::insert(T data) { int i = 0; Node<T> *tmp, *newNode; bool check = false; newNode = new Node<T>(data

尝试修复我的双链表代码,以便在插入时排序,任何想法。这是我的。它插入到列表中,只是未排序。我已经为此挣扎了一段时间了。非常感谢

template <typename T>
bool DoublyLinkedList<T>::insert(T data)
{
    int i = 0;
    Node<T> *tmp, *newNode;
    bool check = false;
    newNode = new Node<T>(data);
    tmp = mHead;

    if (newNode == NULL)
        return false;

    if (mHead == NULL)
    {
        mHead = newNode;
        mTail = newNode;
        mCount++;
        return true;
    }

    while (tmp != NULL)
    {
        if (tmp->mNext == NULL)
        {
            if (tmp->mData <= data)
            {
                newNode->mPrevious = tmp;
                tmp->mNext = newNode;
                mTail = newNode;
            }
            else
            {
                newNode->mNext = tmp;
                tmp->mPrevious = newNode;
                mHead = newNode;
            }
        }
        else if (tmp->mNext->mData >= data)
        {
            newNode->mPrevious = tmp;
            newNode->mNext = tmp->mNext;
            tmp->mNext->mPrevious = newNode;
            tmp->mNext = newNode;
            break;
        }

        tmp = tmp->mNext;
    }

    mCount++;
    return true;
}
模板
布尔双链接列表::插入(T数据)
{
int i=0;
Node*tmp,*newNode;
布尔检查=假;
newNode=新节点(数据);
tmp=mHead;
if(newNode==NULL)
返回false;
if(mHead==NULL)
{
mHead=newNode;
mTail=newNode;
mCount++;
返回true;
}
while(tmp!=NULL)
{
如果(tmp->mNext==NULL)
{
如果(tmp->mData mpprevious=tmp;
tmp->mNext=newNode;
mTail=newNode;
}
其他的
{
newNode->mNext=tmp;
tmp->mpprevious=newNode;
mHead=newNode;
}
}
else if(tmp->mNext->mData>=数据)
{
newNode->mpprevious=tmp;
newNode->mNext=tmp->mNext;
tmp->mNext->mpprevious=newNode;
tmp->mNext=newNode;
打破
}
tmp=tmp->mNext;
}
mCount++;
返回true;
}

如果我没有弄错的话,错误在于else If。您当前的实现将“data”与节点中“tmp”之后的值进行比较,并且根据设计,不允许在列表中添加任何内容

如果你有一个列表(4, 7),你输入一个值为3的节点,则完全忽略第一个元素,并与第二个元素进行比较,结果是[4,3,7]。考虑将数据与TMP->MDATA而不是TMP-> NeX->MDATA进行比较,并相应地调整逻辑。


此外,在使用泛型数据类型()时,不应依赖于简单的“大于”或“小于”比较。说6<7并不重要,但在比较用户定义的结构或枚举类型时,可能没有明确的顺序。

理论很简单:找到第一个具有较大值的节点(或更小,取决于排序顺序)值。并在找到的节点之前添加新节点。实际上,这可能会有点困难,这就是为什么您可能希望在编写代码之前先将其写在纸上的原因。请记住应在当前列表的开头或结尾之前插入新值的情况。至于您的问题,如果不想用函数来启动(使用上面的建议),那么您需要学习如何使用调试器,以及如何逐行地逐行通过代码,这样会帮助您找到像您所遇到的问题。为了帮助调试,在什么情况下它没有正确插入?在开始时?在结尾?中间有什么情况吗?