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使用,只訪問或者增刪頭端或者尾端的數據,這樣速度快。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM