c ++中的循环链表问题

时间:2011-04-16 03:41:04

标签: c++ linked-list circular-list

为什么我的链表代码不起作用? 4个音符没有问题,但是当我到达5时,已排序的链表似乎挂了。它不知道在哪里追加并放置新节点吗?

我的意思是,例如,第一个数据是一个名字以字母A开头,第二个数字以D开头,第三个以C开头..但是当我输入第五个,字母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";

            }

        }

    }

1 个答案:

答案 0 :(得分: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. Yoiu在这段代码中都有一些不整洁的逻辑。例如,检查“NULL”没有多大意义,因为圆圈中永远不应该有“NULL”。如果您正在尝试测试列表的完整性,请仔细执行,而不是像这样。
  2. 这是代码中唯一可以发生无限循环的地方,所以问题确实必须在这里。
  3. 仔细考虑对循环列表进行排序意味着什么,如果您尝试添加一个元素(在字母顺序之前)或者在所有其他元素之后,会发生什么。这是你挂的地方。