0

リンク リストのコードが機能しないのはなぜですか? 4 つのメモでは問題ありませんが、5 つになると、並べ替えられたリンク リストがハングするようです。新しいノードを追加して配置する場所がわかりませんか?

つまり、たとえば、最初のデータは文字 A で始まる名前であり、2 番目は D で始まり、3 番目は C で始まります..しかし、5 番目に入力すると、I または K の文字が..私のシステムはハングか何かのようになります..

ノード

Node * next;
Node * prev;
userData * data;

リスト

Node * start;
Node * end;

新しいノードをアルファベット順に広告する関数

void addUserData(userData * data){
        string name = data->getName();
        Node* node = new Node(data);

        if(isEmpty()){
            start = node;
            end = node;
            start->Next(end);
            end->Prev(start);
            return;
        }
        else if(!isEmpty() && start == end){
            node->Next(start);
            node->Prev(start);
            start->Next(node);
            start->Prev(node);

            end = node;

            if(start->getUserData()->getName().compare(node->getUserData()->getName())>0){
                end = start;
                start = node;
            }
            return;
        }
        else{
            Node *temp = start;
            if(name.compare("N") < 0){
                while(temp->getNext()->getNext()!=NULL && name.compare(temp->getNext()->getUserData()->getName())>0){
                    temp = temp ->getNext();
                }
            }
            else{
                temp = end;
                while(name.compare(temp->getUserData()->getName())<0){
                    temp = temp ->getPrev();
                }

            }
            if(name.compare(temp->getUserData()->getName())>0){
                node ->Next(temp->getNext());
                node ->Prev(temp);

                temp->Next(node);
                node->getNext()->Prev(node);

                if(name.compare(end->getUserData()->getName())>0){
                    end = node;

                }

            }else if(name.compare(temp->getUserData()->getName())<0){
                node->Next(temp);
                node->Prev(temp->getPrev());

                temp->getPrev()->Next(node);
                temp->Prev(node);

                if(name.compare(start->getUserData()->getName())<0){
                    start = node;
                }

            }else{
                cout<<"Name already exist\n";

            }

        }

    }
4

1 に答える 1

2

このセクションを見てください:

if(name.compare("N") < 0){
  while(temp->getNext()->getNext()!=NULL && name.compare(temp->getNext()->getUserData()->getName())>0){
    temp = temp ->getNext();
  }
}
else{
  temp = end;
  while(name.compare(temp->getUserData()->getName())<0){
    temp = temp ->getPrev();
  }
}
  1. あなたは、このコード全体を通していくつかの乱雑なロジックを持っています. たとえば、「NULL」をチェックしてもあまり意味がありません。円の中に「NULL」があってはならないからです。リストの整合性をテストしようとしている場合は、このようにではなく、慎重に行ってください。
  2. これは、コード内で無限ループが発生する可能性がある唯一の場所であるため、問題は実際にはここにある必要があります。
  3. 循環リストを並べ替えるとはどういうことか、また、他のすべての要素よりも前 (アルファベット順) または他の要素よりも後にある要素を追加しようとするとどうなるかをよく考えてください。これはあなたがぶら下がっている場所です。
于 2011-04-16T05:11:59.967 に答える