我正在使用结构ListItem
创建一个双向链表,该结构具有prev
和next
指针以及类型为T的值。
我做得对吗?
当我运行主代码时,我只能在显示屏中看到1,15和16。
template <class T>
void List<T>::insertSorted(T item)
{
ListItem<T> *node=new ListItem<T>(item);
if (head==NULL)
{
head=node;
}
else if (head!=NULL)
{
T c,d;
ListItem<T> *temp,*temp2;
temp=head;
c=temp->value;
int count=0;
while (temp->next!=NULL)
{
if (temp->prev!=NULL)
temp2=temp->prev;
if (c>item && item>temp2->value)
{
if (temp->prev!=NULL)
{
temp2->next=node;
node->prev=temp2;
node->next=temp;
temp->prev=node;
count++;
}
else if (temp->prev==NULL)
{
head=node;
head->next=temp;
count++;
}
}
temp=temp->next;
c=temp->value;
}
if (temp->value<item) //comparison with last temp
{
temp->next=node;
node->prev=temp;
}
else if (temp->value>item)
{
temp2=temp->prev;
temp2->next=node;
node->prev=temp2;
node->next=temp;
temp->prev=node;
}
}
}
int main()
{
List<int> Mylist;
for (int i=16;i>0;i--)
{
Mylist.insertSorted(i); //insertion should be in ascending order according
//to my fnction
}
Mylist.printList(); //prints the whole linked list
system("PAUSE");
return 0;
}
答案 0 :(得分:2)
不,你在做的是UB。给定head != NULL
和head->next != NULL
,意味着列表中至少有两个项目:
else if (head!=NULL)
{
T c,d;
ListItem<T> *temp,*temp2; //temp2 points to nirvana
temp=head; //temp is head
c=temp->value;
int count=0;
while (temp->next!=NULL) //head->next != NULL, so enter the loop
{
if (temp->prev!=NULL) //head->prev is NULL...
temp2=temp->prev; //.. so temp2 continues to point into nirvana
if (c>item && item>temp2->value) //take nirvana's value. OUCH!
重构您的代码。在纸上展示你的算法,看看它在不同的情况下应该做什么(列表中没有元素,列表中的一个元素,两个或更多元素,项目是较小的,项目是最大的,或项目介于两者之间)。如果你把它写在纸上,请在代码中写下来。
编辑:提示:我认为列表之前是排序的。列表元素应具有哪些属性,在此之前要插入新项?你怎么能找到它?