我遇到了一个我必须创建的链表问题。 程序应该接受用户输入的名称,然后将它们放入链接列表中。此列表应按字母顺序排序,因此当添加新节点时,它应该转到正确的位置。
我的代码现在看起来像这样:
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个节点,我就不知道如何对第三个或第四个节点进行排序。
戴夫
答案 0 :(得分:0)
BTW,表示一个空列表,其中包含一个包含&#34; ABC&#34;的标记节点。太荒谬了。如果有人想要存储以此开头的列表怎么办?使用NULL指针表示空列表是一种近乎通用的约定。
此外,节点不必是不同的类型。列表类本身可以是一个节点。所以类的一个实例只是第一个节点的一个实例,带有指向列表其余部分的指针。或者,为了更好地处理空列表,您可以使用一个容器类来保持指向头部的指针(以及可选的尾部,以便快速插入尾部)。如果您愿意,实现辅助函数可以是节点的成员函数,而不是容器类,因此您可以在任何子列表上调用它们。
当我学习链接列表时,我经常发现它有助于为一张纸上的节点和箭头绘制圆圈,就像在数据结构教科书中一样。然后,当你仔细考虑整个过程和任何特殊情况(列表的开头或结尾)时,你不必在精神上保持同样的空气。
您可以将问题分解为两部分:搜索和插入。
您的搜索功能应该在插入位置之前返回指向节点的指针。即最后一个节点,其字符串比你要插入的字符串要小。然后,您在该函数中的循环需要向前看下一个元素,或者保留prev
指针。无论哪种方式,您都需要在停止循环之前返回节点。
在节点之后插入非常简单。当您需要插入列表的新头时,会出现一种特殊情况,因为没有要修改的节点指向新的当前列表。但是,您不需要关心您之后插入的节点是否在列表的末尾。
您可以减少特殊情况by using a "dummy" node pointing to the actual first element的数量。与InsertNth相比,此技巧可能不适用于基于比较的插入。我的answer on that question将内容分解为查找和插入,并且以类似C的样式编写,即使这是一个Java代码审查问题。请参阅InsertAfter
和InsertBefore
方法。