首页 > 代码库 > list

list

  在STL中的list其实就是一个双向链表,我用的还不多。

  1 // -------------------------------------------------------------------------   2 //    文件名        :     list1.cpp  3 //    创建者        :    zjzxh   4 //   邮箱        :    724604956@qq.com  5 //    创建时间    :      2014.07.05  6 //    功能描述    :    STL中的list就是一双向链表,可高效地进行插入删除元素。  7 //                  8 // -------------------------------------------------------------------------  9 #include "stdafx.h" 10 #include <iostream> 11 #include <list> 12 using namespace std; 13  14 list<int> g_list1; 15 list<int> g_list2; 16  17 ////////////////////////////////////////////////////////////////////////// 18  19 // 初始化全局链表 20 void InitList() 21 { 22     //  push_back()增加一元素到链表尾 23     g_list1.push_back(1); 24     g_list1.push_back(2); 25     g_list1.push_back(3); 26  27     // push_front()增加一元素到链表头 28     g_list2.push_front(6); 29     g_list2.push_front(5); 30     g_list2.push_front(4); 31 } 32  33 // 输出一个链表 34 void ShowList(list<int>& listTemp) 35 { 36     //  size()返回链表中元素个数 37     cout << listTemp.size() << endl; 38  39     for (list<int>::iterator it = listTemp.begin(); it != listTemp.end(); ++it) 40     { 41         cout << *it <<  ; 42     } 43     cout << endl; 44 } 45  46 ////////////////////////////////////////////////////////////////////////// 47  48 // 构造函数,空链表 49 void constructor_test0() 50 { 51     list<int> listTemp; 52     cout << listTemp.size() << endl; 53 } 54  55 // 构造函数,建一个含三个默认值是0的元素的链表 56 void constructor_test1() 57 { 58     list<int> listTemp(3); 59     ShowList(listTemp); 60 } 61  62 // 构造函数,建一个含五个元素的链表,值都是1 63 void constructor_test2() 64 { 65     list<int> listTemp(5, 1); 66     ShowList(listTemp); 67 } 68  69 // 构造函数,建一个g_list1的copy链表 70 void constructor_test3() 71 { 72     list<int> listTemp(g_list1); 73     ShowList(listTemp); 74 } 75  76 // 构造函数,listTemp含g_list1一个区域的元素[_First, _Last) 77 void constructor_test4() 78 { 79     list<int> listTemp(g_list1.begin(), g_list1.end()); 80     ShowList(listTemp); 81 } 82  83 // assign()分配值,有两个重载 84 // template <class InputIterator> 85 // void assign ( InputIterator first, InputIterator last ); 86 // void assign ( size_type n, const T& u ); 87 void assign_test() 88 { 89     list<int> listTemp(5, 1); 90     ShowList(listTemp); 91  92     listTemp.assign(4, 3); 93     ShowList(listTemp); 94  95     listTemp.assign(++g_list1.begin(), g_list1.end()); 96     ShowList(listTemp); 97 } 98  99 // operator=100 void operator_equality_test()101 {102     g_list1 = g_list2;103     ShowList(g_list1);104     ShowList(g_list2);105 }106 107 // front()返回第一个元素的引用108 void front_test7()109 {110     cout << g_list1.front() << endl;111 }112 113 // back()返回最后一元素的引用114 void back_test()115 {116     cout << g_list1.back() << endl;117 }118 119 // begin()返回第一个元素的指针(iterator)120 void begin_test()121 {122     list<int>::iterator it1 = g_list1.begin();123     cout << *++it1 << endl;124 125     list<int>::const_iterator it2 = g_list1.begin();126     it2++;127     // (*it2)++;    //     *it2 为const 不用修改128     cout << *it2 << endl;    129 130 }131 132 // end()返回 [最后一个元素的下一位置的指针] (list为空时end()= begin())133 void end_test()134 {135     list<int>::iterator it  = g_list1.end();    // 注意是:最后一个元素的下一位置的指针136     --it;137     cout << *it << endl;138 }139 140 //  rbegin()返回链表最后一元素的后向指针141 void rbegin_test()142 {143     list<int>::reverse_iterator it = g_list1.rbegin();144     for (; it != g_list1.rend(); ++it)145     {146         cout << *it <<  ;147     }148     cout << endl;149 }150 151 //  rend()返回链表第一元素的下一位置的后向指针152 void rend_test()153 {154     list<int>::reverse_iterator it = g_list1.rend();155     --it;156     cout << *it << endl;157 }158 159 // push_back()增加一元素到链表尾160 void push_back_test()161 {162     ShowList(g_list1);163     g_list1.push_back(4);164     ShowList(g_list1);165 }166 167 // push_front()增加一元素到链表头 168 void push_front_test()169 {170     ShowList(g_list1);171     g_list1.push_front(4);172     ShowList(g_list1);173 }174 175 // pop_back()删除链表尾的一个元素176 void pop_back_test()177 {178     ShowList(g_list1);179     cout << endl;180 181     g_list1.pop_back();182     ShowList(g_list1);183 184 }185 186 // pop_front()删除链表头的一元素187 void pop_front_test()188 {189     ShowList(g_list1);190     cout << endl;191 192     g_list1.pop_front();193     ShowList(g_list1);194 }195 196 // clear()删除所有元素197 void clear_test()198 {199     ShowList(g_list1);200     g_list1.clear();201     ShowList(g_list1);202 }203 204 // erase()删除一个元素或一个区域的元素(两个重载函数)205 void erase_test()206 {207     ShowList(g_list1);208     g_list1.erase(g_list1.begin());209     ShowList(g_list1);210 211     cout << endl;212 213     ShowList(g_list2);214     g_list2.erase(++g_list2.begin(), g_list2.end());215     ShowList(g_list2);216 }217 218 // remove()删除链表中匹配值的元素(匹配元素全部删除)219 void remove_test()220 {221     ShowList(g_list1);222     g_list1.push_back(1);223     ShowList(g_list1);224 225     g_list1.remove(1);226     ShowList(g_list1);227 }228 229 bool myFun(const int& value) { return (value < 2); }230 // remove_if()删除条件满足的元素(会遍历一次链表)231 void remove_if_test()232 {233     ShowList(g_list1);234     g_list1.remove_if(myFun);235     ShowList(g_list1);236 }237 238 239 // empty()判断是否链表为空240 void empty_test()241 {242     list<int> listTemp;243     if (listTemp.empty())244         cout << "listTemp为空" << endl;245     else246         cout << "listTemp不为空" << endl;247 }248 249 250 //  max_size()返回链表最大可能长度:1073741823251 void max_size_test()252 {253     list<int>::size_type nMax = g_list1.max_size();254     cout << nMax << endl;255 }256 257 258 // resize()重新定义链表长度(两重载函数):259 void resize_test()260 {261     ShowList(g_list1);262     g_list1.resize(9);        // 用默认值填补263     ShowList(g_list1);264     cout << endl;265 266     ShowList(g_list2);267     g_list2.resize(9, 51);    // 用指定值填补268     ShowList(g_list2);269 }270 271 // reverse()反转链表272 void reverse_test()273 {274     ShowList(g_list1);275     g_list1.reverse();276     ShowList(g_list1);277 }278 279 280 // sort()对链表排序,默认升序(两个重载函数)281 void sort_test()282 {283     list<int> listTemp;284     listTemp.push_back(9);285     listTemp.push_back(3);286     listTemp.push_back(5);287     listTemp.push_back(1);288     listTemp.push_back(4);289     listTemp.push_back(3);290 291     ShowList(listTemp);292     listTemp.sort();293     ShowList(listTemp);294 295     listTemp.sort(greater<int>());296     ShowList(listTemp);297 }298 299 // merge()合并两个升序序链表并使之成为另一个升序.300 void merge_test1()301 {302     list<int> listTemp2;303     listTemp2.push_back(3);304     listTemp2.push_back(4);305 306     list<int> listTemp3;307     listTemp3.push_back(9);308     listTemp3.push_back(10);309 310     ShowList(listTemp2);311     cout << endl;312     ShowList(listTemp3);313     cout << endl;314 315     listTemp2.merge(listTemp3);316     ShowList(listTemp2);317 }318 319 320 bool myCmp (int first, int second)321 { return ( int(first)>int(second) ); }322 323 // merge()合并两个降序链表并使之成为另一个降序.324 void merge_test2()325 {326     list<int> listTemp2;327     listTemp2.push_back(4);328     listTemp2.push_back(3);329 330     list<int> listTemp3;331     listTemp3.push_back(10);332     listTemp3.push_back(9);333 334     ShowList(listTemp2);335     cout << endl;336     ShowList(listTemp3);337     cout << endl;338 339     // listTemp2.merge(listTemp3, greater<int>());    // 第二个参数可以是自己定义的函数如下340     listTemp2.merge(listTemp3, myCmp);341     ShowList(listTemp2);342 }343 344 // splice()对两个链表进行结合(三个重载函数),结合后第二个链表清空345 // void splice ( iterator position, list<T,Allocator>& x );346 // void splice ( iterator position, list<T,Allocator>& x, iterator i );347 // void splice ( iterator position, list<T,Allocator>& x, iterator first, iterator last );348 void splice_test()349 {350     list<int> listTemp1(g_list1);351     list<int> listTemp2(g_list2);352 353     ShowList(listTemp1);354     ShowList(listTemp2);355     cout << endl;356     357     // 358     listTemp1.splice(++listTemp1.begin(), listTemp2);359     ShowList(listTemp1);360     ShowList(listTemp2);361 362     // 363     listTemp1.assign(g_list1.begin(), g_list1.end());364     listTemp2.assign(g_list2.begin(), g_list2.end());365     listTemp1.splice(++listTemp1.begin(), listTemp2, ++listTemp2.begin());366     ShowList(listTemp1);367     ShowList(listTemp2);368 369     // 370     listTemp1.assign(g_list1.begin(), g_list1.end());371     listTemp2.assign(g_list2.begin(), g_list2.end());372     listTemp1.splice(++listTemp1.begin(), listTemp2, ++listTemp2.begin(), listTemp2.end());373     ShowList(listTemp1);374     ShowList(listTemp2);375 376 }377 378 //  insert()在指定位置插入一个或多个元素(三个重载函数)379 // iterator insert ( iterator position, const T& x );380 // void insert ( iterator position, size_type n, const T& x );381 // template <class InputIterator>382 // void insert ( iterator position, InputIterator first, InputIterator last );383 void insert_test()384 {385     list<int> listTemp1(g_list1);386     ShowList(listTemp1);387     listTemp1.insert(listTemp1.begin(), 51);388     ShowList(listTemp1);389     cout << endl;390 391     list<int> listTemp2(g_list1);392     ShowList(listTemp2);393     listTemp2.insert(listTemp2.begin(), 9, 51);394     ShowList(listTemp2);395     cout << endl;396 397     list<int> listTemp3(g_list1);398     ShowList(listTemp3);399     listTemp3.insert(listTemp3.begin(), g_list2.begin(), g_list2.end());400     ShowList(listTemp3);401 402 }403 404 // swap()交换两个链表(两个重载)405 void swap_test()406 {407     ShowList(g_list1);408     ShowList(g_list2);409     cout << endl;410 411     g_list1.swap(g_list2);412     ShowList(g_list1);413     ShowList(g_list2);414 }415 416 bool same_integral_part (double first, double second)417 { return ( int(first)==int(second) ); }418 419 // unique()删除相邻重复元素420 void unique_test()421 {422     list<int> listTemp;423     listTemp.push_back(1);424     listTemp.push_back(1);425     listTemp.push_back(4);426     listTemp.push_back(3);427     listTemp.push_back(5);428     listTemp.push_back(1);429     list<int> listTemp2(listTemp);430     431     ShowList(listTemp);432     listTemp.unique();    // 不会删除不相邻的相同元素433     ShowList(listTemp);434     cout << endl;435 436     listTemp.sort();437     ShowList(listTemp);438     listTemp.unique();439     ShowList(listTemp);440     cout << endl;441 442     listTemp2.sort();443     ShowList(listTemp2);444     listTemp2.unique(same_integral_part);445     ShowList(listTemp2);446 447 }448 449 // 主函数,下面要测试哪个就把那个注释去掉即可450 int _tmain(int argc, _TCHAR* argv[])451 {452     InitList();453 //     ShowList(g_list1);454 //     ShowList(g_list2);455 456 //     constructor_test0();457 //     constructor_test1();458 //     constructor_test2();459 //     constructor_test3();460 //     constructor_test4();461 //     assign_test();462 //     operator_equality_test();463 //     front_test7();464 //     back_test();465 //     begin_test();466 //     end_test();467 //     rbegin_test();468 //     rend_test();469 //     push_back_test();470 //     push_front_test();471 //     pop_back_test();472 //     pop_front_test();473 //     clear_test();474 //     erase_test();475 //      remove_test();476 //     remove_if_test();477 //     empty_test();478 //     max_size_test();479 //     resize_test();480 //     reverse_test();481 //     sort_test();482 //     merge_test1();483 //     merge_test2();484 //     splice_test();485 //     insert_test();486 //     swap_test();487 //     unique_test();488     return 0;489 }