線性表的順序存儲結構

 

        線性表n(n≧0)個數據元素(結點)a1,a2, …an組成的有限序列。其中數據元素的個數n定義爲表的長度。當n=0時稱爲空表,常常將非空的線性表(n>0)記作:

        (a1,a2,…an)        

     這裏的數據元素ai(1≦i≦n)只是一個抽象的符號,其具體含義在不同的情況下可以不同。

         把線性表的結點按邏輯順序依次存放在一組地址連續的存儲單元裏。用這種方法存儲的線性表簡稱順序表。順序表的特點是,表中邏輯上相鄰的數據元素,存儲時在物理位置上也一定相鄰。換句話說,順序表以數據元素在計算機內物理位置相鄰來表示線性表中數據元素之間在邏輯關係上相鄰

    假設線性表的每個元素需佔用m個存儲單元,並以所佔的第一個單元的存儲地址作爲數據元素的存儲位置作爲參考點。則線性表中第i+1個數據元素的存儲位置Loc(ai+1)和第i個數據元素的存儲位置Loc(ai)之間滿足下列關係:

        Loc(ai+1)=Loc(ai)+m 

 

          順序表的特點是:邏輯關係上相鄰的兩個數據元素在物理位置上也相鄰。順序表的優點是:

  1)節省存儲空間。由於結點之間的相鄰邏輯關係可以用物理位置上的相鄰關係表示,因此不需增加額外的存儲空間來表示此關係(如鏈表則需利用指針來表示邏輯相鄰關係)。

2)隨機存取。

    順序表的缺點是:插入和刪除操作需移動大量數據元素。

以下爲代碼實現部分,以及測驗:

#include<iostream>
#define MaxSize 100
#define LISTINSERTMENT 10

typedef int ElemType;
using namespace std;
class SqList_d
{
private:
    ElemType * elem;
    //ElemType elem_array[MaxSize];//第一種定義;
    int length;
    int ListSize;
public:
    /*線性表的操作:*/
    SqList_d(int n);//構造函數,初始化;
    ~SqList_d();//析構函數,銷燬;
    void SqListInsert(int i,int e);
    int  SqListDelete(int i);
    int SqListLocateElem(int e);//返回數據元素的數值i(按值查找)
    int SqListGetElem(int i);//返回第i個數據元素的值(按位查找);
    void printlist();//打印數組;
    void SqListAdd();// 增加數組
    int getLength();// 獲得長度;
};
SqList_d::SqList_d(int n)
{//構造長度爲0,容量爲n的。。
    elem = new int [n];
    length =0;
    ListSize=n;
}
SqList_d::~SqList_d()
{//釋放表空間;
    delete [] elem;
    length=0;
    ListSize=0;
}
void SqList_d::SqListInsert(int i,int e)
{//將e插入第i個位置
 if(i<1||i>length)
 {
     cout<<"插入位置異常"<<endl;
     return;
 }
 if(length>=MaxSize)
 {
     int *elem1=new int [ListSize+LISTINSERTMENT];
     for(int i=0;i<length;i++)
     {
         elem1[i]=elem[i];
     }
     delete elem;
     elem=elem1;
     ListSize+=LISTINSERTMENT;
 }
     int *p = &elem[i-1],*q=&elem[length-1];
     for(;q >= p;q--)
     {
         *(q+1)=*q;
     }
     *p=e;
     length++;
 }

int SqList_d::SqListDelete(int i)
{//刪除第i個數
    int e;
    if(length==0)
    {
        cout<<"下溢"<<endl;
        return -1;
    }
    if(i<0||i>length)
    {
        cout<<"刪除位置異常"<<endl;
        return -1;
    }
    e=elem[i-1];
    int *p=&elem[i-1],*q=&elem[length-1];
    for(;p<q;p++)
    {
        *(p-1)=*p;
    }
    length--;
}
int SqList_d::SqListLocateElem(int e)
{//返回e的位置
    for(int i=0;i<length;i++)
    {
        if(elem[i]==e)
            return i+1;
    }
    return 0;
}
int SqList_d::SqListGetElem(int i)
{//獲得第i個位置的數
    if(i<1||i>length)
    {
        cout<<"位置不合法"<<endl;
        return -1;
    }
    return elem[i-1];
}
void SqList_d::printlist()
{
    if(length == 0){
        cout<<" nothing "<<endl;
    }
    else
    {
        for(int i = 0;i < length;i++)
        {
            cout<<elem[i]<<" " ;
        }cout<<endl;
    }}
int SqList_d::getLength()
{
    return length;
}
void SqList_d::SqListAdd()
{
    int e;
    cout<<"please input the "<<length <<"th number:";
    cin >> e ;
    elem[length] = e;
    length++;
}
int main()
{
    SqList_d lista(5);
    lista.printlist();
    cout<<"length: "<<lista.getLength()<<endl;
    lista.SqListAdd();
    lista.SqListAdd();
    cout<<"length: "<<lista.getLength()<<endl;
    lista.SqListInsert(1,3);
    lista.SqListInsert(1,4);
    lista.SqListInsert(2,5);
    lista.SqListInsert(3,6);
    lista.printlist();
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章