C++ STL之slist單向鏈表容器使用方式
slist為單向鏈表的泛化容器,與list雙向鏈表容器一樣,實(shí)現(xiàn)了線性表數(shù)據(jù)的鏈表存儲(chǔ),數(shù)據(jù)元素不必在物理內(nèi)存中連續(xù)分布。
slist鏈表的節(jié)點(diǎn),只有后繼的指針,不含前驅(qū)的指針。因此,在節(jié)省前驅(qū)指針的存儲(chǔ)空間的同時(shí),也就不再支持迭代器的反向移動(dòng)。
1.slist技術(shù)原理
slist內(nèi)部的鏈表由頭指針、頭節(jié)點(diǎn)和元素節(jié)點(diǎn)組成,每個(gè)節(jié)點(diǎn)含有指向后繼節(jié)點(diǎn)的指針,最后一個(gè)節(jié)點(diǎn)的指針為null,可見slist沒有形成一個(gè)環(huán)形回路。

頭節(jié)點(diǎn)一般不存儲(chǔ)數(shù)據(jù),為了使各個(gè)元素節(jié)點(diǎn)都有前驅(qū)節(jié)點(diǎn)的指針指向它以便能夠不加區(qū)別的對(duì)第一個(gè)元素節(jié)點(diǎn)和其他元素節(jié)點(diǎn)進(jìn)行統(tǒng)一處理,所以構(gòu)造頭節(jié)點(diǎn)。
2.slist應(yīng)用基礎(chǔ)
list對(duì)象的創(chuàng)建和vector一樣,不多解釋。元素的刪除、歸并、排序與list相同。
2.1初始化賦值和遍歷
通常使用push_front函數(shù)進(jìn)行初始化,由于slist的頭節(jié)點(diǎn)僅有一個(gè)指針域保存首元素地址,而沒有存放最后一個(gè)元素的地址,因此slist沒有提供類似的push_back函數(shù)能夠在容器尾部添加元素。
push_front函數(shù)在鏈表首元素前面,插入一個(gè)新元素,使之成為首元素。
遍歷slist和list一樣,只能使用迭代器進(jìn)行遍歷,而不能使用數(shù)組下標(biāo)的形式。
#include <QList> //在qt中QList就是單向鏈表,用法和slist相同
#include <QCoreApplication>
#include<QString>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QList<int> s;
s.push_front(11); //在首元素插入11
s.push_front(23); //在11前面插入23,即現(xiàn)在23為首元素
s.push_front(39); // 在首元素23之前插入39,即39,23,11
QList<int>::iterator i,iend;
iend=s.end();
for(i=s.begin();i!=iend;i++)
{
cout << *i << " ";
}
cout << endl;
return a.exec();
}
運(yùn)行結(jié)果:

2.2元素的插入
對(duì)于任意位置上的slist鏈表元素的插入,可使用insert_after和insert函數(shù),insert_after函數(shù)直接在指定的pos位置后插入新元素。
insert則從單向鏈表的頭節(jié)點(diǎn)開始,找到pos的前驅(qū)位置,然后調(diào)用insert_after函數(shù)進(jìn)行插入,因此執(zhí)行效率比較低。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
一些C語言中字符串的算法問題解決實(shí)例小結(jié)
這篇文章主要介紹了一些C語言中字符串的算法問題解決實(shí)例小結(jié),包括將字符串轉(zhuǎn)化為int類型的數(shù)及旋轉(zhuǎn)字符串等操作,需要的朋友可以參考下2016-03-03
C++ Easylogging++日志庫配置使用超詳細(xì)講解
這篇文章主要介紹了C++ Easylogging++日志庫配置使用,Easylogging++是用于C++應(yīng)用程序的單頭高效日志庫。它非常強(qiáng)大,高度可擴(kuò)展并且可以根據(jù)用戶的要求進(jìn)行配置2022-11-11
c++實(shí)現(xiàn)簡(jiǎn)單隨機(jī)數(shù)的代碼
在本篇文章里小編給大家整理的是一篇關(guān)于c++實(shí)現(xiàn)簡(jiǎn)單隨機(jī)數(shù)的代碼內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)下。2021-05-05
c語言讀取obj文件轉(zhuǎn)換數(shù)據(jù)的小例子
c語言讀取obj文件轉(zhuǎn)換數(shù)據(jù)的小例子,需要的朋友可以參考一下2013-03-03
C++紅黑樹的底層實(shí)現(xiàn)機(jī)制詳解
紅黑樹與AVL樹一樣,也是一種自平衡的二叉搜索樹,它在每個(gè)結(jié)點(diǎn)上增加一個(gè)存儲(chǔ)位表示結(jié)點(diǎn)的顏色,可以是Red或Black,通過對(duì)任何一條從根到葉子的路徑上各個(gè)結(jié)點(diǎn)著色方式的限制,本文介紹了C++紅黑樹的底層實(shí)現(xiàn)機(jī)制,需要的朋友可以參考下2024-08-08
C語言鏈表實(shí)現(xiàn)通訊錄系統(tǒng)課程設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語言鏈表實(shí)現(xiàn)通訊錄系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
C語言中g(shù)etchar(?)?函數(shù)使用詳解
getchar()?字符輸入函數(shù),沒有參數(shù),從輸入緩沖區(qū)里面讀取一個(gè)字,需要注意一次只能讀取一個(gè)字符,這篇文章主要介紹了C語言中g(shù)etchar函數(shù)使用詳解,需要的朋友可以參考下2022-12-12
VSCode多根工作區(qū)功能實(shí)現(xiàn)
VSCode的多根工作區(qū)功能允許在一個(gè)窗口內(nèi)同時(shí)處理多個(gè)文件夾,適用于前后端分離項(xiàng)目、Monorepo項(xiàng)目管理、微服務(wù)架構(gòu)開發(fā)等場(chǎng)景,本文主要介紹了VSCode多根工作區(qū)功能實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2025-12-12

