資料結構篇 線性表

2021-10-02 08:26:51 字數 4028 閱讀 3658

熱門**網 m.v1122.com

線性表的抽象資料型別的定義:

adt 線性表(list)

data

線性表的資料物件集合為,每個元素的型別均為datatype。其中,除了第乙個元素a1外,每乙個元素有且只有乙個直接前驅元素,除最後乙個元素an外,每乙個元素有且只有乙個直接後繼元素。資料元素之間的關係是一對一的關係。

operation

initlist(*l):初始化操作,建立乙個空的線性表。

listempty(l):若線性表為空,返回true,否則返回false。

clearlist(*l):線性表清空。

getelem(l,i,*e):將線性表l中第i個位置元素返回給e。

listdelete(*l,i,*e):刪除線性表l中的第i個元素,並用e返回其值

listlength(l):返回線性表l的元素個數。

printlist(l):列印線性表

對於不同的應用,線性表的基本操作是不同的,上述操作是最基本的。

對於實際問題中涉及的關於線性表的更複雜操作,完全可以用這些基本操作的組合來實現。

順序表,一般使用陣列實現,事實上就是在記憶體中找個初始位址,然後通過佔位的形式,把一定連續的記憶體空間給佔了,然後把相同資料型別的資料元素依次放在這塊空地中,陣列大小有兩種方式指定,一是靜態分配,二是動態擴充套件。

線性表我用類模板來實現,提高實用性

const int maxx=100;

template class seqlist

;//無引數的建構函式

seqlist(datatype a,int n);//有引數的建構函式

~seqlist(){}//析構函式,直接析構。

int _lenght()//返回鍊錶的當前長度。

datatype _getvalue(int i);//得到第i個元素的值

int _location(datatype data1);//返回元素value的位置

void _insert(int i,datatype value);//插入乙個引數

datatype _delete(int i);//刪除乙個元素

void _printf();//遍歷線性表的每乙個元素。

};

順序表的封裝需要三個屬性:

儲存空間的起始位置。陣列data的儲存位置就是線性表儲存空間的儲存位置

線性表的最大儲存容量。陣列長度maxx

線性表的當前長度。length

注意:陣列的長度與線性表的當前長度是不一樣的。陣列的長度是存放線性表的儲存空間的總長度,一般初始化後不變。而線性表的當前長度是線性表中元素的個數,是會改變的。

通過陣列初始化有參建構函式

template seqlist::seqlist(datatype a,int n)

資料的刪除操作

template datatype seqlist::_delete(int i)

,m=10;

seqlistp(a,m);

p._insert(5,13);

p._insert(12,20);

cout《優點:

隨機訪問特性,查詢o(1)時間,儲存密度高;

邏輯上相鄰的元素,物理上也相鄰;

無須為表中元素之間的邏輯關係而增加額外的儲存空間;

缺點:

插入和刪除需移動大量元素;

當線性表長度變化較大時,難以確定儲存空間的容量;

造成儲存空間的「碎片」

線性表的鏈式儲存結構的特點是用一組任意的儲存單元儲存線性表的資料元素,這組儲存單元可以是連續的,也可以是不連續的。這就意味著,這些元素可以存在記憶體未被占用的任意位置,鍊錶的定義是遞迴的,它或者為空null,或者指向另乙個節點node的引用,這個節點含有下乙個節點或鍊錶的引用,線性鍊錶的最後乙個結點指標為「空」(通常用null或「^」符號表示)

儲存的實現

結點由存放資料元素的資料域和存放後繼結點位址的指標域組成。

struct  node  //結點結構

;

單鏈表的類的實現

class linklist

;

無引數構造

只生成乙個乙個空的頭結點。**實現:

linklist::linklist()//構建空鍊錶

有引數的構造———頭插法構造

頭插法是每次將新申請的結點插在頭結點後面 ,**實現:

linklist::linklist(int a,int n)//頭插法插入鍊錶

}

有引數的構造———尾插法構造

尾插法就是每次將新申請的結點插在終端節點的後面 ,**實現:

linklist::linklist(int a,int n)//尾插法就是每次將新申請的結點插在終端節點的後面 

p->next=null;//鍊錶的最後乙個節點的指標為空。

}

析構函式

單鏈錶類中的結點是用new申請的,在釋放的時候無法自動釋放,所以,析構函式要將單鏈表中的結點空間釋放。

linklist::~linklist()

}

計算鍊錶的長度

單鏈表中不能直接求出長度,所以我們只能將單鏈表掃瞄一遍,所以時間複雜度為o(n)。

int  linklist::_length()

return count;

}

查詢第i個元素的值

單鏈表中即使知道節點位置也不能直接訪問,需要從頭指標開始逐個節點向下搜尋,平均時間效能為o(n)

int linklist::_get(int i)

if(p==null)

查詢元素a,返回元素的位置

單鏈表中按值查詢與順序表中的實現方法類似,對鍊錶中的元素依次進行比較,平均時間效能為o(n)

int linklist::_locate(int num)

return 0;

}

插入元素

單鏈表在插入過程中需要注意分析在表頭、表中間、表尾的三種情況,由於單鏈表帶頭結點,這三種情況的操作語句一致,不用特殊處理,時間複雜度為o(n)。

void  linklist::_insret(int i,int num)//i表示第i個元素,元素的值為num.

//單鏈表在插入過程中需要注意分析在表頭、表中間、表尾的三種情況,由於單鏈表帶頭結點,

//這三種情況的操作語句一致,不用特殊處理,時間複雜度為o(n)

if(p==null) cout<<"錯誤";

else

}

刪除操作

刪除操作時需要注意表尾的特殊情況,此時雖然被刪結點不存在,但其前驅結點卻存在。因此僅當被刪結點的前驅結點存在且不是終端節點時,才能確定被刪節點存在,時間複雜度為o(n) .

int  linklist::_delete(int i)

if(p==null)

else

}

遍歷元素

遍歷單鏈表時間複雜度為o(n) .

void linklist::_print ()

}

//本節點參考了如下文章:

----------

資料結構篇 線性表

線性表的定義 由零個或多個資料元素組成的有限序列。關鍵點 首先它是乙個序列,也就是說元素之間是有個先來後到的。若元素存在多個則第乙個元素無前驅,最後乙個元素無後繼,其他元素都有且只有乙個前驅和後繼。線性表強調是有限的,事實上無論計算機發展到多強大,它所處理的元素都是有限的 抽象資料型別 資料型別 是...

學習篇 線性表的資料結構

adt list data object set datatype int float 前驅元素,後繼元素。元素之間的關係是一對一的。operation initlist l 初始化操作,建立空線性表l listempty l 判斷線性表是否為空,l為空則返回true clearlist l 清空線...

演算法與資料結構線性表篇

1.刪除長度為n的順序表的第i個資料元素之前需要移動元素中的n i個元素。2.對長度為n的線性表採用順序查詢,在等概率的條件下,查詢成功的平均檢索長度為 n 1 2。在長度為n的順序表中刪除第i 1 i n 個資料元素時需要移動n i個元素,在長度為n的順序表中的第i 1 i n 個元素之前插入乙個...