[英]Linked List of sorted names C++
我必须创建一个链接列表时遇到问题。 该程序应接受用户输入的名称,然后将其放入链接列表中。 该列表应按字母顺序排序,因此,当添加新节点时,其位置应正确。
我的代码现在看起来像这样:
struct node
{
string info;
node *next;
};
class Passenger
{
private:
node* pname;
public:
void insert(string);
Passenger();
};//closes Passenger class
Passenger::Passenger()
{
pname = new node;
pname -> info = "ABC";
pname -> next = NULL;
}
void Passenger::insert(string name)
{
node *temp, *p, *s;
p = pname;
s = pname;
temp = new node;
temp->info = name;
if(p-> info == "ABC") //new pname linked list, put temp at the front
{
p->info = name;
p->next = NULL;
}
//if there is already one in the list
while(s != NULL)
{
cout<<"inside while loop"<<endl;
//if new node goes to left
if(temp->info < s->info)
{
temp->next = p;
pname = temp;
}//closes if
if(temp->info > s->info)
{
if(p->next != NULL)
{
s = s->next;
if(s->next == NULL)
s->next = temp;
}//closes if
}//closes if
p = p->next;
s = s->next;
}//closes while
我真的不知道如何更改它的工作原理。 当列表中有一个节点时,我就完成了,然后添加了第二个。 但是如果已经有2个节点,我不知道如何在其中排序第三个或第四个节点。
戴夫
用包含“ ABC”的标记节点表示一个空列表的BTW是荒谬的。 如果有人要存储以该名称开头的列表怎么办? 使用NULL指针表示空列表是一种几乎通用的约定。
同样,节点不必是其他类型。 列表类本身可以是一个节点。 因此,该类的实例只是第一个节点的实例,带有指向列表其余部分的指针。 或者,为了更好地处理空列表,您可以有一个容器类,该类保留指向头的指针(并可以选择指向尾的指针,以便快速插入尾部)。 如果需要,实现帮助器函数可以是节点的成员函数,而不是容器类,因此可以在任何子列表中调用它们。
当我学习链接列表时,我经常发现它有助于在纸上绘制节点的圆圈和指针的箭头,就像在数据结构教科书中一样。 这样一来,您在思考整个过程和任何特殊情况(列表的开头或结尾)时就不必花太多时间在脑海中。
您可以将问题分为两部分:搜索和插入。
您的搜索功能应返回一个指向插入位置之前的节点的指针。 也就是说,最后一个节点的字符串比您要插入的字符串少。 你在功能回路则需要要么展望下一个元素,或保持prev
指针。 无论哪种方式,您都需要返回到停止循环的节点之前的节点。
在节点之后插入非常容易。 在特殊情况下,您需要插入列表的新标题,因为没有节点可以修改以指向新的当前列表。 但是,您不必担心要插入的节点是否在列表的末尾。
您可以通过使用指向实际第一个元素的“虚拟”节点来减少特殊情况的数量。 与InsertNth相比,此技巧可能不适用于基于比较的插入。 我对这个问题的回答将事情分解为查找和插入操作,并且即使它是Java代码审查问题,也以类似C的风格编写。 请参见InsertAfter
和InsertBefore
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.