線性表之順序表

2021-07-04 18:31:23 字數 3229 閱讀 2907

線性表

我們都知道是一種常用的資料結構,也是歷來各種考試的重點。今天抽了一些時間把線性表做了總結。

線性表是n個資料元素的乙個有限序列。用公式表示為:

l=(a1,a2,a3,a4,...........an)

因為線性表是乙個有限的序列,所以也如上面公式所示,它的各個元素是相繼排放的。那麼它的每個相連的兩項之間都是有乙個邏輯關係。那就是直接前驅和直接後繼的關係。我們說除了第乙個表項外,所有表項都有直接前驅。除了最後乙個表項外。所有表項都有直接後繼。線性表是唯一存在著這種關係的結構。線性表至多擁有乙個直接前驅,乙個直接後繼。這就是線性表的基本特點了。

下面重點說順序表。

順序表

我們都知道線性表按照其儲存表示不同,分為順序表和煉表。所謂順序表就是以陣列作為儲存結構的。(鍊錶後面再說)。那麼該如何定義呢??簡單來說,順序表是按其邏輯順序從指定的位置開始的一塊連續儲存區域。如果實在不能理解就是可以模擬陣列。順序表的各個表項的邏輯順序與其物理順序是一致的。也就是說第n個表項儲存在第n個物理位置。另外,順序表最重要的特點就是它是支援順序訪問,也支援隨機訪問。怎麼理解兩種訪問呢。第一,順序訪問:也就是從第乙個表項開始逐次遍歷,直到找到目標表項。而隨機訪問呢。就不言而喻了。就是不需遍歷。直接訪問元素。一般通過下標來直接確定。非常便捷。時間複雜度是o(1);

剛才說了。順序表可以用陣列來表示。那麼原理是什麼呢。其實很簡單。我們只需申請一塊陣列空間就行了。要注意陣列的大小不能小於表項的個數。順序表的第乙個表項儲存在陣列的第乙個位置,也就是第0的位置。。

依次類推。那麼第n個表項就儲存在陣列的第n-1個地方。書上有個公式比較準確的可以描述:

loc(i)=loc(1)+n-1*sizeof(t);

那麼怎樣用**來表示呢。

可以這樣來做

typedef struct list;

上面的**是靜態儲存表示。這個儲存是有bug的。如果表項的數量比預設陣列的大小要大。那麼就會溢位。最好的是設乙個動態的儲存表示

typedef struct 

list;

下面給出順序表的完整實現過程:

#ifndef linerlist_h

#define linerlist_h

template class linerlist;

#endif

#ifndef seqlist_h

#define seqlist_h

#include #include #include using namespace std;

const int defaultsize = 100;

template class seqlist

void resize(int newsize);

int size() const

int length()const

int search(t &x) const;

int locate(int i) const;

bool getdata(int i,t&x) const

else return false;

} void setdata(int i, t &x)

} bool insert(int i, t &x);

bool remove(int i, t &x);

bool isempty()

bool isfull()

void sort();

void input();

void output();

seqlistoperator = (seqlist&l);

friend istream& operator >> (istream &in, seqlist&r)

return in;

} friend ostream& operator << (ostream &out, seqlist&r)

return out;

}};template seqlist::seqlist(int sz) }}

template seqlist::seqlist(seqlist&l)

for (int i = 1; i <= last+1; i++) data[i-1] = *(l.getdata(i));

}templatevoid seqlist::resize(int newsize)

if (newsize != maxsize)

int n = last;//改

t *srcptr = data;

t *destptr = newarray;

while (n--) *destptr++ = *srcptr++;

delete data;

data = newarray;

maxsize = newsize; }}

templateint seqlist::search(t &x)const

return 0;

}templateint seqlist::locate(int i)const

templatebool seqlist::insert(int i, t &x)

templatebool seqlist::remove(int i, t &x)

templatevoid seqlist::sort()

} }}templatevoid seqlist::input()

else if (last > maxsize-1)

else break;

} cout << "\ninput the data for each element to create the list:" << endl;

for (int i = 0; i <= last; i++)

}templatevoid seqlist::output()

templateseqlistseqlist::operator = (seqlist&l)

for (int i = 1; i <= last+1; i++) data[i-1] = l.getdata(i);

}#endif

#include#include#include"seqlist.h"

using namespace std;

int main()

cout<

線性表之順序表

資料結構草草學過,不過沒有認真運用過。雖然知道一些最為基本的抽象型別及一些常用操作,不過叫我把這些基本的演算法寫出來我也 是寫不出來的。因為常說資料結構 演算法是乙個程式設計師最基本的素質,所以這次認真加以複習。在複習的同時我盡量將自己學習的其他的 一些基本知識比如c 中的物件導向思想也引入進來,同...

線性表之順序表

線性表的操作 initlist l 初始化操作,建立乙個空的線性表l。listempty l 判斷線性表是否為空表,空返回true,否則返回false。clearlist l 將線性表清空。getelem l,i,e 將線性表l中的第i個位置元素值返回給e。listdelete l,i,e 刪除線性...

線性表之順序表

一 線性表的定義 從邏輯結構的角度來講,線性表中各個元素之間是唯一的 並且有序排列的關係。從儲存結構的角度來看,線性表的具體實現過程中可採用順序儲存結構和鏈式儲存結構。順序儲存結構的線性表稱為順序表,鏈式儲存結構的線性表分為單鏈表和雙鏈表。二 順序表 include stdafx.h include...