C++ c+中的循环链表问题+;

C++ c+中的循环链表问题+;,c++,linked-list,circular-list,C++,Linked List,Circular List,为什么我的链表代码不起作用?4个音符没有问题,但当我达到5个音符时,排序的链表似乎挂起了。它不知道在哪里追加和放置新节点吗 我的意思是,例如,第一个数据是一个以字母a开头的名称,第二个以D开头,第三个以C开头。。但当我进入第五个字母时,字母i或K。。我的系统像是挂断之类的 节点 列表 按字母顺序显示新节点的函数 void addUserData(userData*data){ 字符串名称=数据->获取名称(); 节点*节点=新节点(数据); if(isEmpty()){ 开始=节点; 结束=节点

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

我的意思是,例如,第一个数据是一个以字母a开头的名称,第二个以D开头,第三个以C开头。。但当我进入第五个字母时,字母i或K。。我的系统像是挂断之类的

节点 列表 按字母顺序显示新节点的函数
void addUserData(userData*data){
字符串名称=数据->获取名称();
节点*节点=新节点(数据);
if(isEmpty()){
开始=节点;
结束=节点;
开始->下一步(结束);
结束->上一步(开始);
返回;
}
如果(!isEmpty()&&start==end),则为else{
节点->下一步(开始);
节点->上一步(开始);
开始->下一步(节点);
开始->上一步(节点);
结束=节点;
如果(开始->getUserData()->getName().compare(节点->getUserData()->getName())>0){
结束=开始;
开始=节点;
}
返回;
}
否则{
节点*温度=开始;
如果(名称比较(“N”)<0){
而(temp->getNext()->getNext()!=NULL&&name.compare(temp->getNext()->getUserData()->getName())>0){
temp=temp->getNext();
}
}
否则{
温度=结束;
而(name.compare(temp->getUserData()->getName())getPrev();
}
}
如果(name.compare(temp->getUserData()->getName())>0){
节点->下一步(临时->获取下一步());
节点->上一个(临时);
临时->下一步(节点);
node->getNext()->Prev(节点);
如果(name.compare(end->getUserData()->getName())>0){
结束=节点;
}
}else if(name.compare(temp->getUserData()->getName())Next(temp);
node->Prev(temp->getPrev());
temp->getPrev()->Next(节点);
temp->Prev(节点);

如果(name.compare(start->getUserData()->getName())查看此部分:

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(“N”)<0){
而(temp->getNext()->getNext()!=NULL&&name.compare(temp->getNext()->getUserData()->getName())>0){
temp=temp->getNext();
}
}
否则{
温度=结束;
而(name.compare(temp->getUserData()->getName())getPrev();
}
}
  • Yoiu在整个代码中都有一些不规则的逻辑。例如,检查'NULL'没有多大意义,因为圆圈中永远不应该有'NULL'。如果您试图测试列表的完整性,请小心操作,不要像这样。
  • 这是代码中唯一可能发生无止境循环的地方,所以问题必须在这里。
  • 仔细考虑对循环列表进行排序意味着什么,以及如果您尝试添加一个在所有其他元素之前(按字母顺序)或在所有其他元素之后的元素,会发生什么。这就是挂起的位置。
    您是否尝试过通过调试器运行代码?我看不出调试器如何在给定特定输入数据的情况下不向您确切显示代码行为不正确的原因。这样做有太多错误,很难计算。主要是,您将列表构建为循环(在第一次和第二次插入之后),但当您扫描列表时,您正在检查指针是否为空。@user708280:关于字符串的一个注意事项是,
    lhs
    通常更容易读取
    lhs。compare(rhs)<0
    。读取源代码越容易,调试它就越容易。
    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";
    
                }
    
            }
    
        }
    
    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();
      }
    }