簡體   English   中英

c ++中的循環鏈表問題

[英]circular linked list problem in c++

為什么我的鏈表代碼不起作用? 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";

            }

        }

    }

看看這一節:

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. 仔細考慮對循環列表進行排序意味着什么,如果您嘗試添加一個元素(在字母順序之前)或者在所有其他元素之后,會發生什么。 這是你掛的地方。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM