在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::列表?你可以插入一个单词,检查它是否为非空,立即应用标准排序算法(它依赖于排序对象的比较运算符)并打印它。它速度快,代码短且可读,而且你不需要花时间重新设计轮子。
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);
相关文章:
- 将树节点添加到向量向量中的 n 元树遍历的平均和最坏情况时间复杂度是多少?
- 如何将节点添加到链表
- 在 C++ 中使用 temp 变量将节点添加到链表的末尾
- 将节点添加到链接列表中,而无需明确分配内存空间(无需使用新)
- 推送功能(将新节点添加到列表顶部)C
- 倒排索引节点添加字
- 制作完成后是否可以将节点添加到图形中
- 嗨,我正在尝试将集合的特定节点添加到列表中,该列表位于哈希表中
- C++链表将新节点添加到列表的开头
- 如何将节点添加到链表C++的前面?我想多了这个概念
- 用独特的指针将节点添加到树上
- 将节点添加到链表的末尾
- 将新节点添加到列表中并动态命名
- C++:尝试将新节点添加到链表会产生"线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x0)"错误
- 在c++中按字母顺序将节点添加到链表中
- 将边缘节点添加到没有边缘的顶点时出现 Seg 错误
- 当我尝试将新节点添加到列表中时,我收到错误消息"no matching function call"
- 如何在C++中将文件路径作为节点添加到树或堆栈中
- 将多个节点添加到树C++中
- C++将节点添加到链表的开头一次后失败.其他方法也有问题