鏈表?數組?合二爲一

大家都喜歡用數組,因爲數組方便。

但也有一些人喜歡用鏈表,因爲鏈表能利用零散的內存空間。

       C++提供了鏈表和數組合二爲一的可能——類和重載運算符。

               把鏈表的頭指針作爲類的成員,有參構造的時候,創建鏈表;

               重載[ ]運算符,使之像數組;

但是永遠不要忘記鏈表和數組最大的不同——鏈表元素的內存單元是不連續的,因此無法通過內存的加減運算得到下一個元素的地址,只能通過指向下一個結點的指針來訪問。

#include<iostream> 
using namespace std;
class listArray
{
private:
	listArray* next;		//鏈表的核心結構,next指針 
public:
	int data;		//數據當然是公有的,數組的數據也是這樣 
	listArray(){}		//無參構造函數,後面要用 
	listArray(int n)	//帶參構造函數,參數爲數組長度 
    {
    	int i;
    	listArray*tmp;
    	this->next=tmp=new listArray();		//眼熟吧?鏈表的構造方式 
    	for(i=0;i<n-1;i++)
    	{
    		tmp->next=new listArray();
    		tmp=tmp->next;
		}
	}
	listArray& operator[](int n)	//重載[]運算符,和數組一樣的訪問方式 
	{
		int i;
		listArray* tmp=this->next;
		for(i=0;i<n;i++)
		{
	    	tmp=tmp->next;
	    }
	    return (*tmp);
	}
};
int main()
{
	listArray list(10);
	for(int i=0;i<10;i++)
		list[i].data=i*i;
	for(int i=0;i<10;i++)
		cout<<list[i].data<<' ';
	return 0;
 } 

list[i].data,這看起來是不是和數組的用法一樣呢?

 

得到的輸出當然是沒問題的      

但是花的時間有點多。

上面只是簡單地提供了鏈表與數組結合的實現,這很有意思。

        但是不可忽視的是,這樣的結合方式在運行時極其耗費CPU。

        因爲每訪問一個結點都是從第一個結點開始的,訪問第n個結點需要依次遍歷過去,才能得到第n個結點的地址。

        時間複雜度爲…………

額,不好意思我不會算,不過我想應該和冒泡排序一樣吧。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章