C++ STL 中list是双向循环链表中循环可以实现什么功能?

C++ STL 中list是双向循环链表,双向可以理解,有两个指针域,指向前一结点和指向后一结点,双向可以实现从末尾结点到头结点的遍历,但循环实现什么功能?

错误代码:

#include<list>
#include<iostream>
int main()
{
    list<int> li;
    for(int i=0;i<5;++i)
        li.push_back(i);
    list<int>::iterator it=li.end();
    cout<<*(--it);//输出4
    cout<<*(++it);//若为循环链表,不是应该回到头结点吗?实际输出错误!
    //若为循环链表,那end()是指向哪里? 
    return 0;
} 

 

 

链表的内存结构是循环的,每一个来节点(node)结构,node结构包含一个指向之前节点的指针,另外一个指向之后的节点,以及一个数据元素(你这里是int),所以一个node结构自己是不知道自己是list中的第几个(没有储存相应的信息)。
但是,最末一个node,它的后指针是指向链表的终结记号,然后终自结记号的node也有一个指针,才指向list的第一个node。所以,++it指向的是终结记号,上面是没有数据的,当然输出错误。
说双向的意思是:你可以在首端加入新的数据node,也可以在末端加入新的数据node,但不表示你可以无限循环的遍历它。
另外,List模板,不建议你使用iterator(迭代器),因为每一个node都不知道自己是第几个node,如果你使用迭代器指定你要访问第n个node的数据,它总是从首元素开始一个个数到第n,然后才返回数据给你。最好把链表当作动态的栈来zhidao使用,只访问或者增删头端或者尾端的数据,这样速度快。

posted @ 2020-05-26 05:54  立体风  阅读(2075)  评论(0编辑  收藏  举报