проблема кругового связанного списка в c ++ - PullRequest
0 голосов
/ 16 апреля 2011

Почему код связанного списка не работает? У него нет проблем с 4 заметками, но когда я получаю 5, отсортированный связанный список кажется зависает. Разве он не знает, куда добавить и разместить новый узел?

Я имею в виду, например, что первые данные - это имя, начинающееся с буквы A, а второе - с D, а третье - с C .. но когда я ввожу для 5-го, буква I или K .. моя система похожа повесить или что-то ..

Node

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

            }

        }

    }

1 Ответ

2 голосов
/ 16 апреля 2011

Взгляните на этот раздел:

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. Тщательно продумайте, что означает сортировка кругового списка, и что произойдет, если вы попытаетесь добавить элемент, который находится либо перед всеми остальными (в алфавитном порядке), либо после всех остальных. Это где ты вешаешь.
...