1. 程式人生 > >C++資料結構之線性表

C++資料結構之線性表

InitList( ):初始化順序表

Insert(int L,int Elem):在L位置插入值Elem1.檢查記憶體空間是否夠,如果實際長度大於或等於最大容量,則要用realloc擴充套件記憶體空間2.判斷插入的位置L是否合法3.如果插入到表頭或表中,則要把元素往後挪。如果插入到表尾,直接賦值。長度加一Delete(int L):刪除L位置上的元素1.檢查線性表是否為空2.判斷位置是否合法3.取出L位置的值,作為返回值4.把後邊的元素往前移,長度減一Locate(int Elem):返回Elem的位置GetElem(int L):返回L位置上的值ListLength( ):返回線性表的長度ListEmpty( ):返回布林值,線性表空返回真,不空返回假
class SqList{
private:
    int *Head;//順序表的首地址
    int length;//實際長度,從1開始
    int MaxSize;//最大長度,超過這個數就要擴充套件申請的記憶體空間
public:
    SqList(int N);
    ~SqList();
    void InitList();//初始化線性表
    bool ListEmpty();//是否為空
    int ListLength();//線性表的長度
    int GetElem(int L);//獲取某個位置的值
    int Locate(int Elem);//某個值的位置
    int Insert(int L,int Elem);//插入
    int Delete(int L);//刪除
    };
SqList::SqList(int N)
{
    MaxSize=N;
    length=0;
    Head=(int*)malloc(N*sizeof(int));//申請一塊記憶體
}
SqList::~SqList()
{
    free(Head);
    MaxSize=0;
    length=0;
}
void SqList::InitList()
{
    cout<<"請輸入所有的數值:"<<endl;
    for (int i=0;i<MaxSize;i++)
    {
        cin>>*(Head+i);
        length++;
    }
}
bool SqList::ListEmpty()
{
    if(!length)//length==0時返回真
        return true;
    else
        return false;
}
int SqList::ListLength()
{
    return length;
}
int SqList::GetElem(int L)
{
    if (L<1||L>length)
    {
        cout<<"位置不合法"<<endl;
        return -1;
    }
    return *(Head+L-1);
}
int SqList::Locate(int Elem)
{
    for (int i=0;i<length;i++)
    if (Head[i]==Elem)
        return i+1;
    cout<<"無法找到"<<endl;
    return -1;
}
int SqList::Delete(int L)
{
    int j,elem;
    if (length==0)
    {
        cout<<"下溢"<<endl;
        return -1;
    }
    if (L<1||L>length)
    {
        cout<<"位置不合法"<<endl;
        return -1;
    }
    elem=*(Head+L-1);
    for (j=L-1;j<length-1;j++)
    {
        *(Head+j)=*(Head+j+1);//等於後一位的值
    }
    length--;
    return elem;
}
int SqList::Insert(int L,int Elem)
{
    int j;
    if (length>=MaxSize)//如果空間不夠,就要擴大申請的記憶體
    {
        Head=(int*)realloc(Head,MaxSize*2*sizeof(int));
        MaxSize+=MaxSize;
    }
    if (L<1||L>length+1)
    {
        cout<<"位置錯誤,無法插入"<<endl;
        return -1;
    }
    if (L!=length+1)
        //把L-1及之後的元素往後挪
        for (j=length-1;j>=L-1;j--)
        {
            *(Head+j+1)=*(Head+j);//等於前一個的值
        }
    *(Head+L-1)=e;
    length++;
    return 0;
}