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