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;
}
答案 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