簡體   English   中英

在C ++中按字母順序將節點添加到鏈表

[英]Adding nodes to linked list alphabetically in c++

我正在嘗試創建一個鏈接列表,該列表從用戶那里獲取單詞,直到輸入為空,並且添加了每個單詞,以便列表按字母順序排列。 但是,僅打印第一個節點。 我做錯了什么嗎? 這是我所擁有的(減去標題和聲明):

    //put in additional nodes until the input is blank
while(in != " "){
    cin >> in;
    newPtr->data = in;
    prevPtr->data = "";
    prevPtr->next = NULL;
    nextPtr = list;
    //shift the prevPtr and nextPtr until newPtr is alphabetically between them
    while(!(prevPtr->data<=in && nextPtr->data>in)){
        prevPtr = nextPtr;
        nextPtr = prevPtr->next;
    }
    //make newPtr point to the next node
    if(nextPtr != NULL){
        newPtr->next = nextPtr;
    }
    //make newPtr the "next" pointer of the previous node, if any
    if(prevPtr != NULL){
        prevPtr->next = newPtr;
    }
    //if there's nothing before newPtr, make it the first node
    else{
        list = newPtr;
    }
    printList(list);
};

}

我將其發布為評論,因為恐怕我可能會遺漏一些東西,但是我還不能做到這一點,因此這里沒有答案:

是什么讓您無法使用std :: list 您可以插入一個單詞,檢查它是否為非空,立即應用標准的排序算法 (它依賴於排序對象的比較運算符)並打印出來。 它速度很快,您的代碼簡短易讀,並且您無需花費時間重新發明輪子。

PS:如果您想測試一個空字符串,我想應該是"" ,而不是" "

我認為這里有很多問題。

對於初始迭代中的一個,prevPtr-> data指向什么? 如果它什么也沒有指向或尚未分配給任何內存,則不應將其設置為任何值。

另外,您需要在每次迭代時為newPtr分配內存,否則,您將只寫列表中指向它最后的位置的內存位置。

第二個讓我們假設prevPtr指向某個對象,在此過程的第二次迭代(或更多次迭代)上,而循環prevPtr已移到列表的更下方(prevPtr = nextPtr),這將導致prevPtr-> data =“”擦除其中的任何數據。該元素。 因此,您可以隨后打印第一個節點以及一堆空格。

第三,您應該首先在循環中檢查list是否為NULL,因為如果循環為NULL,則nextPtr-> data將指向垃圾,這不好。 列表上的NULL檢查可能是第一個元素的特殊情況。

嘗試這樣的事情,我沒有時間對其進行測試,但是它應該朝着正確的方向發展:

Node *list = NULL; 

while(in != " "){
    cin >> in;
    Node *newPtr = new Node();
    newPtr->data = in;
    newPtr->next = NULL;

    prevPtr = list;
    nextPtr = list;

    // Do we have an empty list
    if(list != NULL)
    {
        // Corner Case: First on the list
        if(newPtr->data <= prevPtr->data)
        {
            list = newPtr;
            newPtr->next = prevPtr;
        }
        else
        {
            // CASE: Somewhere between the first and the list
            while(nextPtr->next != NULL)
            {
                nextPtr = nextPtr->next;
                if(newPtr->data >= prevPtr->data && newPtr->data <= nextPtr->data)
                {
                    prevPtr->next = newPtr;
                    newPtr->next = nextPtr;
                    break;
                }
                prevPtr = prevPtr->next;
            }

            // Corner Case: end of list
            if(nextPtr->next == NULL)
            {
                nextPtr->next = newPtr;
            }
        }
    }
    else 
    {
        // Corner Case: We had an empty list
        list = newPtr;
    }
    printList(list);

暫無
暫無

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

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