在c ++中按字母顺序将节点添加到链表

时间:2012-10-16 22:39:30

标签: c++ sorting linked-list

我正在尝试创建一个链接列表,该列表从用户获取单词,直到输入为空,并且添加每个单词以使列表按字母顺序排列。但是,仅打印第一个节点。有什么我做错了吗?这是我所拥有的(减去标题和声明):

    //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);
};

}

2 个答案:

答案 0 :(得分:1)

我会将此作为评论发布,因为我担心我可能会遗漏某些内容,但我还不能这样做,所以这里没有答案:

是什么阻止您使用std::list?您可以插入一个单词,检查它是否为非空,立即应用标准sorting algorithm(它依赖于已排序对象的比较运算符)并打印它。它速度快,代码简短易读,您不会花时间重新发明轮子。

PS:如果你想测试一个空字符串,我想它应该是"",而不是" "

答案 1 :(得分:0)

我认为这里有很多问题。

对于初始迭代中的一个,什么是prevPtr->数据指向?如果它没有指向或没有分配给任何内存,你不应该将它设置为任何内容。

另外,你需要在每次迭代时为newPtr分配内存,否则你只是在列表中的内存位置上写下它最后指向的位置。

第二个让我们假设prevPtr指向某个东西,在第二个迭代(或更多)中,while循环prevPtr已经被移动到列表的下方(prevPtr = nextPtr),这将导致prevPtr-&gt; data =“”擦除该元素中的任何数据。因此,您可以在之后打印第一个节点和一堆空格。

第三,你应该首先检查循环中列表是否为NULL,因为如果循环为NULL,则nextPtr-&gt;数据将指向不好的垃圾。列表上的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);