#include <iostream> using namespace std; //#define DEBUG 1 #ifdef DEBUG #include <cstdio> int III = 0, iii; #define FUN_IN for(iii = 0; iii < III; ++iii) \ printf("\t"); \ ++III; \ printf("[%s(): %d] INTO!!!\n", __func__, __LINE__); #define FUN_OUT --III; \ for(iii = 0; iii < III; ++iii) \ printf("\t"); \ printf("[%s(): %d] OUT &&&\n", __func__, __LINE__); #else #define FUN_IN #define FUN_OUT #endif #define print() cout << __LINE__ << ": " << __func__ << endl class list { public: //必需的 list(); list(const unsigned int count); list(const unsigned int count, char c); list(list &mylist); //list(const list &mylist); list& operator=(list &mylist); //list& operator=(const list &mylist); // list& operator=(list *tmp); //c = a + b; or c = a - b; ~list(); public: //非变动性重载 operator char() const {return c;} //cout << l1 << endl; void operator()(const char *s = " ") {cout << s << ": "; output();} // eg: l1(); bool operator==(list &rlist); //比较是长度和内容是否相同 bool operator!=(list &rlist) {return !(operator==(rlist));} bool operator>(list &mylist) {if(lenght() > mylist.lenght())return true; else return false;} //比较长度 bool operator>=(list &mylist) {if(lenght() >= mylist.lenght())return true; else return false;} bool operator<(list &mylist) {return !(operator>=(mylist));} bool operator<=(list &mylist) {return !(operator>(mylist));} //变动性重载 list& operator+(); //从小到大排列 list& operator-(); //从大到小排列 list& operator!(); //反序 eg: l1:abcdefg -> !l1:gfedcba list& operator-(list &rlist); //c = a - b;a,b不变 c 为 a - b 的效果 list& operator-=(list &rlist); //rlist不变,去掉*this里有list元素的节点 list& operator+(list &rlist); //a:123 b:abc c = a + b; c:123abc, a,b不变 // list* operator+(list &rlist); //a:123 b:abc c = a + b; c:123abc, a,b不变 list& operator+=(list &rlist); //a:123 b:abc a+=b; a:123abc, b不变 list& operator*(); //去掉重复节点 eg:l1:112332 -> l1:123 list& operator~(); //对称轴 eg: l1:abcde -> ~l1:abcdeedcba char& operator[](unsigned int index); //随机访问 eg: list1[i] = c; a = list1[i]; list& operator<<(char c) {last_insert(c); return *this;} //尾插 >> head->tail << list& operator>>(char c) {first_insert(c); return *this;} //头插 eg: l1 >> 'a' >> 'b' << 'c'; -> bac list& operator<<=(unsigned int i); //向右滚动 eg: l1 <<= 3; abcdef -> defabc list& operator>>=(unsigned int i); //向左滚动 eg: l1 >>= 2; defabc -> bcdefa public: //list非变动性操作 list& output(); list& output(list *p); list& self(); list* find(char c); bool empty(); unsigned int lenght(); list* begin() {return next;} list* end() {return front;} public: //list变动性操作 list& clean(); list& swap(list &rlist); //头交换 eg:l1:123 l2:abc -> l1:abc l2:123 list* insert(list *p, char c); list* insert(list *p, int n, char c); list& first_insert(char c); list& first_insert(int n, char c); list& last_insert(char c); list& last_insert(int n, char c); list* modify(char c = '?'); list* modify(list *p, char c); list* modify(list *begin, list *end, char c); list* remove(); list* remove(list *p); list* remove(list *begin, list *end); list* remove(char c); list* remove(list *begin, list *end, char c); public: //stack list top() {if(empty()){cout << "empty" << endl;return *this;}else return *front;} list& push(char c) {last_insert(c); return *this;} list& pop() {remove(front); return *this;} public: //queue list head() {if(empty()){cout << "empty" << endl;return *this;}else return *front;} list tail() {if(empty()){cout << "empty" << endl;return *this;}else return *next;} list& head_into(char c) {push(c); return *this;} list& head_out() {pop(); return *this;} list& tail_into(char c){first_insert(c); return *this;} list& tail_out(){remove(next); return *this;} private: void insert(char c = '?'); private: char c; list *front; list *next; }; /* list& list::operator=(list *tmp) { clean(); if(tmp == NULL) return *this; next = tmp->next; list *find_front; for(find_front = next; find_front != NULL; find_front = find_front->next) ; front = find_front; return *this; } */ list& list::operator+() { if(lenght() <= 1) return *this; list tmplist; int len = lenght(); for(int i = 0; i != len; ++i) { list *mp = next; for(list *tmp = next; tmp != this; tmp = tmp->next) { if(mp->c > tmp->c) mp = tmp; } tmplist.last_insert(mp->c); remove(mp); } next = tmplist.next; front = tmplist.front; tmplist.next->front = this; tmplist.front->next = this; return *this; } /* list& list::operator+() { if(lenght() <= 1) return *this; list *tmp = next; next = NULL; front = NULL; for(; tmp != this; ) { cout << *tmp << endl; list *mp = tmp; for(list *p = tmp->next; p != this; p = p->next)//找出最小的节点 { if(mp->c > p->c) mp = p; } cout << "min:" <<*mp << endl; //取出节点 if(mp->next == this && mp->front == this) { // tmp = tmp->next; cout << "IF 1" << endl; } else if(mp->next != this && mp->front == this) { // tmp = tmp->next; cout << "IF 2" << endl; } else if(mp->next == this && mp->front != this) { list *tp = tmp; // tmp = tmp->next; tp->front->next = this; cout << "IF 3" << endl; } else { // tmp = tmp->next; mp->front->next = mp->next; mp->next->front = mp->front; cout << "IF 4" << endl; } cout << "take:" <<*mp << endl; cout << "lenght:" << lenght() << endl; //尾插 if(lenght() == 0) { cout << "NULL" << endl; next = mp; front = mp; mp->next = this; mp->front = this; } else { cout << "NO NULL" << endl; next = mp; front->next = mp; mp->front = front; front = mp; mp->next = this; } } return *this; } */ list& list::operator-() { if(lenght() <= 1) return *this; +*this; !*this; return *this; } list& list::operator!() { if(lenght() <= 1) return *this; list *p = next; for(list *tmp = front; tmp != p; ) { list *mp = tmp; tmp = tmp->front; //insert(mp); mp->front = p->front; mp->front->next = mp; mp->next = p; p->front = mp; } front = p; p->next = this; return *this; } //* 警告很烦,暂时去掉 list& list::operator-(list &rlist) { list tlist(*this); if(lenght() == 0 || rlist.lenght() == 0) return *this; for(list *rp = rlist.next; rp != &rlist; rp = rp->next) for(list *tmp = tlist.next; tmp != &tlist; ) if(tmp->c == rp->c) { list *rtmp = tmp; tmp = tmp->next; remove(rtmp); } else tmp = tmp->next; return tlist; } list& list::operator-=(list &rlist) { if(lenght() == 0 || rlist.lenght() == 0) return *this; for(list *rp = rlist.next; rp != &rlist; rp = rp->next) for(list *tmp = next; tmp != this; ) if(tmp->c == rp->c) { list *rtmp = tmp; tmp = tmp->next; remove(rtmp); } else tmp = tmp->next; return *this; } list& list::operator*() { if(lenght() == 0) return *this; for(list *tmp = next; tmp != this; tmp = tmp->next) for(list *rp = tmp->next; rp != this; ) if(tmp->c == rp->c) { list *r = rp; rp = rp->next; remove(r); } else rp = rp->next; } //* 警告很烦,暂时去掉 list& list::operator+(list &rlist) { list llist(*this); if(rlist.lenght() == 0) return llist; list tlist(rlist); if(lenght() == 0) { llist.front = tlist.front; llist.front->next = &llist; llist.next = tlist.next; llist.next->front = &llist; return llist; } llist.front->next = tlist.next; tlist.next->front = llist.front; llist.front = tlist.front; llist.front->next = &llist; return llist; } /* list* list::operator+(list &rlist) { list llist(*this); if(rlist.lenght() == 0) { if(lenght() == 0) { return NULL; } else { llist.front->next = NULL; return llist.next; } } list tlist(rlist); if(lenght() == 0) { llist.front = tlist.front; llist.front->next = &llist; llist.next = tlist.next; llist.next->front = &llist; llist.front->next = NULL; //为最后一个节点做记号 return llist.next; } llist.front->next = tlist.next; tlist.next->front = llist.front; llist.front = tlist.front; llist.front->next = &llist; llist.front->next = NULL; //为最后一个节点做记号 return llist.next; } */ list& list::operator+=(list &rlist) { if(rlist.lenght() == 0) return *this; list tlist(rlist); if(lenght() == 0) { front = tlist.front; front->next = this; next = tlist.next; next->front = this; return *this; } front->next = tlist.next; tlist.next->front = front; front = tlist.front; front->next = this; return *this; } list& list::operator<<=(unsigned int i) { if(lenght() == 0) return *this; unsigned int c = i % lenght(); if(c == 0) return *this; list *tmp = front; next->front = front; front->next = next; for(int k = 1; k != c; ++k) tmp = tmp->front; tmp->front->next = this; front = tmp->front; next = tmp; tmp->front = this; return *this; } list& list::operator>>=(unsigned int i) { if(lenght() == 0) return *this; unsigned int c = i % lenght(); if(c == 0) return *this; list *tmp = next; next->front = front; front->next = next; for(int k = 0; k != c; ++k) tmp = tmp->next; tmp->front->next = this; front = tmp->front; next = tmp; tmp->front = this; return *this; } bool list::operator==(list &rlist) { if(lenght() != rlist.lenght()) return false; if(lenght() == 0 && rlist.lenght() == 0) return true; else { for(list *pn = next, *rpn = rlist.next; pn != this && rpn != &rlist; pn = pn->next, rpn = rpn->next) if(pn->c != rpn->c) return false; return true; } } list& list::operator~() { if(lenght() != 0) for(list *tmp = front; tmp != this; tmp = tmp->front) insert(this, tmp->c); return *this; } list& list::swap(list &rlist) { if(lenght() == 0 && rlist.lenght() == 0) return *this; else if(lenght() != 0 && rlist.lenght() == 0) { rlist.next = next; rlist.next->front = &rlist; rlist.front = front; rlist.front->next = &rlist; next = NULL; front = NULL; return *this; } else if(lenght() == 0 && rlist.lenght() != 0) { next = rlist.next; next->front = this; front = rlist.front; front->next = this; rlist.next = NULL; rlist.front = NULL; return *this; } else { list *pn = next, *pf = front; next = rlist.next; next->front = this; front = rlist.front; front->next = this; rlist.next = pn; pn->front = &rlist; rlist.front = pf; pf->next = &rlist; return *this; } } char& list::operator[](unsigned int index) { if(index >= lenght()) return c; else { list *tmp = next; for(int i = 0; (tmp != this)&&(i != index); ++i) tmp = tmp->next; return tmp->c; } } //list& list::operator=(const list &mylist) //又是这个错误 //list.cpp: In member function ‘list& list::operator=(const list&)’: //list.cpp:99:19: error: passing ‘const list’ as ‘this’ argument of ‘unsigned int list::lenght()’ discards qualifiers list& list::operator=(list &mylist) { cout << "operator=" << endl; if(!empty()) clean(); if(mylist.lenght() == 0) { return *this; } else { list *my = mylist.next; list *tmp = new list; front = tmp; next = tmp; tmp->c = my->c; tmp->front = this; tmp->next = this; my = my->next; for( ; my != &mylist; my = my->next) { tmp = new list; tmp->c = my->c; tmp->next = this; tmp->front = front; front->next = tmp; front = tmp; } return *this; } } list* list::remove(char c) { remove(next, this, c); return this; } list* list::remove(list *begin, list *end, char c) { for(list *tmp = begin; tmp != end && !empty(); tmp = tmp->next) if(tmp->c == c) remove(tmp); return end; } list* list::remove() { remove(next, this); return this; } list* list::remove(list *begin, list *end) { for(list *tmp = begin; tmp != end && !empty(); tmp = tmp->next) remove(tmp); return end; } list* list::remove(list *p) { if(empty()) { cout << "empty" << endl; return this; } else if(p == this) { cout << "It's head" << endl; return this; } else { list *tmp = p; p = p->next; tmp->front->next = tmp->next; tmp->next->front = tmp->front; delete tmp; return p; } } list* list::modify(char c) { modify(next, this, c); return this; } list* list::modify(list *begin, list *end, char c) { for(list *tmp = begin; tmp != end; tmp = tmp->next) modify(tmp, c); // if(tmp != this) // tmp->c = c; return end; } list* list::modify(list *p, char c) { //*p = c;//重载了char() if(p != this) p->c = c; else cout << "It's head" << endl; return p; } void list::insert(char c) { list *tmp = new list; tmp->c = c; next = tmp; front = tmp; tmp->next = this; tmp->front = this; } list& list::first_insert(int n, char c) { for(int i = 0; i != n; ++i) first_insert(c); return *this; } list& list::first_insert(char c) { if(empty()) { insert(c); /* list *tmp = new list; tmp->c = c; next = tmp; front = tmp; tmp->next = this; tmp->front = this; */ } else insert(next, c); return *this; } list& list::last_insert(int n, char c) { for(int i = 0; i != n; ++i) last_insert(c); return *this; } list& list::last_insert(char c) { if(empty()) { insert(c); /* list *tmp = new list; tmp->c = c; next = tmp; front = tmp; tmp->next = this; tmp->front = this; */ } else { /* tmp->c = c; front->next = tmp; tmp->front = front; front = tmp; tmp->next = this; */ insert(this, c); } return *this; } list* list::insert(list *p, int n, char c) { if(empty()) { insert(c); insert(begin(), n-1, c); p = end(); } else { for(int i = 0; i != n; ++i) { insert(p, c); } } return p; } list* list::insert(list *p, char c) { if(empty()) { insert(c); /* list *tmp = new list; tmp->c = c; next = tmp; front = tmp; tmp->next = this; tmp->front = this; */ } else { list *tmp = new list; tmp->c = c; p->front->next = tmp; tmp->front = p->front; tmp->next = p; p->front = tmp; } return p; } unsigned int list::lenght() { if(empty()) return 0; else { unsigned int i = 0; for(list *tmp = next; tmp != this; tmp = tmp->next) ++i; return i; } } bool list::empty() { if(front == NULL && next == NULL) //if((next != NULL && front !=NULL) && (next != this && front != this)) return true; else return false; } list* list::find(char c) { for(list *tmp = next; tmp != this; tmp = tmp->next) if(tmp->c == c) return tmp; cout << "no have, return this" << endl; return this; } list& list::clean() { FUN_IN; if(front != NULL && next != NULL) { if(next != NULL && front != NULL) { for(list *tmp_next, *tmp = next; tmp != front; tmp = tmp_next) { tmp_next = tmp->next; delete tmp; } delete front; } front = NULL; next = NULL; cout << "clean" << endl; } else cout << "only head" << endl; FUN_OUT return *this; } list& list::self() { FUN_IN; /* cout << "c = " << c << endl << "front = " << front << endl << "next = " << next << endl; */ output(this); FUN_OUT; return *this; } list& list::output(list *p) { FUN_IN; cout << "c = " << p->c << endl << "front = " << p->front << endl << "next = " << p->next << endl; FUN_OUT; return *this; } list& list::output() { FUN_IN; if((next != NULL && front !=NULL) && (next != this && front != this)) for(list *tmp = next; tmp != this; tmp = tmp->next) cout << tmp->c << " "; // cout << *tmp << " ";//重载了char() else cout << "only head, output:empty"; cout << endl; FUN_OUT; return *this; } list::list() : c('Z'), next(NULL), front(NULL) { FUN_IN; /* c = 'Z'; next = NULL; front = NULL; */ FUN_OUT; } //list::list(const list &mylist) : c('Z'), next(NULL), front(NULL) //按道理可以这样写的,怎么会报错~ //list.cpp: In copy constructor ‘list::list(const list&)’: //list.cpp:400:41: error: passing ‘const list’ as ‘this’ argument of ‘unsigned int list::lenght()’ discards qualifiers list::list(list &mylist) : c('Z'), next(NULL), front(NULL) { if(mylist.lenght() == 0) { return; } else { list *my = mylist.next; list *tmp = new list; front = tmp; next = tmp; tmp->c = my->c; tmp->front = this; tmp->next = this; my = my->next; for( ; my != &mylist; my = my->next) { tmp = new list; tmp->c = my->c; tmp->next = this; tmp->front = front; front->next = tmp; front = tmp; } } } list::list(const unsigned int count, char c) : c('Z'), next(NULL), front(NULL) { FUN_IN; //list(); //在拷贝构造函数中调用的构造函数, 在此处调用构造函数的效果是产生一个临时对象紧接着又释放了. //因此被返回的临时对象没有被初始化. 所以结果是一个随机值,等于没构造. /* this->c = 'Z'; next = NULL; front = NULL; */ if(count == 0) ; else { list *tmp = new list; front = tmp; next = tmp; tmp->c = c; tmp->front = this; tmp->next = this; for(unsigned int j = 1; j != count; ++j) { tmp = new list; tmp->c = c; tmp->next = this; tmp->front = front; front->next = tmp; front = tmp; } } FUN_OUT; } //list::list(const unsigned int count) : list() //在构造函数初始化列表调用构造函数 //error: type ‘list’ is not a direct base of ‘list’ list::list(const unsigned int count) : c('Z'), next(NULL), front(NULL) { FUN_IN; //list(); //在拷贝构造函数中调用的构造函数, 在此处调用构造函数的效果是产生一个临时对象紧接着又释放了. //因此被返回的临时对象没有被初始化. 所以结果是一个随机值,等于没构造. /* c = 'Z'; next = NULL; front = NULL; */ if(count == 0) ; else { int number = '0'; list *tmp = new list; front = tmp; next = tmp; tmp->c = number++; tmp->front = this; tmp->next = this; for(unsigned int j = 1; j != count; ++j) { tmp = new list; tmp->c = number++; tmp->next = this; tmp->front = front; front->next = tmp; front = tmp; } } FUN_OUT; } list::~list() { FUN_IN; /* if(next == NULL) return; if(next == this) return; cout << "---into---" << endl; for(list *tmp_next, *tmp = next; tmp != this; tmp = tmp_next) { cout << "---for---" << endl; tmp_next = tmp->next; delete tmp; //每次delete的时候又调用了~list析构函数,死循环 cout << "---end for---" << endl; } cout << "---out---" << endl; front = NULL; next = NULL; cout << "clean" << endl; */ /* if(front == NULL) return; if(front == this) return; cout << "---1" << endl; pop(); // delete front; cout << "---2" << endl; */ FUN_OUT; } //-----------------------------------测试代码------------------------------------- /* int main() { FUN_IN; list mylist(10); mylist.self().output().clean().self().output(); list mylist2; mylist2.self().output(); list mylist3(10); mylist3.self().output(); mylist3.output(mylist3.find('6')); mylist3.output(mylist3.find('P')); mylist3.output(mylist3.find('q')); cout << "-------------------------------" << endl; list list1; cout << list1.empty() << endl; cout << list1.lenght() << endl; list list2(10), list3(20), list4(1); cout << list2.empty() << endl; cout << list2.lenght() << endl; cout << list3.empty() << endl; cout << list3.lenght() << endl; cout << list4.empty() << endl; cout << list4.lenght() << endl; cout << "-------------------------------" << endl; list list5; list5.insert(NULL, 'A'); list5.insert(list5.find('A'), 'B'); list5.insert(list5.find('A'), 'C'); list5.insert(list5.find('C'), 'D'); list5.output(); cout << "-------------------------------" << endl; list list6, list7; list6.first_insert('A').first_insert('B').first_insert('C').output(); list7.last_insert('X').last_insert('Y').last_insert('Z').output(); list6.insert(list6.find('B'), 10, '1'); list6.insert(list6.begin(), 10, '2'); list6.insert(list6.end(), 10, '3'); list6.output(); cout << "-------------------------------" << endl; list list8; list8.insert(NULL, 10, 'C'); list8.output(); list8.insert(list8.end(), 5, 'D'); list8.output().clean().output(); list list9; list9.first_insert(1, 'A'); list9.first_insert(10, 'C'); list9.first_insert(10, 'D'); list9.last_insert(0, '1'); list9.last_insert(5, '5'); list9.output(); list list10; list10.last_insert(10, '0').first_insert(3, '3').last_insert(5, '1'); list10.output(); cout << "-------------------------------" << endl; list my(10, 'c'); my.output(); cout << my.lenght() << endl; list you(5, '5'); you.output(); cout << you.lenght() << endl; cout << my << endl; cout << *my.begin() << endl; cout << "-------------------------------" << endl; list my1(10); my1.modify(my1.find('3'), my1.find('1'), 'A'); my1(); cout << my1 << endl; my1.self(); my1.modify(); my1(); cout << my1 << endl; my1.self(); cout << "-------------------------------" << endl; list haha(10); haha(); haha.remove(haha.find('0')); haha(); haha.remove(haha.find('8')); haha(); haha.remove(haha.find('Z')); haha(); haha.self(); cout << "-------------------------------" << endl; list ok(80), no; ok(); //ok.remove(ok.find('B'), ok.find('Z')); ok(); ok.remove(ok.find('n'), ok.find('3')); ok(); ok.remove(); // ok.first_insert('U'); ok.self(); cout << "ok()====" << endl; ok(); cout << "----no----" << endl; no(); no.remove(); no(); cout << "-------------------------------" << endl; list len(10); len(); len.modify(len.find('8'), len.find('3'), '1'); len(); //len.remove(len.begin(), len.end(), '1'); len.remove('1'); len(); len.self(); list l1, l2(10, 'a'), l3(20); l1.self().output(); l2.self().output(); l3.self().output(); cout << "-----stack------" << endl; list stack; stack(); stack.pop(); cout << "--1--" << endl; cout << stack.push('1').push('2').push('3').pop().top() << endl; stack(); cout << "--2--" << endl; stack.push(4).pop().pop().pop(); stack(); cout << "--3--" << endl; stack.pop(); stack(); cout << "-----queue------" << endl; list queue; cout << queue.head() << endl; cout << queue.tail() << endl; queue.head_into('1').head_into('2').head_into('3'); queue(); cout << queue.head() << endl; cout << queue.tail() << endl; cout << "--1--" << endl; queue.head_out(); queue(); cout << queue.head() << endl; cout << queue.tail() << endl; cout << "--2--" << endl; queue.tail_into('a').tail_into('b'); queue(); cout << queue.head() << endl; cout << queue.tail() << endl; cout << "--3--" << endl; queue.tail_out().tail_out().tail_out(); queue(); cout << queue.head() << endl; cout << queue.tail() << endl; cout << "--4--" << endl; queue.tail_out().tail_out().tail_out(); queue(); cout << queue.head() << endl; cout << queue.tail() << endl; list l1; list l2; l2= l1; l1("l1"); l2("l2"); list l3(10); l1 = l3; l1("l1"); l1 = l2; l1("l1"); list l5(50); l1 = l5; l1(); list l1, l2; if(l1 > l2) cout << "wrong1" << endl; if(l1 < l2) cout << "wrong2" << endl; if(l1 >= l2) cout << "true" << endl; if(l1 <= l2) cout << "true" << endl; list l1(10), l2; if(l1 > l2) cout << "true1" << endl; if(l1 < l2) cout << "wrong2" << endl; if(l1 >= l2) cout << "true3" << endl; if(l1 <= l2) cout << "wrong4" << endl; list l1(100), l2(20, 'c'); for(unsigned int i = 0; i < l1.lenght(); ++i) cout << l1[i] << ' '; cout << endl; cout << l1[-1] << endl; cout << l1[999] << endl; cout << l1[l1.lenght()] << endl; for(unsigned int i = 0; i < l2.lenght(); ++i) cout << l2[i] << ' '; cout << endl; cout << l2[-1] << endl; cout << l2[999] << endl; cout << l2[l2.lenght()] << endl; char c = 'k'; for(unsigned int i = 0; i < l2.lenght(); ++i) l2[i] = c++; for(unsigned int i = 0; i < l2.lenght(); ++i) cout << l2[i] << ' '; cout << endl; cout << l2[-1] << endl; cout << l2[999] << endl; cout << l2[l2.lenght()] << endl; list l1(10); // l1 << "l1" << "cao" >> 'A' >> 'B' << "ok"; l1 << 'A' << 'B' >> 'C' >> 'D'; l1(); list l1; cout << l1 << endl; list l1(10); l1(); FUN_OUT; } */ list* fun() { list l1(10); cout << "1" << endl; list *p = l1.begin(); p->self(); cout << "2" << endl; return p; } void test() { list *p = fun(); cout << "3" << endl; p->self(); (*p)("*p"); cout << "4" << endl; } void test_swap() { list l1,l2; l1("l1"); l2("l2"); l1.swap(l2); l1("l1"); l2("l2"); cout << endl; list l3,l4(10); l3("l3"); l4("l4"); l3.swap(l4); l3("l3"); l4("l4"); cout << endl; list l5(10),l6; l5("l5"); l6("l6"); l5.swap(l6); l5("l5"); l6("l6"); cout << endl; list l7(20, 'c'),l8(10); l7("l7"); l8("l8"); l7.swap(l8); l7("l7"); l8("l8"); l7.swap(l8); l7("l7"); l8("l8"); l7.swap(l8); l7("l7"); l8("l8"); } void test2() { list l1, l2(3); l1("l1"); l2("l2"); cout << endl; ~l1; ~l2; l1("l1"); l2("l2"); cout << endl; ~l1; ~l2; l1("l1"); l2("l2"); cout << endl; ~l1; ~l2; l1("l1"); l2("l2"); cout << endl; (~l1)("l1"); (~l1).output(); } void test3() { list l1,l2; cout << (l1 == l2) << endl;//1 list l11(10),l21; cout << (l11 == l21) << endl;//0 list l12(10),l22(10, 'c'); cout << (l12 == l22) << endl;//0 list l13(10),l23(10); cout << (l13 == l23) << endl;//1 l13.push('c'); l23.push('c'); cout << (l13 == l23) << endl;//1 l13.push('a'); l23.push('b'); cout << (l13 == l23) << endl;//0 } void test4() { list l1,l2; cout << (l1 != l2) << endl;//0 list l11(10),l21; cout << (l11 != l21) << endl;//1 list l12(10),l22(10, 'c'); cout << (l12 != l22) << endl;//1 list l13(10),l23(10); cout << (l13 != l23) << endl;//0 l13.push('c'); l23.push('c'); cout << (l13 != l23) << endl;//0 l13.push('a'); l23.push('b'); cout << (l13 != l23) << endl;//1 } void test5() { list l2; l2 >>= 2; l2("l2"); list l1(10); l1("l1"); l1 >>= 0; l1("l1"); l1 >>= 10; l1("l1"); l1 >>= 1; l1("l1"); l1 >>= 7; l1("l1"); l1 >>= 3; l1("l1"); l1 >>= 26; l1("l1"); } void test6() { list l2; l2 <<= 2; l2("l2"); list l1(10); l1("l1"); l1 <<= 0; l1("l1"); l1 <<= 10; l1("l1"); l1 <<= 4; l1("l1"); l1 <<= 5; l1("l1"); l1 <<= 1; l1("l1"); l1 <<= 16; l1("l1"); } void test7() { list l1(5, 'c'); list l2(3); l1("l1"); for(int i = 0; i < 5; ++i) { l1 += l2; l1("l1"); } list l3; for(int i = 0; i < 5; ++i) { l3 += l2; l3("l3"); } list l5; list l4; for(int i = 0; i < 5; ++i) { l5 += l4; l5("l5"); } list l6(5); list l7; for(int i = 0; i < 5; ++i) { l6 += l7; l6("l6"); } } void test8() { list l1,l2,l3; l3 = l1 + l2; l3("l3"); list l4, l5(5, 'c'), l6(10), l7(10, 'a'); //l4 = l5 + l6 + l7;//跟设想的不一样 l4 = l5 + l6; l4 = l4 + l7; l4("l4"); l5("l5"); l6("l6"); l7("l7"); } void test9() { list l1(10); l1("l1"); list *p = l1.find('5'); cout << *p << endl; p = ++p; cout << *p << endl; } void test10() { list l0; list l1(10, 'c'); list l2(10); l0("l0"); *l0; l0("l0"); l1("l1"); *l1; l1("l1"); (~l2)("l2"); (~l2).output(); *l2; l2("l2"); } void test11() { list l1, l2; list l3(10); ~(~l3); list l4(5); l1("l1"); l2("l2"); l3("l3"); l4("l4"); l1 -= l2; l3 -= l1; l1 -= l3; l1("l1"); l2("l2"); l3("l3"); l3 -= l4; l3("l3"); } /* void test12() { list l1(10), l2(5), l3(10, 'c'); ~~l1; l1("l1"); l2("l2"); l3("l3"); l3 = l1 - l2; l1("l1"); l2("l2"); l3("l3"); list l33(10), l31(3), l32; l32.push('7'); l31("l31"); l32("l32"); l33("l33"); // l1 = l33 - l31 - l32;//跟设想的不一样 l1("l1"); } */ void test13() { list l1(30); l1("l1"); !l1; l1("l1"); !l1; l1("l1"); !!l1; l1("l1"); } void test14() { list l1(10); (!l1)("l1"); (~l1)("l1"); cout << "+++++++++++" << endl; +l1; cout << "+++++++++++" << endl; l1("l1"); (-l1)("l1"); list l3(1), l2; (+l3)("l3"); (-l3)("l3"); (+l2)("l2"); (-l2)("l2"); } int main() { // test(); // cout << "5" << endl; //test_swap(); // test2(); // test3(); // test4(); // test5(); // test6(); // test7(); //test8(); //test9(); //test10(); //test11(); //test12(); //test13(); //test14(); }