我试图打印列表中的所有元素,但是输出错误。
代码获得2,0和10,当我调用过程" travel_in"它只显示0,2。
对我的del_start()有一些疑问,它会删除0而不是2 ..
我做错了什么?
使用Cygwin在Windows 64bits中编译
2 0 10 0 2
# include < iostream >
# include < stdio.h >
using namespace std;
template <class clali>
class double_list
{
protected:
clali node1;
clali *listad;
public:
double_list()//constructor
{
listad=NULL;
}
void insert_strt(clali node1)
{
clali *temp;
temp=new clali;
*temp=node1;
//check if list is not empty
if (listad==NULL)
{
listad=temp;
listad->next=NULL;
listad->before=NULL;
}
else
{
temp->next=listad;
listad->before=temp;
temp->before=NULL;
listad=temp;
}
}
int vertam()
{
int res=0;
clali *temp;
temp=listad;
if (temp==NULL)
{
cout<<"Empty list!"<<endl;
res=0;
}
else
while(temp!=NULL)
{
res++;
temp=temp->next;
}
return res;
}
void insert_mid(clali node1, int pos)
{
int i;
clali *temp,*temp2;
temp2=new clali;
temp=listad;
if(pos<vertam)
{
for(i=1;i<pos;i++)
temp=temp->next;
*temp2=node1;
temp2->next=temp->next;
temp->before=listad;
temp->next=temp2;
}
else
cout<<"Cant show the data!"<<endl;
}
clali del_start()
{
clali a,*temp;
a=*listad;
temp=listad;
listad=listad->next;
delete temp;
return a;
}
void insert_end(clali node1)
{
clali *temp,*temp2;
temp=listad;
while(temp->next!=NULL)
{
temp=temp->next;
}
temp2=new clali;
*temp2=node1;
temp->next=temp2;
temp2->before=temp;
temp2->next=NULL;
}
clali clear_end()
{
clali b,*temp,*temp2;
int j=1;
temp=listad;
do
{
temp=temp->next;
cout<<"Element : "<<j<<endl;
j++;
}while(temp->next!=NULL);
b=*temp;
temp2=temp->before;
temp2->next=NULL;
// delete temp;
return b;
}
void travel_in()
{
clali *temp;
temp=listad;
while(temp->next!=NULL)
{
cout<<temp->data<<endl;
temp=temp->next;
}
}
};
struct integer
{
int data;
integer*next,*before;
};
typedef struct integer Integer;
int main()
{
Integer node;
node.next=NULL;
node.before=NULL;
double_list<Integer> test_list;
test_list.insert_strt(node);
node.data=2;
cout<<node.data<<endl;
test_list.insert_end(node);
node.data=0;
cout<<node.data<<endl;
test_list.insert_end(node);
node.data=10;
cout<<node.data<<endl;
test_list.del_start();
test_list.travel_in();
}
答案 0 :(得分:0)
我至少看到一个明显的错误。初始分析表明listad
类成员是指向双向链表中第一个元素的指针。在这种情况下,以下内容显然是错误的(为了易读性而重新格式化,请正确缩进代码):
void insert_mid(clali node1, int pos)
{
int i;
clali *temp,*temp2;
temp2=new clali;
显然,这个类方法的目的是将新节点插入链表的中间。
temp2
是新节点。
temp=listad;
if(pos<vertam)
{
for(i=1;i<pos;i++)
temp=temp->next;
temp
似乎是列表中间的插入位置。
temp->before=listad;
由于某些不明原因,此代码尝试将列表中间的现有节点的before
指针设置为列表的头部。这毫无意义,而且是错误的。
答案 1 :(得分:0)
让我们一步一步地进入main()
。
当您第一次调用insert_strt()
时,参数node
具有成员data
的垃圾值。因此,Integer
的{{1}}对象会在data
的开头插入test_list
。然后分别在列表末尾插入Integer
2和0的data
个对象。
稍后,您从clali
删除第一个test_list
对象,该对象在其data
字段中删除具有垃圾值的对象。因此,删除后,您将拥有data
值为2的对象,并且列表中的顺序为0。
最后,您使用travel_in()
打印列表,但它没有按照您的想法执行。它实际上做的是,如果列表至少有一个元素,那么它将打印列表中除最后一个元素之外的所有元素。如果列表为空,则会导致分段错误(while
循环的条件为temp
将为NULL
)。所以它将打印:2(但你的列表有2和0)。
您可以按如下方式编写travel_in()
。
void travel_in()
{
clali *temp = listad;
while(temp != NULL)
{
cout << temp->data << " ";
temp = temp->next;
}
cout << endl;
}
顺便说一下,评论/删除cout
函数中的main()
语句。他们可能会让你感到困惑。