1. 程式人生 > >C++連結串列類的運用,簡單實用。

C++連結串列類的運用,簡單實用。

// ------------------------------------------------------------------------- // 檔名 : list1.cpp // 建立者 : 方煜寬 //  郵箱 : [email protected] // 建立時間 : 2010-9-19 15:58 // 功能描述 : STL中的list就是一雙向連結串列,可高效地進行插入刪除元素。 //// -------------------------------------------------------------------------
#include "stdafx.h" #include <iostream> #include <list> using namespace std; list<int> g_list1; list<int> g_list2; ////////////////////////////////////////////////////////////////////////// // 初始化全域性連結串列void InitList() { // push_back()增加一元素到連結串列尾 g_list1.push_back(1); g_list1.push_back(2); g_list1.push_back(3); // push_front()增加一元素到連結串列頭
g_list2.push_front(6); g_list2.push_front(5); g_list2.push_front(4); } // 輸出一個連結串列void ShowList(list<int>& listTemp) { // size()返回連結串列中元素個數 cout << listTemp.size() << endl; for (list<int>::iterator it = listTemp.begin(); it != listTemp.end(); ++it) { cout << *it << '
'; } cout << endl; } ////////////////////////////////////////////////////////////////////////// // 建構函式,空連結串列void constructor_test0() { list<int> listTemp; cout << listTemp.size() << endl; } // 建構函式,建一個含三個預設值是0的元素的連結串列void constructor_test1() { list<int> listTemp(3); ShowList(listTemp); } // 建構函式,建一個含五個元素的連結串列,值都是1void constructor_test2() { list<int> listTemp(5, 1); ShowList(listTemp); } // 建構函式,建一個g_list1的copy連結串列void constructor_test3() { list<int> listTemp(g_list1); ShowList(listTemp); } // 建構函式,listTemp含g_list1一個區域的元素[_First, _Last)void constructor_test4() { list<int> listTemp(g_list1.begin(), g_list1.end()); ShowList(listTemp); } // assign()分配值,有兩個過載 // template <class InputIterator> // void assign ( InputIterator first, InputIterator last ); // void assign ( size_type n, const T& u );void assign_test() { list<int> listTemp(5, 1); ShowList(listTemp); listTemp.assign(4, 3); ShowList(listTemp); listTemp.assign(++g_list1.begin(), g_list1.end()); ShowList(listTemp); } // operator=void operator_equality_test() { g_list1 = g_list2; ShowList(g_list1); ShowList(g_list2); } // front()返回第一個元素的引用void front_test7() { cout << g_list1.front() << endl; } // back()返回最後一元素的引用void back_test() { cout << g_list1.back() << endl; } // begin()返回第一個元素的指標(iterator)void begin_test() { list<int>::iterator it1 = g_list1.begin(); cout << *++it1 << endl; list<int>::const_iterator it2 = g_list1.begin(); it2++; // (*it2)++; // *it2 為const 不用修改 cout << *it2 << endl; } // end()返回 [最後一個元素的下一位置的指標] (list為空時end()= begin())void end_test() { list<int>::iterator it = g_list1.end(); // 注意是:最後一個元素的下一位置的指標 --it; cout << *it << endl; } // rbegin()返回連結串列最後一元素的後向指標void rbegin_test() { list<int>::reverse_iterator it = g_list1.rbegin(); for (; it != g_list1.rend(); ++it) { cout << *it << ''; } cout << endl; } // rend()返回連結串列第一元素的下一位置的後向指標void rend_test() { list<int>::reverse_iterator it = g_list1.rend(); --it; cout << *it << endl; } // push_back()增加一元素到連結串列尾void push_back_test() { ShowList(g_list1); g_list1.push_back(4); ShowList(g_list1); } // push_front()增加一元素到連結串列頭 void push_front_test() { ShowList(g_list1); g_list1.push_front(4); ShowList(g_list1); } // pop_back()刪除連結串列尾的一個元素void pop_back_test() { ShowList(g_list1); cout << endl; g_list1.pop_back(); ShowList(g_list1); } // pop_front()刪除連結串列頭的一元素void pop_front_test() { ShowList(g_list1); cout << endl; g_list1.pop_front(); ShowList(g_list1); } // clear()刪除所有元素void clear_test() { ShowList(g_list1); g_list1.clear(); ShowList(g_list1); } // erase()刪除一個元素或一個區域的元素(兩個過載函式)void erase_test() { ShowList(g_list1); g_list1.erase(g_list1.begin()); ShowList(g_list1); cout << endl; ShowList(g_list2); g_list2.erase(++g_list2.begin(), g_list2.end()); ShowList(g_list2); } // remove()刪除連結串列中匹配值的元素(匹配元素全部刪除)void remove_test() { ShowList(g_list1); g_list1.push_back(1); ShowList(g_list1); g_list1.remove(1); ShowList(g_list1); } bool myFun(const int& value) { return (value < 2); } // remove_if()刪除條件滿足的元素(會遍歷一次連結串列)void remove_if_test() { ShowList(g_list1); g_list1.remove_if(myFun); ShowList(g_list1); } // empty()判斷是否連結串列為空void empty_test() { list<int> listTemp; if (listTemp.empty()) cout << "listTemp為空" << endl; else cout << "listTemp不為空" << endl; } // max_size()返回連結串列最大可能長度:1073741823void max_size_test() { list<int>::size_type nMax = g_list1.max_size(); cout << nMax << endl; } // resize()重新定義連結串列長度(兩過載函式):void resize_test() { ShowList(g_list1); g_list1.resize(9); // 用預設值填補 ShowList(g_list1); cout << endl; ShowList(g_list2); g_list2.resize(9, 51); // 用指定值填補 ShowList(g_list2); } // reverse()反轉連結串列void reverse_test() { ShowList(g_list1); g_list1.reverse(); ShowList(g_list1); } // sort()對連結串列排序,預設升序(兩個過載函式)void sort_test() { list<int> listTemp; listTemp.push_back(9); listTemp.push_back(3); listTemp.push_back(5); listTemp.push_back(1); listTemp.push_back(4); listTemp.push_back(3); ShowList(listTemp); listTemp.sort(); ShowList(listTemp); listTemp.sort(greater<int>()); ShowList(listTemp); } // merge()合併兩個升序序連結串列並使之成為另一個升序.void merge_test1() { list<int> listTemp2; listTemp2.push_back(3); listTemp2.push_back(4); list<int> listTemp3; listTemp3.push_back(9); listTemp3.push_back(10); ShowList(listTemp2); cout << endl; ShowList(listTemp3); cout << endl; listTemp2.merge(listTemp3); ShowList(listTemp2); } bool myCmp (int first, int second) { return ( int(first)>int(second) ); } // merge()合併兩個降序連結串列並使之成為另一個降序.void merge_test2() { list<int> listTemp2; listTemp2.push_back(4); listTemp2.push_back(3); list<int> listTemp3; listTemp3.push_back(10); listTemp3.push_back(9); ShowList(listTemp2); cout << endl; ShowList(listTemp3); cout << endl; // listTemp2.merge(listTemp3, greater<int>()); // 第二個引數可以是自己定義的函式如下 listTemp2.merge(listTemp3, myCmp); ShowList(listTemp2); } // splice()對兩個連結串列進行結合(三個過載函式),結合後第二個連結串列清空 // void splice ( iterator position, list<T,Allocator>& x ); // void splice ( iterator position, list<T,Allocator>& x, iterator i ); // void splice ( iterator position, list<T,Allocator>& x, iterator first, iterator last );void splice_test() { list<int> listTemp1(g_list1); list<int> listTemp2(g_list2); ShowList(listTemp1); ShowList(listTemp2); cout << endl; // listTemp1.splice(++listTemp1.begin(), listTemp2); ShowList(listTemp1); ShowList(listTemp2); // listTemp1.assign(g_list1.begin(), g_list1.end()); listTemp2.assign(g_list2.begin(), g_list2.end()); listTemp1.splice(++listTemp1.begin(), listTemp2, ++listTemp2.begin()); ShowList(listTemp1); ShowList(listTemp2); // listTemp1.assign(g_list1.begin(), g_list1.end()); listTemp2.assign(g_list2.begin(), g_list2.end()); listTemp1.splice(++listTemp1.begin(), listTemp2, ++listTemp2.begin(), listTemp2.end()); ShowList(listTemp1); ShowList(listTemp2); } // insert()在指定位置插入一個或多個元素(三個過載函式) // iterator insert ( iterator position, const T& x ); // void insert ( iterator position, size_type n, const T& x ); // template <class InputIterator> // void insert ( iterator position, InputIterator first, InputIterator last );void insert_test() { list<int> listTemp1(g_list1); ShowList(listTemp1); listTemp1.insert(listTemp1.begin(), 51); ShowList(listTemp1); cout << endl; list<int> listTemp2(g_list1); ShowList(listTemp2); listTemp2.insert(listTemp2.begin(), 9, 51); ShowList(listTemp2); cout << endl; list<int> listTemp3(g_list1); ShowList(listTemp3); listTemp3.insert(listTemp3.begin(), g_list2.begin(), g_list2.end()); ShowList(listTemp3); } // swap()交換兩個連結串列(兩個過載)void swap_test() { ShowList(g_list1); ShowList(g_list2); cout << endl; g_list1.swap(g_list2); ShowList(g_list1); ShowList(g_list2); } bool same_integral_part (double first, double second) { return ( int(first)==int(second) ); } // unique()刪除相鄰重複元素void unique_test() { list<int> listTemp; listTemp.push_back(1); listTemp.push_back(1); listTemp.push_back(4); listTemp.push_back(3); listTemp.push_back(5); listTemp.push_back(1); list<int> listTemp2(listTemp); ShowList(listTemp); listTemp.unique(); // 不會刪除不相鄰的相同元素 ShowList(listTemp); cout << endl; listTemp.sort(); ShowList(listTemp); listTemp.unique(); ShowList(listTemp); cout << endl; listTemp2.sort(); ShowList(listTemp2); listTemp2.unique(same_integral_part); ShowList(listTemp2); } // 主函式,下面要測試哪個就把那個註釋去掉即可int _tmain(int argc, _TCHAR* argv[]) { InitList(); // ShowList(g_list1); // ShowList(g_list2); // constructor_test0(); // constructor_test1(); // constructor_test2(); // constructor_test3(); // constructor_test4(); // assign_test(); // operator_equality_test(); // front_test7(); // back_test(); // begin_test(); // end_test(); // rbegin_test(); // rend_test(); // push_back_test(); // push_front_test(); // pop_back_test(); // pop_front_test(); // clear_test(); // erase_test(); // remove_test(); // remove_if_test(); // empty_test(); // max_size_test(); // resize_test(); // reverse_test(); // sort_test(); // merge_test1(); // merge_test2(); // splice_test(); // insert_test(); // swap_test(); // unique_test(); return 0; }

相關推薦

C++連結串列運用簡單實用

// ------------------------------------------------------------------------- // 檔名 : list1.cpp // 建立者 : 方煜寬 //  郵箱 : [

c++連結串列實現佇列深搜加寬搜加模版實現迷宮問題;

資料結構作業二,用連結串列實現佇列,用深搜寬搜解決迷宮問題,另是模版類的用法; 模版類用法舉例: 栗子一: template<class bbb> class Node{ public: bbb data; Node *ne

新手上路勿噴C++連結串列的建立遍歷刪除插入等等

//list.h #pragma once template<typename T>class slistNode { public:  slistNode() { next = nullptr; cout << "呼叫了slistnode的建構函式

C++連結串列

連結串列是一種線性資料結構,佔用不連續的記憶體,用一個或兩個指標(或元素的代號)儲存與其相鄰的元素。 怎麼用類實現一個連結串列呢?(這裡我們討論雙向連結串列) 首先,我們可以建一個數組,儲存各元素,只不過元素的順序不一定是按照下標排列的。 元素可以用一個結構體表示,它有三個元素:數值

C++連結串列模板

記錄自己寫的一個連結串列類模板,兩個標頭檔案:一個是節點標頭檔案Node.h,一個是連結串列標頭檔案LinkList.h。 Node.h #pragma once #include <iostream> template <ty

c++連結串列建立使用

我們知道,陣列式計算機根據事先定義好的陣列型別與長度自動為其分配一連續的儲存單元,相同陣列的位置和距離都是固定的,也就是說,任何一個數組元素的地址都可一個簡單的公式計算出來,因此這種結構可以有效的對陣列元素進行隨機訪問。但若對陣列元素進行插入和刪除操作,則會引起大量資料的移

使用AddPermission獲取Android6.o許可權附上一個自定義的dialog簡單實用

先來看看效果。。 1.新增AddPermission的依賴 gitbub地址:https://github.com/yanzhenjie/AndPermission implementation ‘com.yanzhenjie:permission:2.0.0-rc1

C++中用模板(結點連結串列)實現的單鏈表的合併操作!

程式碼通俗易通,如下 List.h #include<stdio.h> template <class T> class ListNode { T data; ListNode<T>* link; public:

Linu c++ 簡單實現連結串列模板

    之前在C語言裡面有實現連結串列,現在用c++簡單的實現連結串列類,只實現了插入節點和排序,我先開個好頭,其餘的程式碼基本上和C語言裡面的程式碼差不多,直接上程式碼咯;#include <iostream>#include <cstdio>usi

C語言雙向連結串列的實現(簡單實現)

最近有時間看了資料結構的雙向連結串列,其實和單向連結串列的規則是一樣的,只不過在定義節點的時候比單向連結串列多定義i一個指向前一個節點的指標就可以了,在插入節點和刪除節點的時候要注意,畫圖是最好的方法。 雙向使用的時候重要的是獲得連結串列頭和連結串列尾,下面有獲取的相關函式。 // copy

單鏈表——求兩個集合的差集 AB集合求差集放到C連結串列

#include <stdio.h> #include <malloc.h> typedef struct Node { int data; struct Node *next; }LNode,*LinkList; void list

C語言 連結串列的建立插入刪除列印

#include <stdio.h> #include <stdlib.h> #include <memory.h> //結構體定義 struct Node{ char name[10]; int score; s

資料結構-c語言實現連結串列的建立增刪翻轉

很經典的課題了,這裡直接給出源程式: #include <stdio.h> #include <stdlib.h> #define LIST_MAX_LEN 10 typedef int ElementType; typedef int BOOL; #define TR

C++實現雙向連結串列的建立插入修改刪除

#include<iostream> #include<string> using namespace std; struct Node {int value;Node* pre;Node* next; }; class Double_list { private:Node*

c++之連結串列篇1:單向連結串列的建立列印刪除插入銷燬等基本操作

在牛客網上刷題的過程遇到很多連結串列的問題,所以自己又結合著傳智播客上的視訊把連結串列整理了一下。 #include <iostream> using namespace std; //連結串列的的結點 struct ListNode { int val;

c語言連結串列寫的一個簡單的學生管理系統

在大學由於在學完c語言之後老師佈置了一個寫學生管理系統的課設我寫了一個簡單的學生管理 系統,話不多說,直接上原始碼。 #include<stdio.h> #include<stdlib.h> #include<string.h> char

【資料結構】c++ 實現連結串列的建立查詢列印刪除插入

//程式很簡單,但是要捋順邏輯關係,留著備用 #include #include"stdafx.h" using namespace std; struct node { int data; node* next; }; node * created_hea

C語言實現連結串列的建立初始化插入刪除查詢

#include <stdio.h> #include <stdlib.h> #define OK 0 #define ERROR -1 #define MALLOC_ERROR -2 typedef int

C# Redis輔助封裝與簡單聊天室的實現思路說明

執行 sum 頭部 lis 有序 += wait connected 相同 雖然redis api的功能比較齊全,但個人覺得為了更好的方便學習和使用,還是很有必有做一個類似DBHelper的幫助類 輔助類主要功能(代碼會在最後放出來) 1. 事件監聽: 重新配置廣播

OPPO手機裏的照片轉換成PDF文件的方法簡單實用

oppo -o ext jpg 需要 alt 圖片轉換 工具 裏的 在工作或者生活中避免不了有時需要將圖片轉換為PDF的情況,其實現在不止電腦上可以實現了,有很多的手機端軟 件也能實現了,本文就和大家分享一下如何在手機上實現圖片轉換為PDF。 圖片轉換為PDF操作步驟: 1