slist为单向链表的泛化容器,与list双向链表容器一样,实现了线性表数据的链表存储,数据元素不必在物理内存中连续分布。slist链表的节点,只有后继的指针,不含前驱的指针。因此,在节省前驱指针的存储空间的同时,也就不再支持迭代器的反向移动。
-
slist技术原理
slist内部的链表由头指针、头节点和元素节点组成,每个节点含有指向后继节点的指针,最后一个节点的指针为null,可见slist没有形成一个环形回路。
头节点一般不存储数据,为了使各个元素节点都有前驱节点的指针指向它以便能够不加区别的对第一个元素节点和其他元素节点进行统一处理,所以构造头节点。 -
slist应用基础
list对象的创建和vector一样,不多解释。元素的删除、归并、排序与list相同。
2.1初始化赋值和遍历
通常使用push_front函数进行初始化,由于slist的头节点仅有一个指针域保存首元素地址,而没有存放最后一个元素的地址,因此slist没有提供类似的push_back函数能够在容器尾部添加元素。push_front函数在链表首元素前面,插入一个新元素,使之成为首元素。
遍历slist和list一样,只能使用迭代器进行遍历,而不能使用数组下标的形式。
#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,即现在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();
}
运行结果:
2.2元素的插入
对于任意位置上的slist链表元素的插入,可使用insert_after和insert函数,insert_after函数直接在指定的pos位置后插入新元素。insert则从单向链表的头节点开始,找到pos的前驱位置,然后调用insert_after函数进行插入,因此执行效率比较低。