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++;

頭または尾に何かを追加したかどうかに関係なく実行されます。あなたが与える各エントリは末尾に追加されるため、毎回2回挿入されます。先頭または末尾にまだ値を追加していない場合にのみ、insert を呼び出す必要があります。

私が正しく理解し、curr=tmp;関係size++;なく実行する必要がある場合は、挿入の呼び出しのみを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 に答える