您的位置:首页 > 编程语言 > C语言/C++

"c++ list", c++链表遇上的问题

2007-03-08 21:11 579 查看
<1>构造函数的问题
//链表中的节点类
class CItem
{
private:
int m_val;
CItem * mp_next;

public:
CItem(int value = 0, CItem * pos = 0);
...
}
//构造函数的实现
CItem::CItem(int value, CItem * pos)
:m_val( value )
{
if (!pos)
mp_next = NULL;
else
{
mp_next = pos->mp_next;
pos->mp_next = this;
}
}
--------------------------------------------------
刚开始,一直没搞明白constructor中else{}部分,虽然知道是做了一个类似插入的操作,但就是想不通.后来总算明白,确实是一个插入操作.具体操作是把pos插入的当前项的后一个位置.
mp_next = pos->mp_next;
把插入项的next指向插入位置pos的next,这样,就把插入元素的next设置好了
pos->mp_next = this;
设置插入位置的next为插入项

当然,这个函数是作为一个默认的构造函数,而且它也实现的构造函数的功能.只不过因为考虑到后面insert()系列函数的代码复用问题,而集成了插入功能(把pos插入当前项的后面).但是,它与纯正的insert函数又有很大的区别,
void CList::insert_end(int value)
{
if (!mp_end)
{
mp_front = mp_end = new CItem(value);
}
else
{
mp_end = new CItem(value, mp_end);
}
bump_up_size();
}
最主要的区别就是,构造函数没有分配出空间(也不可能会分配空间,它最主要的功能就是初始化类而已).所以,这个构造函数只是提供了一种插入操作的方法,却没有操作的实体,也就是当进行插入操作的时候,就会先制造一个盛放元素的空间 new CItem(value) 或者 new CItem(value, mp_end).

<2>
清除链表所有元素的函数
void CList::remove_all()
{
if (!mp_front)
{
cout << "Fail: remove_all(): but no data in list" << endl;
}
else
{
CItem *pos = mp_front;
CItem *temp = pos->next();
while (pos)
{
temp = pos->next();
delete pos;
pos = temp;
}
mp_front = mp_end = 0;

cout << "OK: remove_all(): remove all data!" << endl;
}
}
-----------------------------------------
今天这个函数调试了好一会儿才找到原因(书上有例子,但是我一般是写完之后再对照书看,呵呵,这次吃大亏了..)
原来的else部分是这么写的
CItem *pos = mp_front;
CItem *temp;
while (pos)
{
temp = pos;
delete pos;
pos = temp->next();
}
mp_front = mp_end = 0;

cout << "OK: remove_all(): remove all data!" << endl;
---------------------------------------------------
但现在看看却是那么简单的问题,把pos的值(也就是一个指针)赋给temp肯定没错,(就因为坚信这一点,才浪费了那么多的调试时间, 呵呵),但是却错在步骤不对,虽然给赋值了,但是当pos被delete以后,它就没有了,所以在把temp->next()赋给pos也没什么意义了...呵呵,应该先把pos->next()赋给temp,这样释放掉pos以后,temp还会照样存在.
------------------------------------------------

函数也可以这样写(前提是remove_front()函数做好的话)
void CList::remove_all() //<c++ primer>上的例子
{
while (mp_front)
remove_front();
m_size = 0;
mp_front = mp_end = 0;
}

void CList::remove_front()
{
if (!mp_front)
{
cout << "Fail: Remove_front(): but no data in list." << endl;
}
else
{
cout << "OK: remove_front() : " << mp_front->value() << endl;
CItem * pos = mp_front;
mp_front = mp_front->next();

bump_down_size();
delete pos;
}
}
----------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: