插入链接列表

时间:2016-02-13 19:07:14

标签: c++

insertAfter中的LinkedList功能无效。

如果有人能指出我的代码有什么问题,我真的很感激。

谢谢:)

这是列表struct:

struct ListItem
{
    T value;
    ListItem<T> *next;
    ListItem<T> *prev;

    ListItem(T theVal)
    {
        this->value = theVal;
        this->next = NULL;
        this->prev = NULL;
    }
};

这是我在列表中插入的函数:

template <class T>
void LinkedList<T>::insertAfter(T toInsert, T afterWhat)
{
 if(head!=NULL)    
 {
  ListItem<T>*p;
  p=head;
  while(p->next!=NULL)
  {
   if(p->value==afterWhat)
   {
    ListItem<T>*k;
    k=new ListItem<T>(toInsert);
    k->next=p->next;
    p->next=k;
    k->prev=p;
    k->next->prev=k;
   }
   else
    p=p->next;
  }
 }
 else
 {
  head= new ListItem<T>(toInsert);
 }
 //p=NULL;
}

1 个答案:

答案 0 :(得分:0)

首先,如果找不到afterWhat,则不应插入。

因此,在以下情况之间不会插入:列表为空,或列表中不存在afterWhat

其次,while(p->next!=NULL)循环永远不会检查afterWhat列表的最后一个元素,因为它在最后一个之前结束迭代。

因此,如果afterWhat是列表中的最后一个元素,它将不会被检测到。

第三,插入完成后应立即打破循环。之后,p的值还可以确定是否找到afterWhat,如果需要,可以显示相应的结果。

第四,既然afterWhat是最后一个元素的情况也在处理中,我们还需要在对其进行任何更改之前检查p->next!=NULL,因为它p可能是最后一个元素,在这种情况下,p->next无需进行任何操作。

请注意,您无法使用head函数在insertAfter位置插入元素,因为head之前没有任何内容可以在此afterWhat中使用insertAfter情况下。

template <class T> void LinkedList<T>::insertAfter(T toInsert, T afterWhat) { if(head != NULL) { ListItem<T>*p; p=head; while(p != NULL) { if(p->value==afterWhat) { ListItem<T>*k; k = new ListItem<T>(toInsert); k->next = p->next; p->next = k; k->prev=p; if(k->next != NULL) k->next->prev = k; break; } else p = p->next; } if(p == NULL) cout<<"afterWhat, not found, hence no insertion made\n"); else cout<<"Inserted!\n"; } else { cout<<"List is empty, hence afterWhat, not found\n"); } } 函数应该是这样的:

No symbol in current context