資料結構之線性表 C 陣列描述

2021-07-23 08:33:18 字數 3377 閱讀 3881

前面我寫了幾節二叉樹,現在想想還是回過頭來吧線性表寫了

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...