求高手答疑! C++ STL 中list是双向循环链表中循环可以实现什么功能?
我看到说C++STL中list是双向循环链表,双向我可以理解,有两个指针域,指向前一结点和指向后一结点,双向可以实现从末尾结点到头结点的遍历,但循环实现什么功能?#inc...
我看到说C++ STL 中list是双向循环链表,双向我可以理解,有两个指针域,指向前一结点和指向后一结点,双向可以实现从末尾结点到头结点的遍历,但循环实现什么功能?
#include<list>
#include<iostream>
int main()
{
list<int> ilist;
for(int i=0;i<5;++i)
ilist.push_back(i);
list<int>::iterator it=ilist.end();
cout<<*(--it);//输出4
cout<<*(++it);//若为循环链表,不是应该回到头结点吗?实际输出错误!
//若为循环链表,那end()是指向哪里?
return 0;} 展开
#include<list>
#include<iostream>
int main()
{
list<int> ilist;
for(int i=0;i<5;++i)
ilist.push_back(i);
list<int>::iterator it=ilist.end();
cout<<*(--it);//输出4
cout<<*(++it);//若为循环链表,不是应该回到头结点吗?实际输出错误!
//若为循环链表,那end()是指向哪里?
return 0;} 展开
1个回答
展开全部
链表的内存结构是循环的,每一个节点(node)结构,node结构包含一个指向之前节点的指针,另外一个指向之后的节点,以及一个数据元素(你这里是int)——所以一个node结构自己是不知道自己是list中的第几个(没有储存相应的信息)。
但是,最末一个node,它的后指针是指向链表的终结记号,然后终结记号的node也有一个指针,才指向list的第一个node。所以你++it指向的是终结记号,上面是没有数据的,当然输出错误。
说双向的意思是:你可以在首端加入新的数据node,也可以在末端加入新的数据node,但不表示你可以无限循环的遍历它。
另外,List模板,不建议你使用iterator(迭代器),因为每一个node都不知道自己是第几个node,如果你使用迭代器指定你要访问第n个node的数据,它总是从首元素开始一个个数到第n,然后才返回数据给你。最好把链表当作动态的栈来使用,只访问或者增删头端或者尾端的数据,这样速度快。
但是,最末一个node,它的后指针是指向链表的终结记号,然后终结记号的node也有一个指针,才指向list的第一个node。所以你++it指向的是终结记号,上面是没有数据的,当然输出错误。
说双向的意思是:你可以在首端加入新的数据node,也可以在末端加入新的数据node,但不表示你可以无限循环的遍历它。
另外,List模板,不建议你使用iterator(迭代器),因为每一个node都不知道自己是第几个node,如果你使用迭代器指定你要访问第n个node的数据,它总是从首元素开始一个个数到第n,然后才返回数据给你。最好把链表当作动态的栈来使用,只访问或者增删头端或者尾端的数据,这样速度快。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询