線性表的順序儲存C++程式碼

2023-03-01 21:01:19

 我學習順序表時找不到相關的程式碼,以及我不清楚寫一個線性表需要的知識,當我寫出來可以使用的線性表我就把這些內容貼了出來。

前置知識點:結構體,常數指標,new和delete

順序表的特點:

  1. 需要一片連續的儲存空間
  2.  邏輯上相連的資料的儲存位置也是相鄰的。

所以如果我們想要建立一個順序表我們需要做兩件事:

  1. 向系統申請一片空間供陣列使用。
  2. 建立一個指標記錄空間地址。

而刪除順序表就是把空間釋放,並讓指標指向空。

順序表的建立和銷燬:

#include<iostream>
#include<cstdlib>
#define EleType int//方便日後使用
#define Maxsize 1000
using namespace std;

//定義結構體
struct sql{
    int* elem;
    int len;//防止越界存取
};


//初始化
void InitList(sql &l)
{
    l.elem=new int [Maxsize];
    if(!l.elem) cout<<"申請空間失敗"<<endl;
    l.len=0;
}

//銷燬線性表
void DestroyList(sql &l)
{
    delete [] l.elem;
    l.elem=nullptr;
}

int main()
{
    sql l;
    InitList(l);
    return 0;

}

資料的插入和刪除:

因為在順序儲存所有的資料的儲存地址是連續的,所以在插入和刪除資料時你需要改變後續的所有資料的位置。在插入時把後面的資料往後挪,刪除時把資料向前挪。

void adds(sql &l,EleType target,int sit)
{
    if(sit>l.len+1 || sit <1)
    {
        cout<<"sit is wrong"<<endl;//插入位置錯誤
        exit(0);
    }
    if(l.len+1>Maxsize)
    {
        cout<<"Too many"<<endl;//儲存空間已滿
        exit(0);
    }
    //把後面的資料往後挪
    for(int i=l.len-1;i>=sit-1;i--)
    {
        l.elem[i+1]=l.elem[i];
    }
    l.elem[sit-1]=target;
    l.len++;//更新表長
}

//刪除元素
void DeletElem(sql &l,int sit)
{
    if(sit>l.len+1 || sit <1)
    {
        cout<<"sit is wrong"<<endl;
        exit(0);
    }
    for(int i=sit-1;i<l.len;i++)
    {
        l.elem[i]=l.elem[i+1];
    }
    l.len--;//更新表長
}

其他操作:

查詢和更改:

//查詢
int finding(sql l,EleType target)
{
    for(int i=0;i<l.len;i++)
    {
        if(l.elem[i]==target) return i+1;
    }
    return 0;
}

//更改
void Changing(sql& l,int sit,EleType target)
{
    if(sit>l.len+1 || sit <1)
    {
        cout<<"sit is wrong"<<endl;
        exit(0);
    }
    l.elem[sit-1]=target;
}

清空、獲取長度、判斷是否為空:

//清空線性表
void ClearLine(sql &l)
{
    l.len=0;
}

//獲取線性表的長度
int Getlen(sql l)
{
    return l.len;
}

//判斷線性表是否為空
bool IsEmpty(sql l)
{
    if(l.len==0) return true;
    return false;
}

 

完整程式碼

#include<iostream>
#include<cstdlib>
#define Maxsize 1000
#define EleType int//方便日後使用
using namespace std;

//建立結構體
struct sql{
    EleType* elem;//建立一個指標
    int len;
};

//初始化
void InitList(sql &l)
{
   
    l.elem=new EleType [Maxsize];
    if(!l.elem) cout<<"申請空間失敗"<<endl;
    l.len=0;
}


//輸出
void print(sql l)
{
    for(int i=0;i<l.len;i++)
    {
        cout<<l.elem[i]<<" ";
    }
    cout<<endl;
}

//插入
void adds(sql &l,EleType target,int sit)
{
    if(sit>l.len+1 || sit <1)
    {
        cout<<"sit is wrong"<<endl;
        exit(0);
    }
    if(l.len+1>Maxsize)
    {
        cout<<"Too many"<<endl;
        exit(0);
    }
    for(int i=l.len-1;i>=sit-1;i--)
    {
        l.elem[i+1]=l.elem[i];
    }
    l.elem[sit-1]=target;
    l.len++;
}

//刪除元素
void DeletElem(sql &l,int sit)
{
    if(sit>l.len+1 || sit <1)
    {
        cout<<"sit is wrong"<<endl;
        exit(0);
    }
    for(int i=sit-1;i<l.len;i++)
    {
        l.elem[i]=l.elem[i+1];
    }
    l.len--;
}

//銷燬線性表
void DestroyList(sql &l)
{
    delete [] l.elem;
}

//清空線性表
void ClearLine(sql &l)
{
    l.len=0;
}

//獲取線性表的長度
int Getlen(sql l)
{
    return l.len;
}

//判斷線性表是否為空
bool IsEmpty(sql l)
{
    if(l.len==0) return true;
    return false;
}

//查詢
int finding(sql l,EleType target)
{
    for(int i=0;i<l.len;i++)
    {
        if(l.elem[i]==target) return i+1;
    }
    return 0;
}

//更改
void Changing(sql& l,int sit,EleType target)
{
    if(sit>l.len+1 || sit <1)
    {
        cout<<"sit is wrong"<<endl;
        exit(0);
    }
    l.elem[sit-1]=target;
}

int main()
{
    sql l;
    InitList(l);
    EleType j=0;
    for(int i=1;i<10;i++,j++)
        adds(l,j,i);
    DeletElem(l,2);
    print(l);
    return 0;

}