2017-04-20 23 views
0

所以我想根据它们的位置(一个整数)然后按日期(年和月)对节点排序。当我使用我的重载操作符来打印我的链表时,它显示列表只插入其中一个想要的节点,这意味着我的插入函数不正确。它没有给出任何错误,它只是没有按预期运行。我的插入功能如下。有没有人有什么错误的想法?有多个参数的链接列表问题

void LinkedList::insert(int location, int year, int month, double temperature) { 
// Implement this function 
Node* newNode = new Node(); 
newNode->loc = location; 
newNode->yr = year; 
newNode->mo = month; 
newNode->temp = temperature; 
Node* tempNode = head; 
Node* previousNode = nullptr; 

if(tail == nullptr & head == nullptr){ 
    head = newNode; 
} 
while(tempNode != nullptr){ 
    if((tempNode->loc == newNode->loc) && (tempNode->yr == newNode->yr)){ 
     if(tempNode->mo > newNode->mo){ 
      newNode->next = tempNode->next; 
      tempNode->next = newNode; 
     } 
     if(tempNode->mo < newNode->mo){ 
      newNode->next = tempNode; 
     } 
    } 
    if(tempNode->loc > newNode->loc){ 
     newNode->next = tempNode->next; 
     tempNode->next = newNode; 
    } 
    if(tempNode->loc < newNode->loc){ 
     newNode->next = tempNode->next; 
     tempNode->next = newNode; 
    } 
    tempNode = tempNode->next; 
} 

}

+1

当你创建新节点'data'时,'data-> next'指向哪里?你如何初始化'head'和'tail'?如果你循环遍历整个列表,但是找不到插入新节点'data'的地方?为什么一旦你找到了插入新节点数据的地方,为什么还要循环遍历列表呢? –

+0

我在上面的构造函数中将头部和尾部初始化为nullptr。 –

+0

我提到的其余问题如何?您是否尝试过调试该程序?即在调试器中逐行执行代码。能够使用调试器对于任何程序员来说都是至关重要的,即使它只是一种爱好。也请花点时间[阅读如何调试小程序](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。 –

回答

0

你没有得到正确的链表的原因是因为你在做的指针操作错误。当你分配cur->next=data->next; 你基本上是因为data->next没有指向清单中的下一个节点。 另外,请注意,由于这是一个单一的链表[意思是它只有一个指针向前],因此只能在当前节点之前插入节点。 尝试是这样的:

if (cur->loc > data->loc) { data->next = cur->next; // This will insert data in middle of cur->next = data; // cur and cur->next }

有多种检查,如果你想在递增或递减顺序插入,你需要做的事。 当您插入列表的第一个元素时,插入头部,插入尾部并插入链表的中间部分。
此外,在尾节点确保其下一个始终设置为空。