順序存儲的線性表

簡介

線性表: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章