1. 程式人生 > >C++STL之list雙向連結串列容器

C++STL之list雙向連結串列容器

list容器實現了雙向連結串列的資料結構,資料元素是通過連結串列指標串成邏輯意義上的線性表,選擇對連結串列的任一位置的元素進行插入,刪除和查詢都是非常高效的。
這裡寫圖片描述
list的每個節點有三個域:前驅元素指標域,資料域,後繼元素指標域,前驅元素的指標域儲存了前驅元素的首地址;資料域則是本節點的資料,後繼元素指標域則儲存了後繼元素的首地址。
list的頭節點的前驅元素指標域儲存的是連結串列中尾元素的首地址,而list的尾節點的後繼元素指標域則儲存了頭節點的首地址,這樣就構成一個雙向迴圈連結串列。
由於list物件的節點並不要求一段連續的記憶體空間,所以,對於迭代器,只能通過”++”或”–”的操作將迭代器移動到後繼/前驅節點元素處。而不能對迭代器進行+n或者-n操作。

*建立list物件
建立空連結串列

list<int> L;

建立具有n個元素的連結串列

list<int> L(10);

*元素的插入和遍歷
採用push_back方法往尾部插入元素,連結串列自動擴張。
採用push_front方法往首部插入元素,連結串列自動擴張。
採用insert方法往迭代器插入元素,聯絡自動擴張。

迭代器只能進行”++”或“–”操作,不能進行+n或-n操作。

#include<iostream>
#include<list>
using namespace std;

int main()
{
    list
<int>
L; L.push_back(2); L.push_back(1); L.push_back(5); L.push_back(8); list<int>::iterator it; it = L.begin(); it ++; L.insert(it, 20); for(it = L.begin(); it != L.end(); it ++) cout<<*it<<" "; cout<<endl; list<int
>
::reverse_iterator rit; for(rit = L.rbegin(); rit != L.rend(); rit ++) cout<<*rit<<" "; cout<<endl; return 0; }

*元素刪除
使用remove()方法刪除連結串列中一個元素,值相同的元素都會被刪除。
使用pop_front()方法刪除連結串列首元素。
使用pop_back()方法刪除連結串列尾元素。

#include<iostream>
#include<list>
using namespace std;

int main()
{
    list<int> L;
    L.push_back(2);
    L.push_back(1);
    L.push_back(5);
    L.push_back(8);
    L.push_back(1);

    list<int>::iterator it;
    for(it = L.begin(); it != L.end(); it ++)
        cout<<*it<<" ";
    cout<<endl;

    //刪除所有等於1的元素 
    L.remove(1);
    for(it = L.begin(); it != L.end(); it ++)
        cout<<*it<<" ";
    cout<<endl;

    L.pop_front();
    L.pop_back();
    for(it = L.begin(); it != L.end(); it ++)
        cout<<*it<<" ";
    cout<<endl;

    return 0;
}

使用erase()方法刪除迭代器位置上的元素
使用clear()方法清空連結串列

#include<iostream>
#include<list>
using namespace std;

int main()
{
    list<int> L;
    L.push_back(2);
    L.push_back(1);
    L.push_back(5);
    L.push_back(8);
    L.push_back(1);

    list<int>::iterator it;
    for(it = L.begin(); it != L.end(); it ++)
        cout<<*it<<" ";
    cout<<endl;

    //刪除第2個元素(從0開始計數)
    it = L.begin();
    it ++;
    it ++;

    L.erase(it);
    for(it = L.begin(); it != L.end(); it ++)
        cout<<*it<<" ";
    cout<<endl;

    L.clear();
    cout<<L.size()<<endl;
    return 0;
}

*元素查詢
採用find()查詢可以在連結串列中查詢元素,如果找到該元素,則返回該元素的迭代器位置,反之,則返回end()迭代器位置。
find()演算法需要宣告標頭檔案`#include

#include<iostream>
#include<list>
#include<algorithm>
using namespace std;

int main()
{
    list<int> L;
    L.push_back(2);
    L.push_back(1);
    L.push_back(5);
    L.push_back(8);
    L.push_back(1);

    list<int>::iterator it;
    for(it = L.begin(); it != L.end(); it ++)
        cout<<*it<<" ";
    cout<<endl;

    it = find(L.begin(), L.end(), 5);
    if(it != L.end())
        cout<<"Find it"<<endl;
    else
        cout<<"Not find it"<<endl;

    it = find(L.begin(), L.end(), 10);
    if(it != L.end())
        cout<<"Find it"<<endl;
    else
        cout<<"Not find it"<<endl;
    return 0;
}

*元素排序
使用sort()方法對連結串列進行排序,升序排列

#include<iostream>
#include<list>
#include<algorithm>
using namespace std;

int main()
{
    list<int> L;
    L.push_back(2);
    L.push_back(1);
    L.push_back(5);
    L.push_back(8);
    L.push_back(1);

    list<int>::iterator it;
    for(it = L.begin(); it != L.end(); it ++)
        cout<<*it<<" ";
    cout<<endl;

    L.sort();

    for(it = L.begin(); it != L.end(); it ++)
        cout<<*it<<" ";
    cout<<endl;
    return 0;
}

*剔除連續重複元素
採用unique()方法可以剔除連續重複元素,只保留一個

#include<iostream>
#include<list>
#include<algorithm>
using namespace std;

int main()
{
    list<int> L;
    L.push_back(2);
    L.push_back(1);
    L.push_back(1);
    L.push_back(1);
    L.push_back(1);
    L.push_back(1);
    L.push_back(5);
    L.push_back(8);
    L.push_back(1);

    list<int>::iterator it;
    for(it = L.begin(); it != L.end(); it ++)
        cout<<*it<<" ";
    cout<<endl;

    L.unique();

    for(it = L.begin(); it != L.end(); it ++)
        cout<<*it<<" ";
    cout<<endl;
    return 0;
}

相關推薦

C++ STLlist雙向連結串列容器

不同於採用線性表順序儲存結構的vector和deque容器,list雙向連結串列中任一位置的元素查詢、插入和刪除,都具有高效的常數階演算法時間複雜度O(1)。 list技術原理 為了支援前向和反向訪問list容器的元素,list採用雙向迴圈的連結串列結構組織資

C++STLlist雙向連結串列容器

list容器實現了雙向連結串列的資料結構,資料元素是通過連結串列指標串成邏輯意義上的線性表,選擇對連結串列的任一位置的元素進行插入,刪除和查詢都是非常高效的。 list的每個節點有三個域:前驅元素指標域,資料域,後繼元素指標域,前驅元素的指標域儲存了前驅元

[C++ 從入門到放棄-07]C++STLlist雙向連結串列容器

學過資料結構都知道,其中有一章專門講線性表,其中有兩塊,一是順序表(也就是我們平時用的比較多的陣列,結構陣列),二是連結串列(有指標在,想想都複雜)。而C++ STL中給我們封裝好了一個list容器,

C++ STL 容器技術 list雙向連結串列容器

簡介: list是雙向連結串列的一個泛化容器,它的資料元素可通過連結串列指標串接成邏輯意義上的線性表。不同於採用線性表順序儲存結構的vector和deque容器,list雙向連結串列中任一位置的元素查詢、插入和刪除,都具有高效的常數階演算法時間複雜度O(1)。 lis

C++ STL學習筆記四 list雙向連結串列容器

/* * ******************************************** *   list雙向連結串列容器的基礎說明: ******************************************** * * list雙向連結串列容器採用雙向

list雙向連結串列容器

list容器實現了雙向連結串列的資料結構,資料元素是通過連結串列指標串聯成邏輯意義上的線性表,因此對連結串列的任一位置的元素進行插入、刪除和查詢都是極快的。 list每個節點有三個域:前驅元素指標域、資料域、後繼元素指標域,list的頭結點的前驅元素指標域儲存的是連結串列中

玩轉C線性表和單向連結串列Linux雙向連結串列優化

  前言:   這次介紹基本資料結構的線性表和連結串列,並用C語言進行編寫;建議最開始學資料結構時,用C語言;像棧和佇列都可以用這兩種資料結構來實現。   一、線性表基本介紹     1 概念:                  線性表也就是關係戶中最簡單的一種關係,一對一。            

Redis系列(八):資料結構List雙向連結串列中阻塞版本BLPOP、BRPOP和LINDEX、LINSERT、LRANGE命令詳解

1.BRPOP、BLPOP BLPOP: BLPOP 是阻塞式列表的彈出原語。 它是命令 LPOP 的阻塞版本,這是因為當給定列表內沒有任何元素可供彈出的時候, 連線將被 BLPOP 命令阻塞。 當給定多個 key 引數時,按引數 key 的先後順序依次檢查

C++ STLList實現

概述     List是STL中常用的容器之一,List將元素按順序儲存到連結串列中,在快速刪除和快速插入方面比vector高出許多。STL中的list是一雙向連結串列,具有指向前一節點和後一節點的指標。那麼我們開始寫一個屬於自己的List吧。 list的節點    

c++ STL List

#define VNAME(value) {cout<<(#value)<<":"<<endl;} template<class T> void print_elemnt(T &v) { for(auto i : v) cout

資料結構與演算法雙向連結串列和迴圈連結串列

視訊課堂https://edu.csdn.net/course/play/7621 在本章中,你將學習: 執行雙鏈接列表 執行迴圈連結列表 應用連結列表以解決程式設計問題 現在,考慮一個示例,您需要以降序的方式顯示這些數字。

C語言資料結構----雙向連結串列

概括:主要說明雙向連結串列的基本概念和具體操作以及原始碼。 一、基本概念 1.有了單鏈表以後我們可以把記憶體中小塊的空間聯絡在一起,並且把每一個小塊都儲存上我們想要儲存的數值。但是單鏈表只有一個next,我們每一次都要從頭開始遍歷整個連結串列,這樣的話如果我們對單鏈表進行逆

c++實現類模板雙向連結串列

#include<iostream> #include<assert.h> using namespace std; typedef int Datatype; typedef struct Node //連結串列是由一個個節點組成所以這裡單獨定

Redis系列(五):資料結構List雙向連結串列中基本操作操作命令和原始碼解析

1.介紹 Redis中List是通過ListNode構造的雙向連結串列。 特點: 1.雙端:獲取某個結點的前驅和後繼結點都是O(1) 2.無環:表頭的prev指標和表尾的next指標都指向NULL,對連結串列的訪問都是以NULL為終點 3.帶表頭指標和表尾指標:獲取表頭和表尾的複雜度都是O(1) 4.帶連結串

C++】STL常用容器總結四:連結串列list

5、連結串列list List是每個節點包含前驅指標、後繼指標和資料域三個部分的雙向連結串列。List不提供隨機存取,訪問元素需要按順序走到需存取的元素,時間複雜度為O(n),在list的任何位置上執行插入或刪除操作都非常迅速,只需在list內部調整一下指標。

c++ stl list(環狀雙向連結串列

1.list   相較於vector的連續線性空間,list就顯得複雜很多,它的好處是每次插入或刪除一個元素,就配置或釋放一個元素的空間。因此,list對空間的運用有絕對的精確,一點也不浪費。而且,對於任何位置的元素插入和元素移除,list永遠是常數時間。   list的節

C++ STL 容器部分有關list 連結串列容器的基本操作

#include<iostream> using namespace std; #include "list" //list模型的標頭檔案 /*總結*/ //相當於一個雙向連結串列 //1 list基本與其餘容器模型差不多類似 注意一點就是不允許隨機插

c++stllist雙向連結串列

1.list初始化: (1)list<int>  t;  //沒有任何元素 (2)list<int>  t(10);  //建立有10個元素的連結串列 (3)lis

C#LeetCode刷題#203-刪除連結串列中的節點(Remove Linked List Elements)

問題 刪除連結串列中等於給定值 val 的所有節點。 輸入: 1->2->6->3->4->5->6, val = 6 輸出: 1->2->3-&

C#LeetCode刷題#206-反轉連結串列(Reverse Linked List

問題 反轉一個單鏈表。 輸入: 1->2->3->4->5->NULL輸出: 5->4->3->2->1->NULL 進階: 你可以