【C++】STL——list(链表)

先放个链接,以后再看:
【C++】STL常用容器总结之四:链表list
【STL】list基础

以下问答摘自百度:

问:
C++STL的list插入时,如何对链表中间的任意位置插入元素:
不要说这样:
a.insert(++a.begin(),5,100); 这只能在链表中第一个元素后插入第二个元素,第三个就没办法了。
还有读表中任意一个元素怎么读(一次性的),不要说
list::iterator j;
for(j=a.begin();j!=a.end();j++)
cout<<*j<

答:
没有直接根据第几个元素来插入的函数,不过可以这样来插入第n个元素

list< int >::iterator j = a.begin();
for(i = 0; i < n && j!= a.end(); ++i)
	++j;
a.insert(j,5,100);

读任意一个元素也可以用同样方法

追问:
为什么这里用!=而不是< ?
还有++i和++i在这里没区别吧?

追答:
因为j是list::iterator类型,本质上是一个指针,对于list来说相邻两个结点的地址大小是不可预计的,而只能判断是否相等,因此list::iterator没有定义operator <,如果是vector则可以用<,因为vector是顺序存储。
在这里i++个++i效果是一样的,但是++i比i++性能更好,i++先使用i后i加加,需要另外开辟内存来存储i的值,而++i只需把i本身加1然后返回即可。

题目:

模拟线性表:

INIT 初始化线性表
PRINT 输出一行:从头到尾输出线性表每一个元素,每个元素尾随一个空格
ADD x value 把value插入到线性表的第x个位置,如果x超过线性表的元素个数,则把value作为线性表最后一个元素。
DELETE x 删除线性表的第x个元素,如果x超过线性表的元素个数,则不做任何处理。
LENGTH 输出当前线性表的元素个数

线性表的首元素位置定义为1,它后面的元素的位置定义为2,以此类推。

线性表的元素都是整数,且绝对值小于10000。

Sample Input
11
INIT
ADD 1 5
ADD 1 4
ADD 1 3
LENGTH
ADD 1 2
ADD 1 1
PRINT
DELETE 5
LENGTH
PRINT

Sample Output
3
1 2 3 4 5
4
1 2 3 4

Code

#include
#include
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    int n,k=0,c,d;
    list<int>b; //定义
    list<int>::iterator iter; //迭代器
    char a[8]={};
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a;
        if(a[0]=='I')
            b.clear(); //清空链表
        else if(a[0]=='A'){
            cin>>c>>d;
            if(c>b.size())
                b.push_back(d); //将元素d加入到链表末尾
            else if(c<1)continue;
            else{
                iter=b.begin();
                for(int j=1;j<c;++j)
                    ++iter;
                b.insert(iter,d); //将元素d插入到链表的第c个位置
            }
        }
        else if(a[0]=='L')
            cout<<b.size()<<endl;  //返回链表元素个数
        else if(a[0]=='P'){
            for(iter=b.begin();iter!=b.end();iter++)
                cout<<*iter<<' '; //按顺序输出链表中的元素
            cout<<endl;
        }
        else if(a[0]=='D'){
            cin>>c;
            if(c>b.size()||c<1)continue;
            iter=b.begin();
            for(int j=1;j<c;++j)
                ++iter;
            b.erase(iter);  //删除链表的第c个元素
        }
    }
    return 0;
}

你可能感兴趣的:(C/C++学习笔记)