单链表一问

fallening 2008-10-29 03:32:07
代码如下:
$ cat slist.h
#ifndef _SLIST_H_INCLUDED
#define _SLIST_H_INCLUDED

#include <ostream>

template< typename T >
class Slist
{
public:
Slist() : head_(0){};
~Slist();
void reverse();

T front() const;
void push_front( const T& );
const T pop_front();

private:
struct Node;
Node* head_;
};


#include "slist.tcc"

#endif


$ cat slist.tcc
template< typename T >
struct Slist<T>::Node
{
T data_;
Node* next_;
};


template< typename T >
Slist<T>::~Slist()
{
Node* current = head_;
while( current )
{
current = head_ -> next_;
delete head_;
head_ = current;
}
head_ = 0;
}

template< typename T >
void Slist<T>::reverse()
{
if ( head_ && head_ -> next_ )
{
Node* second_head_ = head_ -> next_;
Node* tmp = second_head_ -> next_;
while( 1 )
{
second_head_ -> next_ = head_;
head_ = second_head_;
second_head_ = tmp;
if ( !second_head_ ) break;
tmp = tmp -> next_;
}
}
}

template< typename T >
T Slist<T>::front()const
{
T ans = T();

if ( head_ )
ans = head_ -> data_;

return ans;
}

template< typename T >
void Slist<T>::push_front( const T& val )
{
Node* new_head = new Node;
new_head -> next_ = head_;
new_head -> data_ = val;
head_ = new_head;
}

template< typename T >
const T Slist<T>::pop_front()
{
T ans = T();

if ( head_ )
{
ans = head_ -> data_;
Node* tmp = head_;
head_ = head_ -> next_;
//whYYYYYYYYYYYYYYYYYYYYYYYY?
tmp -> next_ = 0;//如果省去这句,测试函数不能停止
delete tmp;
}
return ans;
}




测试函数如下:
$ cat test.cc
#include "slist.h"

#include <iostream>
using namespace std;

int main()
{
Slist<int> s;

for ( int i = 0; i < 10; ++i )
s.push_front( i );
for ( int i = 0; i < 10; ++i )
cout << s.pop_front() << " ";

cout << endl;

for ( int i = 0; i < 10; ++i )
s.push_front( i );
s.reverse();
for ( int i = 0; i < 10; ++i )
cout << s.pop_front() << " ";

return 0;
}



哪位可以解释一下为什么
pop_front中
 tmp -> next_ = 0;

是必须的?
...全文
228 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
fallening 2008-10-31
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 baihacker 的回复:]
C/C++ code//囧,道长的问题在于reverse写错了,下面是我重写的,把你那个去了,用我写的reverse,g++下正常.template<typename T>voidSlist<T>::reverse()
{if( head_&&head_->next_ )
{
Node*p=head_,*q=NULL;while(p)
{
Node*r=q;
q=p;
p=p->next_;
q->next_=r;
}
head_=q;
}
}
[/Quote]
谢过飞雪,真的没有想到原来错在这里

太乙 2008-10-31
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 baihacker 的回复:]
C/C++ code
//囧,道长的问题在于reverse写错了,下面是我重写的,把你那个去了,用我写的reverse,g++下正常.

template< typename T >
void Slist<T>::reverse()
{
if ( head_ && head_ -> next_ )
{
Node* p = head_, * q = NULL;
while (p)
{
Node* r = q;
q = p;
p = p->next_;
q -> next_ = r;
}
head_ = q;

[/Quote]

强大~~我顶~~呵呵~~道长!
baihacker 2008-10-31
  • 打赏
  • 举报
回复

//囧,道长的问题在于reverse写错了,下面是我重写的,把你那个去了,用我写的reverse,g++下正常.

template< typename T >
void Slist<T>::reverse()
{
if ( head_ && head_ -> next_ )
{
Node* p = head_, * q = NULL;
while (p)
{
Node* r = q;
q = p;
p = p->next_;
q -> next_ = r;
}
head_ = q;
}
}
fallening 2008-10-31
  • 打赏
  • 举报
回复
先加100
wzyzb 2008-10-31
  • 打赏
  • 举报
回复
mark
fallening 2008-10-31
  • 打赏
  • 举报
回复
多谢:)
baihacker 2008-10-31
  • 打赏
  • 举报
回复


template< typename T >
void Slist<T>::reverse()
{
if ( head_ && head_ -> next_ )
{
Node* second_head_ = head_ -> next_;
Node* tmp = second_head_ -> next_;
head_->next_ = NULL; //道长的代码少了这句
while( 1 )
{
second_head_ -> next_ = head_;
head_ = second_head_;
second_head_ = tmp;
if ( !second_head_ ) break;
tmp = tmp -> next_;
}
}
}
xtting_8984313 2008-10-30
  • 打赏
  • 举报
回复
我的VC下正常,lz是否可以告诉一下不能停止的原因,是第几个循环?
建议输出一下每次循环之后的i值是多少啊,如果是i有问题,加个数据断点看一下问题所在。

再有看一下当时i 和 node-〉next 的内存分别是多少啊。


尝试一下for ( int i = 0; i < 10; ++i )中的i,定义在main的开头,不要在for中定义。
jia_xiaoxin 2008-10-29
  • 打赏
  • 举报
回复
//tmp和head_指向同一个结点
Node* tmp = head_;
//head_和head_ -> next指向同一个结点,这是一个死循环
head_ = head_ -> next_;
//也就是将head_ -> next_指向空结点,避免上面的死循环
tmp -> next_ = 0;//如果省去这句,测试函数不能停止
tangshuiling 2008-10-29
  • 打赏
  • 举报
回复
mark!
lin_style 2008-10-29
  • 打赏
  • 举报
回复
先保存,明晚上来看看。
lily604 2008-10-29
  • 打赏
  • 举报
回复
这是为什么呢 等高手
lin_style 2008-10-29
  • 打赏
  • 举报
回复
有人跟踪下
不同环境下delete后,相应指针的变化吗?
tomerse 2008-10-29
  • 打赏
  • 举报
回复
高深问题..
不懂..哪位高手可以拉我一把
帅得不敢出门 2008-10-29
  • 打赏
  • 举报
回复
up
e_sharp 2008-10-29
  • 打赏
  • 举报
回复
UP
fallening 2008-10-29
  • 打赏
  • 举报
回复
分不多的原因么?
再加100好了
qkhhxkj102 2008-10-29
  • 打赏
  • 举报
回复
模板学的不好,帮不了你了
hngsc_0 2008-10-29
  • 打赏
  • 举报
回复
诡异~
编译器相关?
xmczr 2008-10-29
  • 打赏
  • 举报
回复
我咋能成功呢?用的是dev
加载更多回复(10)

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧