[英]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.