免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1863 | 回复: 4
打印 上一主题 下一主题

单链表一问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-29 22:17 |只看该作者 |倒序浏览
代码如下:
$ cat slist.h
#ifndef _SLIST_H_INCLUDED
#define _SLIST_H_INCLUDED
template< typename T >
class Slist
{
&nbsp;&nbsp;&nbsp;&nbsp;public:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Slist() : head_(0){};
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~Slist();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void reverse();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T front() const;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void push_front( const T& );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const T pop_front();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;private:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct Node;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node* head_;
};


#include "slist.tcc"

#endif



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

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

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

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

&nbsp;&nbsp;&nbsp;&nbsp;if ( head_ )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans = head_ -> data_;

&nbsp;&nbsp;&nbsp;&nbsp;return ans;
}

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

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

&nbsp;&nbsp;&nbsp;&nbsp;if ( head_ )
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans = head_ -> data_;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node* tmp = head_;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;head_ = head_ -> next_;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//whYYYYYYYYYYYYYYYYYYYYYYYY?

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp -> next_ = 0;//如果省去这句,测试函数不能停止

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete tmp;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;return ans;
}




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

#include <iostream>
using namespace std;

int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;Slist<int> s;

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

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

&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}



哪位可以解释一下为什么
pop_front中


tmp -> next_ = 0;



是必须的?

论坛徽章:
0
2 [报告]
发表于 2008-10-29 22:19 |只看该作者
如果注释掉这一句,我用gcc和icc编译出来的程序,均不能运行到底。

论坛徽章:
0
3 [报告]
发表于 2008-10-29 22:29 |只看该作者
不需要吧

论坛徽章:
0
4 [报告]
发表于 2012-05-11 23:34 |只看该作者
借着自己之前的帖子问一下,怎样把原先的 id 拿回来?
现在登录系统强行要求后边加 _cu 这个尾巴

论坛徽章:
0
5 [报告]
发表于 2012-05-12 00:16 |只看该作者
这个看不懂,还得好好学习啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP