链表中的add_sorted函数

时间:2017-10-24 20:10:23

标签: c++ data-structures

我目前正在尝试使用一个函数创建一个链接列表,该函数可以使用我制作的一些函数添加排序到列表中的整数,但我遇到了代码问题:

void list::add_sorted(int el)
    {
      if (empty()) add_first(el);
      else if (el<=head->data) add_first(el);
      else if (el >= tail->data) add_last(el);
    }

我想知道为什么我的代码中的输出: 3

在我写的主要功能中:

list t1;
t1.add_sorted(5);
t1.add_sorted(3);
t1.add_sorted(9);
t1.print();

以下是add_first(int el),add_last(int el)和empty()的实现:

list::list()
{
  head = tail = 0;

}
bool list::empty()
{
  return (head == 0);

}
void list::add_first(int el)
{
    if (empty()) head = tail = new node(el);
    else
     head = new node(el);

}
void list::add_last(int el)
{
    if (empty()) head = tail = new node(el);
    else
     tail=tail->next = new node(el);

}

提前致谢。

2 个答案:

答案 0 :(得分:0)

我对插入已排序链表的理解是保持列表排序。

这意味着您需要搜索列表以找到添加新元素的适当位置:

void addSorted(int value)
{
  node * new_element = new node(el);
  new_element->next = nullptr;
  if (head == nullptr)
  {
    head = new_element;
    tail = head;
  }
  else
  {
     node * p = head;
     node * previous = head;
     while (p != nullptr)
     {
       if (el > p.value)
       {
          new_element->next = p;
          previous->next = new_element;
          break;
       }
     }
     if (p == nullptr)
     {
        previous.next = new_element;
     }
  }
}

这里的想法是你需要在列表中搜索插入点,然后添加你的新元素。有一些极端情况,例如head为空时。

答案 1 :(得分:0)

您在public static void main(String[] args) { String a = ""; String b = ""; Random random = new Random(); StringBuilder builder = new StringBuilder(119999999); for(long i = 0; i < 119999999; i++) builder.append((char) random.nextInt()); a = builder.toString() + "zzzzzzzzz"; b = a.substring(0, a.length() - 9) + "dsadsasda"; Instant start = Instant.now(); boolean test = a.length() > b.length() ? a.contains(b) : b.contains(a); //boolean test = a.contains(b) || b.contains(a); if(test) System.out.println("OK"); System.out.println(Duration.between(start, Instant.now()).toMillis()); } 方法中犯了一个小错误。由于您没有添加所有代码,我已经修改了您的代码,下面提供了这些代码。请比较以下代码以了解您的错误,尤其是比较方法void list::add_first(int el)。希望这会有所帮助。

struct node         {           上市:               int数据;               节点*下一个;               node(int val):data(val),next(NULL){}         };

void list::add_first(int el)