已排序名称的链接列表C ++

时间:2015-11-19 03:56:39

标签: c++ linked-list

我遇到了一个我必须创建的链表问题。 程序应该接受用户输入的名称,然后将它们放入链接列表中。此列表应按字母顺序排序,因此当添加新节点时,它应该转到正确的位置。

我的代码现在看起来像这样:

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个节点,我就不知道如何对第三个或第四个节点进行排序。

戴夫

1 个答案:

答案 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代码审查问题。请参阅InsertAfterInsertBefore方法。