第8章 list双向链表容器
/* 第8章 list双向链表容器 8.1 list技术原理 8.2 list应用基础 8.3 本章小结 */ //第8章 list双向链表容器 // 8.1 list技术原理 ----------------------------------------------------------------------------------------- // 8.2 list应用基础 ----------------------------------------------------------------------------------------- // 125 #include <list> #include <iostream> struct student { char *name; int age; char *city; char *tel; }; int main(void) { student s[] = { {"符符", 18, "北京市", "67111111"}, {"介介", 30, "上海市", "33939393"}, {"贝贝", 23, "深圳市", "88883333"} }; using namespace std; list < student > l; l.push_back(s[0]); l.push_back(s[1]); l.push_back(s[2]); list < student > ::iterator i, iend; iend = l.end(); cout << "姓名 年龄 城市 电话" << endl; cout << "----------------------------------" << endl; for(i = l.begin(); i != iend; i++) { cout << (*i).name << " "; cout << (*i).age << " "; cout << (*i).city << " "; cout << (*i).tel << " " << endl; } cout << "----------------------------------" << endl << endl; return 0; } //126, push_front, insert #include <list> #include <iostream> int main(void) { using namespace std; list < int > l; l.push_back(6); l.push_back(8); l.push_back(9); //插入链表元素 list < int > ::iterator i, iend; i = l.begin(); // l.begin()+1,这样不可以 i++; // 自增,找下一个节点 l.insert(i, 7); l.push_front(5); //打印链表元素 iend = l.end(); for(i = l.begin(); i != iend; i++) cout << *i << ' '; return 0; } // 127, pop, erase #include <list> #include <iostream> int main(void) { using namespace std; list < int > l; l.push_back(5); l.push_back(6); l.push_back(7); l.push_back(8); l.push_back(9); l.push_back(9); l.push_back(9); l.push_back(10); //删除元素,剩下7、8 list < int > ::iterator i, iend; i = l.begin(); i++; l.erase(i); // 6 l.pop_back(); // 10 l.pop_front(); // 5 l.remove(9); // 9... //打印 iend = l.end(); for(i = l.begin(); i != iend; i++) cout << *i << ' '; cout << endl; return 0; } // splice // www.cplusplus.com/C++ Library Reference/stl/list/splice.html // splicing lists #include <iostream> #include <list> using namespace std; int main () { list<int> mylist1, mylist2; list<int>::iterator it; // set some initial values: for (int i=1; i<=4; i++) mylist1.push_back(i); // mylist1: 1 2 3 4 for (int i=1; i<=3; i++) mylist2.push_back(i*10); // mylist2: 10 20 30 it = mylist1.begin(); ++it; // points to 2 // 将mylist2全部元素,插入到mylist1的位置it前。mylist2删除 mylist1.splice (it, mylist2); // mylist1: 1 10 20 30 2 3 4 // mylist2 (empty) // "it" still points to 2 (the 5th element) // 将mylist1中it位置的元素,插入到mylist2的begin前,*it从mylist1中删除 mylist2.splice (mylist2.begin(),mylist1, it); // mylist1: 1 10 20 30 3 4 // mylist2: 2 // "it" is now invalid. it = mylist1.begin(); advance(it,3); // "it" points now to 30 ***** advance ***** // 将mylist1(第二个参数)中,it->mylist1.end()中的元素(30 3 4),插入到mylist1的begin之前 mylist1.splice ( mylist1.begin(), mylist1, it, mylist1.end()); // mylist1: 30 3 4 1 10 20 cout << "mylist1 contains:"; for (it=mylist1.begin(); it!=mylist1.end(); it++) cout << " " << *it; cout << "\nmylist2 contains:"; for (it=mylist2.begin(); it!=mylist2.end(); it++) cout << " " << *it; cout << endl; return 0; } // www.cplusplus.com/C++ Library Reference/stl/list/merge.html // list::merge #include <iostream> #include <list> using namespace std; // this compares equal two doubles if // their interger equivalents are equal bool mycomparison (double first, double second) { return ( int(first)<int(second) ); } int main () { list<double> first, second; first.push_back (3.1); first.push_back (2.2); first.push_back (2.9); second.push_back (3.7); second.push_back (7.1); second.push_back (1.4); first.sort(); second.sort(); first.merge(second); second.push_back (2.1); first.merge(second,mycomparison); cout << "first contains:"; for (list<double>::iterator it=first.begin(); it!=first.end(); ++it) cout << " " << *it; cout << endl; return 0; } // 129 splice, merge #include <list> #include <iostream> using namespace std; void print(list < int > &l); int main(void) { list < int > l; for(int j = 1; j <= 10; j++) l.push_back(j); //splice()函数 list < int > carry; // l中的第一个元素,插入carry,本身从l中删除 carry.splice(carry.begin(), l, l.begin()); //carry含元素1 //打印carry cout << "carry的链表元素为: "; print(carry); cout << endl; //打印l cout << "l的链表元素为: "; print(l); cout << endl; //merge()函数用法 list < int > x; x.push_back(30); x.push_back(31); x.push_back(32); l.merge(x); // x中元素必须有序。将x中所有元素,归并到l中。然后x中元素全部被删除 //打印x cout << "x的链表元素为: 空"; print(x); cout << endl; //打印l cout << "l的链表元素为: "; print(l); cout << endl; return 0; } void print(list < int > &l) { list < int > ::iterator i, iend; iend = l.end(); for(i = l.begin(); i != iend; i++) cout << *i << ' '; } // 130 sort #include <list> #include <iostream> using namespace std; void print(list < int > &l); int main(void) { list < int > l; for(int j = 18; j >= 0; j--) l.push_back(j); cout << "排序前: "; print(l); //调用list<int>::sort()函数排序 l.sort(); // 默认为升序 cout << "排序后: "; print(l); return 0; } void print(list < int > &l) { list < int > ::iterator i, iend; iend = l.end(); for(i = l.begin(); i != iend; i++) cout << *i << ' '; cout << endl; } // unique #include <list> #include <iostream> int main(void) { using namespace std; list < int > l; l.push_back(6); l.push_back(8); l.push_back(6); l.push_back(6); l.push_back(6); l.push_back(9); l.push_back(13); l.push_back(6); l.unique(); // 去除全部*连续的*重复元素,仅剩下一个 list < int > ::iterator i, iend; iend = l.end(); for(i = l.begin(); i != iend; i++) cout << *i << ' '; cout << endl; return 0; } // 8.3 本章小结 -----------------------------------------------------------------------------------------