繁体   English   中英

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

[英]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的风格编写。 请参见InsertAfterInsertBefore方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM