64,637
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <string>
using namespace std;
//Exercise Write the member function definitions of the List class that you defined for the exercises in
//16.34: Section 16.1.2 (p. 628).
//编写第 16.1.2 节习题中定义的List 类的成员函数定义。
template<class T>class List;
template<class IO> std::ostream& operator<< (std::ostream&,const List<IO>&);
template<class T>class ListItem {
friend class List<T>;
friend ostream& operator<< <T> (ostream&, const List<T>&);
ListItem(const T &t):item(t),next(0) { }
T item;
ListItem *next;
};
template <class T>
class List {
friend ostream& operator<< <T> (ostream&, const List<T>&);
public:
List():front(0),end(0) { }
//增加一对迭代器的构造函数
template<class It> List(It beg,It end):front(0),end(0) { copy_elem(beg,end); }
List(const List &L):front(0),end(0) { copy_elems(L); }
List& operator=(const List&);
~List() { destroy(); }
void insert(ListItem<T> *ptr,const T& value);
void del(ListItem<T> *ptr);
ListItem<T>* find(const T& value);
ListItem<T>* first() { return front;}
ListItem<T>* last() { return end;}
T& getElem(ListItem<T> *ptr);
bool empty() const{ return front == 0; }
//新增成员模板assign成员
template <class Iter> void assign(Iter , Iter);
private:
ListItem<T> *front,*end;
void destroy();
//copy_elems
void copy_elems(const List<T>& orig);
//重写copy_elem
template <class Iter> void copy_elem(Iter , Iter);
};
template <class T>
List<T>& List<T>::operator= (const List& orig)
{
front = end =0;
copy_elems(orig);
return *this;
}
template <class T>
void List<T>::insert(ListItem<T>* ptr , const T& value)
{
ListItem<T> *pt = new ListItem<T>(value);
if( empty() )
front = pt ;
else {
pt -> next = ptr -> next ;
ptr -> next = pt ;
}
if( ptr == end )
end = pt ;
}
template <class T>
void List<T>::del(ListItem<T> *ptr)
{
ListItem<T>*p = front;
while(p!= ptr && p!=0 && p->next != ptr) //获取ptr所指元素的前一元素的指针p
p = p -> next;
if( p != 0 ) {
if (p == ptr) {
front = ptr -> next;
}
else {
p ->next =ptr ->next;
}
if(ptr == end)
end = p -> next;
delete ptr;
}
else
throw out_of_range("no such element");
}
template <class T>
ListItem<T>* List<T>::find(const T& value)
{
ListItem<T> *pt = front;
while(pt && pt->item!=value)
pt = pt->next;
cout<< "find the element is : " << pt->item << endl;
return pt;
}
template <class T>
T& List<T>::getElem(ListItem<T> *ptr)
{
if(!empty())
return ptr->item;
return -1;
}
template <class T>
void List<T>::destroy()
{
while(! empty())
del(front);
}
template <class T>
void List<T>::copy_elems(const List<T>& orig)
{
for(ListItem<T>*pt = orig.front; pt; pt = pt->next)
insert(end,pt->item);
}
//重写copy_elems的定义
template <class T> template <class Iter>
void List<T>::copy_elem(Iter first, Iter last)
{
while (first != last){
insert(end,first -> item);
first = first -> next;
}
insert(end,first->item);
}
//新增成员模板assign成员的定义
template<class T> template <class Iter>
void List<T>::assign(Iter bg, Iter ed)
{
destroy();
copy_elem(bg,ed);
}
//输出操作符定义
template<class IO>
ostream& operator<< (ostream& os, const List<IO>&L)
{
os << "< ";
for(ListItem<IO> *p = L.front; p; p=p->next)
os<< p->item << " ";
os << ">";
return os;
}
int main()
{
List<int> mlist,ulist;
cout<< "1"<<endl;
ListItem<int> *p = mlist.first();
cout<< "2"<<endl;
for( int i = 0 ; i!=5; ++i){
cout<< "3"<<endl;
mlist.insert(mlist.first(),i);
}
ulist = mlist;
cout<< "4"<<endl;
ulist.find(3);
cout<< "5"<<endl;
cout << mlist <<endl;
cout << ulist <<endl;
cout <<"---------new-function-test----------"<<endl;
int ai[] = {1,2,3,4,5};
List<int> qi(ai,ai+5);
cout<< "6"<<endl;
qi.find(2);
cout<< "7"<<endl;
cout << qi <<endl;
return 0 ;
}
int ai[] = {1,2,3,4,5};
List<int> qi(ai,ai+5);
template<class It> List(It beg,It end):front(0),end(0) { copy_elem(beg,end); }
template <class T> template <class Iter>
void List<T>::copy_elem(Iter first, Iter last)
{
while (first != last){
insert(end,first -> item);
first = first -> next;
}
insert(end,first->item);
}