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