0

这是我到目前为止所拥有的:

void sort(const E &t)
{
  DNode<E> *tmp = new DNode<E>(t,NULL,NULL);


    if(size==0)
    {
        cout << "List is empty" << endl;
    }

            else if(t<=head->element)
            {
                tmp->element=t;
                head->prev = tmp;
                tmp->next=head;
                head = tmp;
            }
                    else if(t>=tail->element)
                    {
                        tmp->element=t;
                        tail->next = tmp;
                        tmp->prev=tail;
                        tail = tmp;
                    }

                         curr=tmp;
                         insert(t);
                         size++;
} 

insert() 只是我程序中的另一个函数:

 void insert(const E &t)
{
  DNode<E> *tmp = new DNode<E>(t,NULL,NULL);
  if (size == 0)
  { curr=head=tail=tmp; }
  else 
  {
    tmp->next=curr;
    tmp->prev=curr->prev;
    if (curr->prev) curr->prev->next=tmp;
    else { head=tmp; }
    curr->prev=tmp;
    curr=tmp;
  }
  size++;
}

它确实编译,但它没有给出正确的结果。我不确定我的错误是什么,我真的需要帮助。任何帮助,将不胜感激。

这是在我的主程序中:

  one.sort(10);
  one.sort(20);
  one.sort(30);
  one.sort(40);
  one.sort(50);
  one.sort(60);
  one.print();
  one.moveToEnd();
  one.prev(); 
  one.prev();
  one.remove();
  one.remove();
  one.print();

  cout<<endl;

我应该得到这个:

头部==> 10 -> 20 -> 30 -> 40 -> 50 -> 60 <==尾部 头部==> 10 -> 20 -> 50 -> 60 <==尾部

但我得到了这个: HEAD==> 10 -> 20 -> 20 -> 30 -> 30 -> 40 -> 40 -> 50 -> 50 -> 60 -> 60< ==TAIL HEAD==> 10 -> 20 -> 20 -> 30 -> 30 -> 40 -> 40 -> 60 -> 60 <==尾巴

4

2 回答 2

1

你看到的行为的原因是你错过了一个 else

这:

curr=tmp;
insert(t);
size++;

无论您是否在头部或尾部添加了一些东西,都会执行。由于您提供的每个条目都会添加到尾部,因此每次都会插入两次。如果尚未将值添加到头部或尾部,则应仅调用 insert。

如果我理解正确,curr=tmp;并且size++;无论如何都应该运行,那么我认为只有对 insert 的调用应该在 else 块内。

编辑:

应该是这样的:

if(size==0)
{
    cout << "List is empty" << endl;
    //Need to insert here as well, to add the first value to the list.
    insert(t);
}

        else if(t<=head->element)
        {
            tmp->element=t;
            head->prev = tmp;
            tmp->next=head;
            head = tmp;
        }
                else if(t>=tail->element)
                {
                    tmp->element=t;
                    tail->next = tmp;
                    tmp->prev=tail;
                    tail = tmp;
                }

                else 
                {
                     insert(t);
                }
                curr=tmp;
                size++;

顺便说一句,我(有点)保持了你的空白使用,虽然我觉得它有点不寻常。我通常会将相关的“if”、“else if”和“else”语句放在同一缩进级别上,并为嵌套块进一步缩进。我认为这是更标准的,但既不是这里也不是那里。

于 2012-10-25T02:52:57.023 回答
0

希望这可以帮助:

    struct node {
       node* next;
       node* prev;
       Person p;
    };

    void sort(node* head) {
       node* n1;
       node* n2;

           for(n1 = head; n1->next != head; n1 = n1->next) {

                for( n2 = n1->next; n2 != head; n2 = n2->next) {

                       // swap data here if necessary
                 }
           }
      }

对于交换:

     X1 = currPtr->previoius;
     X2 = currPtr->next->next;
     currNext = currPtr->next;
     currNext->previous = currPtr->previous;
     currPtr->previous = currPtr->next;
     currPtr->next = currNext->next;
     currNext->next = currPtr;
     X1->next = currPtr->previous;
     X2->previous = currPtr;
于 2012-10-25T02:52:31.850 回答