1

したがって、この新しいノードは最後のノードの後に​​挿入されることになっています。なぜそれが起こらないのか理解できません。注:リストには、この関数が呼び出される前に複数の要素が含まれているため(約5)、現時点では、その場合にのみ機能する必要があります。最後のノードは最上位ノードを指し、top->prevポインターは最後のノードを指している必要があります。どこが間違っているのですか?ちなみに、print関数が呼び出されたときに最後のノードが印刷されないため、間違っていると思います

void CircularDLL::insertAfterLast (int id, string name, string email, int age)
{
 Node* N=new Node;

 N->stId=id;
 N->stName=name;
 N->stEmail=email;
 N->stAge=age;

 Node* Q=top;

 while(Q->next!=top)//get to the last node
 {
  Q=Q->next;
 }
 cout<<"Q next is top now"<<endl;
 Q->next=N;
 N->prev=Q;
 N->next=top;
 top->prev=N;

}
4

1 に答える 1

3

このコードにはいくつかの問題があります。まず、「insertAfterLast」を頻繁に実行する場合は、「top-> prev」を使用して、一定時間内に最後の要素へのポインターを取得する必要があります。そうしないと、リストの作成に2次(O(n ^ 2))時間が必要になります。次に、循環リンクリストを最初から実装する実際のプロジェクトでは、ほぼ間違いなく悪い考えです。代わりに、 std::dequeやBoostのcircular_bufferなどの成熟したSTL準拠のコンテナーを使用する必要があります。

あなたが本当にこれをしたいと思っていて、空のリストについて心配していないと仮定すると、上記の関数はすでに完全に正しいように見えます。ほとんどの場合、問題は、開始する前の最初のリストの形式が正しくないか、リストを繰り返して最後に印刷するときに、最後の要素をスキップしていることです。循環リンクリストを反復処理する正しい方法は次のとおりです(ウィキペディアから採用):

Node* Q = top;
do {
    cout << Q->stId << endl;
    Q = Q->next;
} while (Q != top);
于 2011-05-06T23:37:06.583 に答える