線性表的兩種實現 順序表和煉表 C

2021-07-12 03:02:42 字數 3360 閱讀 9567

#ifndef adt_h

#define adt_h

//線性表adt

template class list //賦值運算子

list(const list&){} //複製建構函式

public:

list(){} //預設建構函式

virtual ~list(){} //析構函式

//清空所有元素

virtual

void clear() = 0;

//在當前位置插入元素item

virtual

void insert(const e& item) = 0;

//list尾部新增乙個元素

virtual

//刪除並返回當前位置的元素

virtual e remove() = 0;

//設定當前位置為list的開始位置

virtual

void movetostart() = 0;

//設定當前位置為list的末尾位置

virtual

void movetoend() = 0;

//當前位置左移乙個位置,不改變元素

virtual

void prev() = 0;

//當前位置右移乙個位置,不改變元素

virtual

void next() = 0;

//返回元素數量--即獲取長度

virtual

int length() const = 0;

//返回當前元素位置

virtual

int currpos() const = 0;

//設定當前位置

virtual

void movetopos(int pos) = 0;

//獲取當前元素

virtual

const e& getvalue() const = 0;

};#endif

#include "adt.h"

template

class alist : public list

~alist() //析構函式

void clear()

//在當前位置插入 it 元素

void insert(const e& it)

//末尾新增元素

assert(listsize < maxsize, "list capacity exceeded");

listarray[listsize++] = it;

}//刪除並返回當前位置的元素

e remove()

void movetostart() //位置重置為start位置

void movetoend() //位置重置為end位置

void prev(); //上乙個元素位置

void next(); //下乙個元素位置

//返回list元素個數

int length() const ;

//返回當前元素位置

int currpos() const ;

//設定當前list位置為 pos

void movetopos(int pos)

//獲取當前位置元素

const e& getvalue() const

};

#include

"adt.h"

//單鏈表結點定義

template

class link

link(link

* nextval =

null)

};template

class llist: public

list

//清空所有元素

void removeall()

}public:

llist(int size = de****esize) //建構函式

~llist() //析構函式

void print() const; //print list

void clear() //clear list

void insert(const e& it)

tail = tail->next =

newlink

(it, null);

cnt++;

}e remove()

//移動至鍊錶開始位置

void movetostart()

//移動至鍊錶尾端

void movetoend()

//上乙個節點

void prev()

curr = temp;

}//下乙個節點

void next()

//返回長度

int length() const

//鍊錶當前位置

int currpos() const

return i;

}//移動至鍊錶的pos位置

void movetopos(int pos)

//獲取當前元素

const e& getvalue() const

};

空間方面:

順序表的缺點:大小事先固定。雖然便於分配空間,但是元素只有少數的幾個時造成空間的浪費。

鍊錶的優點:只有實際在鍊錶中的物件需要空間,只要存在可用的記憶體空間分配,鍊錶中元素的個數沒有限制。

隨機訪問元素:

取出線性表中第i個元素這樣的按位置隨機訪問,使用順序表更快些;通過next和prev可以很容易調整當前位置向前或向後,這兩種操作需要的時間為o(1)。

相比之下,單鏈表不能直接訪問前面的元素,按位置只能從表頭(或者當前位置)開始,直到找到那個特定的位置。假定表中每個位置是由prev和movetopos平均訪問到的,那麼訪問線性表第i個元素的操作所需的平均情況下時間和最差情況下時間都是o(n)。

插入和刪除元素:

給出指向鍊錶中合適位置的指標後,insert和remove函式所需要的時間僅為o(1)。

而順序表必須在陣列內將其餘元素向前或向後移動。這種方法所需的平均情況下時間和最差時間均為o(n)。

對於許多應用,插入和刪除是最主要的操作,因此他們的時間效率是舉足輕重的。僅就這個原因而言,鍊錶往往比順序表更好。

線性表的兩種實現

最近新學了資料結構的線性表,這裡先簡單的介紹一下。線性表是最基本 最簡單 也是最常用的一種資料結構。線性表中資料元素之間的關係是一對一的關係,即除了第乙個和最後乙個資料元素之外,其它資料元素都是首尾相接的 注意,這句話只適用大部分線性表,而不是全部。比如,迴圈鍊錶邏輯層次上也是一種線性表 儲存層次上...

線性表(順序表 鍊錶)

在程式中,經常需要將一組 通常是同為某個型別的 資料元素作為整體管理和使用,需要建立這種元素組,用變數記錄他們傳進傳出函式等。一組資料中包含的元素個數可能發生變化。對於這種需求,最簡單的解決方案就是將這樣一組元素看成乙個序列,用元素在序列裡的位置和順序,表示實際應用中的某種有意義的資訊,或者表示資料...

C語言,線性表 順序表 鍊錶

c語言資料結構中兩個常見的線性表,用來儲存資料等 一 建立順序表 定義 將線性表中的元素相繼存放在乙個連續的儲存空間中。可利用一維陣列描述儲存結構 特點 線性表的順序儲存方式 遍歷 順序訪問,可以隨機訪問 順序表 include define maxsize 100 定義陣列長度 define ok...