65,210
社区成员
发帖
与我相关
我的任务
分享#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
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;
}
#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;
}
tmp -> next_ = 0;
//囧,道长的问题在于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;
}
}
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_;
}
}
}