簡介
線性表:n(n>=0)個相同特性的數據元素的有限序列,數據元素之間具有線性關係。
線性關係:除第一個元素外,每個元素有且僅有一個前驅;除最後一個元素外,每個元素有且僅有一個後繼。
特點:數據元素之間的關係是它們在數據集合中的相對位置。
存儲結構:
靜態順序存儲:
#define maxSize 100;
typedef 數據元素類型 ElemType;
typedef struct
{
ElemType data[maxSize];
int last;
}SeqList;
動態順序存儲
typedef 數據元素類型 ElemType;
typedef struct{
ElemType *data;
int maxSize;
int last;
}pSeqList;
這種順序存儲結構,無論是靜態分配還是動態分配,存儲空間都是一次性得到的、地址連續的,因此空間的大小是有限制的:maxSize。
所以空間不夠的時候只能申請更大的空間,把原來的數組中的元素複製過來,然後釋放原數組。
申請空間的C語言函數:
void *malloc(size_t size)
void *callo(size_t num,size_t size)
void *realloc(void *ptr,size_t size)
操作
創建空表
靜態的
//靜態的
void create(SeqList &l)
{
l.last = -1;
}
動態的
void Create(pSeqList &l){
l.last = -1;
l.data = new ElemType[maxSize];
if(l.data == NULL){
cerr<<"存儲分配錯誤!"<<Endl;
exit(1);
}
}
求長度
int Length(SeqList l)
{
return (l.last + 1);
}
查找
int Search(SeqList l, ElemType x)
{
int i=0;
if(l.last == -1)
cout<<"所查詢的表爲空";
while(i<=l.last && l.data[i] != x)
i++;
if(i>l.last)
return -1;
else
return i+1;
}
順序存儲的線性表的類定義:
typedef ElemType T;
class SeqList
{
T *data;
int MaxSize;
int last;
public:
SeqList(int sz);
~SeqList(){
delete []data;
}
int Length() const{ //返回元素的個數
return (last + 1);
}
int Search(T &x) const; //返回元素x在表中的位置
void Delete(int i, T &x); //刪除值爲x的元素
int IsEmpty(){ //表空否
return last == -1;
}
int IsFull(){ //判斷是否滿
return last == MaxSize-1;
}
T GetData(int i){ //獲得第i個元素
return data[i-1];
}
T GetPrior(T &x); //取x前驅元素
T GetNext(T &x); //取x的後繼元素
void PrintList(); //輸出線性表
};
成員函數的實現
構造函數
//構造函數,指定sz定義數組的長度
SeqList::SeqList(int sz)
{
if(sz>0)
{
data = new T[sz]; //分配連續空間
if(data != NULL)
{
MaxSize = sz;
last = -1;
}else{
cerr<<"存儲分配錯誤!"<<endl;
exit(1);
}
}
}
查找函數:
返回的是從左往右第一個元素值等於x的元素下標
//順序查找x
int SeqList::Search(T &x)const
{
int i = 0;
if(l.last == -1)
cout<<"所查詢的表爲空"<<endl;
while(i <= last && data[i]!=x)
i++;
if(i>last)
return -1;
else
return i+1;
}
插入元素
//插入元素到第i個位置
void SeqList::Insert(int i, const T &x)
{
if(last == MaxSize-1)
{
cerr<<"順序表已滿,無法插入!"<<endl;
exit(0);
}
if(i<0||i>last+1)
{
cerr<<"參數i越界出錯!"<<endl;
exit(1);
}
for(int j=last; j>i; j++){
data[j+1] = data[j];
}
data[i] = x;
last++;
}
刪除元素
//刪除第i個元素
void SeqList::Delete(int i){
if(i>=0){
for(int j=i; j<last;j++){
data[j] = data[j+1];
}
last--;
cout<<"成功刪除!"<<endl;
}else
cerr<<"下標越界!"<<endl;
}