大家都喜歡用數組,因爲數組方便。
但也有一些人喜歡用鏈表,因爲鏈表能利用零散的內存空間。
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個結點的地址。
時間複雜度爲…………
額,不好意思我不會算,不過我想應該和冒泡排序一樣吧。