0

これをメイン関数で使用しましたが、機能していません

void LinkedList::TraPrinHead(const LinkedList& p)
{
  Nodes* currentNodes = header->next;
  while( currentNodes != tail ) {
     cout << currentNodes->elem << " ----> ";
     currentNodes = currentNodes->next; }
}

これからリスト全体を出力することを期待しています...しかし、無限ループが発生し続けます。

   cout << currentNodes->elem << " ----> ";
   currentNodes = currentNodes->next;
   cout << currentNodes->elem << " ----> ";
   currentNodes = currentNodes->next;

そして、リストの最初の2つの要素を出力するためだけに単純化しても、無限ループは発生しませんが、異なる2つのノードに対して同じことを取得し続けます

たとえば、私の最初のノードは A1 で、2 番目は A2 でしたが、その関数では A1 ----> A2 を取得することを期待していますが、取得するのは A1 ----> A1 ----> です。

追加機能に問題があると思います。

これは私が使用する機能です

  void LinkedList::InsertDoublyBefore(Nodes* d, const string& e) {

  if (header->next == tail) 
  { 
     Nodes* n = new Nodes;
     n->elem = e; 
     n->next = tail;
     n->prev = tail->prev;
     tail->prev->next = tail->prev = n; 
     header->next = n; // very important!!!!
  }
  else
  {
       if (d==tail) 
        {
         Nodes* n = new Nodes;
         n->elem = e;
         n->next = tail;
         n->prev = tail->prev;
         tail->prev = n;
         }
       else
       {
         Nodes* n = new Nodes; 
         n->elem = e; 
         n->next = d; 
         n->prev = d->prev;
         d->prev->next = d->prev = n; 
        }
      }

     }

     void LinkedList::InsertDoublyAfter(Nodes* d, const string& e) 
     {
         InsertDoublyBefore(d->next, e);
     }

   void LinkedList::addtoFront(const string& e)  { InsertDoublyBefore(header->next, e); }
   void LinkedList::addtoBack(const string& e) { InsertDoublyBefore(tail, e); } 
4

2 に答える 2

0

あなたのケースは少し冗長です。この特定の挿入関数で処理する必要があるケースには、次のものがあります。

  1. d==head (head を newNode に変更する必要があります)
  2. head==tail (head と tail を変更する必要があります。これは、head==tail==NULL のようにリストが空の場合にも当てはまります)

また、TA やインストラクターのオフィスアワーにアクセスすることも検討してください。

非常に基本的な概念について多くの質問があり、(すべての投稿から) これらのアイデアの背後にあるロジックを理解するのに十分な情報を講義ノートから収集していない場合は、インストラクターに連絡するようにしてください。 TA、またはキャンパスでの支援のためのその他のオプション。これらは、カスタマイズされたデータ構造の将来の開発とアプリケーション開発のために完全に理解するための非常に重要なアイデアです。

于 2013-04-14T01:13:02.327 に答える
0

この行

    tail->prev->next = tail->prev = n;

正しく見えません。tail->prev = nで変更しようとしたn->next後、tail->prev->next = ...実際にはtail->prev->next. 実際には、式で同じ変数 ( ) を変更してから使用するため、未定義の動作が発生しますtail->prev。これはさらに悪いことです。

ここ

   if (d==tail) 
    {
     Nodes* n = new Nodes;
     n->elem = e;
     n->next = tail;
     n->prev = tail->prev;
     tail->prev = n;
     }

リンクの半分だけを変更しているようです。

そしてここ

   {
     Nodes* n = new Nodes; 
     n->elem = e; 
     n->next = d; 
     n->prev = d->prev;
     d->prev->next = d->prev = n; 
    }

前述のものと同様の問題があります。

デバッガを使用してください。しかし、その前に、紙の上ですべてを解決してください。

于 2013-04-14T01:20:52.913 に答える