繁体   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