前面我寫了幾節二叉樹,現在想想還是回過頭來吧線性表寫了
c++裡提供了強大的stl(標準模板庫),而且很多大神和相關書籍多提倡我們使用stl,切勿盲目自己寫,這樣反而效率更低。但是在使用stl的同時,能夠了解如何實現簡單的stl是很爽的。
c++程式常用的資料描述方式是陣列描述和鏈式描述,而線性表可以用來說明這兩種方法。stl容器大致相當於線性表的陣列描述方式和鏈式描述方式,當然stl還有很多其他的方法,這裡就不介紹了。
線性表也叫作有序表,它的每乙個例項都是元素的乙個有序集合
當我們在寫資料結構的時候我們首先想到可能是如何建立,然後是它有什麼操作。
建立 : 因為是利用陣列來儲存元素,用的也是陣列型別
當建立好乙個線性表的時候,它應該有如下操作:
向線性表新增元素
銷毀乙個線性表
判斷線性表是否為空
確定線性表的長度
按給定的索引查詢乙個元素
安給定的元素查詢第乙個出現該元素的索引
按給定的索引插入乙個元素
從左到右順序輸出線性表元素 ….
也有人說是不是操作過多,放在同乙個類裡,會不會造成**太複雜,擁擠,這裡我們不考慮這些,只是單純的實現這些操作
class arraylist
//adt實現
void add(t theelement); // 向尾部新增元素
bool empty() const // 判斷是否為空
int size() const ; // 返回陣列中元素的個數
t& get(int theindex) const; // 根據索引獲取元素
int indexof(const t& theelemet) const; // 返回陣列中第乙個出現的下標
void erase(int theindex); // 刪除操作
void insert(int theindex, t& theelemet); // 插入操作
void output() const; // 輸出操作
bool equal(const arraylist& thelist) const; // 判斷兩個線性表是否相等
// 返回鍊錶中可以放置的元素個數
int capacity()
// 倍增陣列
void changelengthld(t* &a, int oldlength, int newlength);
private:
// 檢查下標是否過界
bool checkindex(int theindex)
t* element; // 儲存一元陣列的容器
int arraylength; // 一維陣列的容量
int listsize; // 線性表的元素個數
};
《c++程式設計思想》裡說道,模板定義很特殊。由template<…> 處理的任何東西都意味著編譯器在當時不為它分配儲存空間,它一直處於等待狀態直到被乙個模板例項告知。在編譯器和聯結器的某一處,有一機制能去掉指定模板的多重定義。所以為了容易使用,幾乎總是在標頭檔案中放置全部的模板宣告和定義。
template
arraylist::arraylist(int initialcapacity)
template
arraylist::arraylist(const arraylist& thelist)
template
void arraylist::add(t theelement)
else
}template
t& arraylist::get(int theindex) const
return element[theindex];
}template
int arraylist::indexof(const t& theelemet) const
return -1;
}template
void arraylist::erase(int theindex)
copy(element + theindex + 1, element + listsize, element + theindex);
listsize--;
}template
void arraylist::insert(int theindex, t& theelemet)
if(listsize == arraylength)
copy(element + theindex, element + listsize, element + theindex + 1);
element[theindex] = theelemet;
listsize++;
}template
void arraylist::output() const
template
void arraylist::changelengthld(t* &a, int oldlength, int newlength)
delete a;
a = new t[newlength];
arraylength = newlength;
for(int i = 0; i < listsize; i++)
}template
bool arraylist::equal(const arraylist& thelist) const
}return equal;
}
實現的**都是很簡單的,這裡主要講下本文插入元素和刪除元素中的思路,在**中我們用到了copy函式,這裡假設陣列元素為: 1, 2, 3, 4, 5 ,6, 7, 8
當我們在元素』4』的後面插入乙個』0』,』4』之後的每乙個元素都要順序往後面移一位,copy()在這時就簡化了**量。
(其中copy的定義outputit copy( inputit first, inputit last, outputit d_first )
)
vector是stl提供的乙個基於陣列的類,他不僅包含了上述介紹的全部方法,還增加了很多其它的方法,有興趣的可以自己去看文件。例如:它沒有get,而與之相應的是operator(當然還有其他的), 。
陣列描述的優點在於令人滿意的時間效能
陣列描述的缺點是空間利用率低,如果造成記憶體不足,可能是動態陣列空間分配失敗或者陣列長度倍增失敗所致。
資料結構之線性表(C ) 鏈式描述
一般分為單鏈表,雙鏈表和迴圈鍊錶 單向或雙向 單鏈表結構是每個節點只有乙個鏈,例如 迴圈鍊錶是單鏈表的一種變種,單鏈表是將尾節點置為null,而迴圈鍊錶是將尾節點指向頭結點。定義節點的結構 template struct chainnode chainnode const t element cha...
資料結構 線性表之陣列
什麼叫陣列 陣列 array 是一種線性表資料結構。它是一組連續的記憶體空間,來儲存一組具有相同型別的資料。什麼線性表跟非線性表 線性表 通俗一點就是資料像一條線一樣排成的結構,線性表上的資料只有前後兩個方向,另外像鍊錶,佇列,棧等也是線性表的資料結構。非線性表 像二叉樹,圖,堆等,資料之間不只是前...
資料結構之線性表(C)
1 預定義狀態碼 define true1 define false0 defineok1 define error0 define infeasible 1 define overflow 2 2 預定義常量 define list init size 100 線性表容量 define listi...