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

Adding nodes to linked list alphabetically in c++

本文关键字:节点 添加 链表 c++ 顺序      更新时间:2023-10-16

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

//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::列表?你可以插入一个单词,检查它是否为非空,立即应用标准排序算法(它依赖于排序对象的比较运算符)并打印它。它速度快,代码短且可读,而且你不需要花时间重新设计轮子。

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

我认为这里有很多问题。

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

此外,您需要在每次迭代中为newPtr分配内存,否则您只需要重写它指向列表中最后一个的内存位置。

其次,假设在第二次迭代(或多次迭代)时,prevPtr指向某个东西,而循环prevPtr已在列表中向下移动(prevPtr=nextTr),这将导致prevPtr->data="擦除该元素中的任何数据。所以你可以打印第一个节点加上一堆空格。

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