線性表的順序存儲C++代碼
?我學習順序表時找不到相關的代碼,以及我不清楚寫一個線性表需要的知識,當我寫出來可以使用的線性表我就把這些內(nèi)容貼了出來。
前置知識點:結構體,
順序表的特點:
需要一片連續(xù)的存儲空間
?邏輯上相連的數(shù)據(jù)的存儲位置也是相鄰的。
所以如果我們想要創(chuàng)建一個順序表我們需要做兩件事:
向系統(tǒng)申請一片空間供數(shù)組使用。
創(chuàng)建一個指針記錄空間地址。
而刪除順序表就是把空間釋放,并讓指針指向空。
順序表的創(chuàng)建和銷毀:
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;
}

數(shù)據(jù)的插入和刪除:
因為在順序存儲所有的數(shù)據(jù)的存儲地址是連續(xù)的,所以在插入和刪除數(shù)據(jù)時你需要改變后續(xù)的所有數(shù)據(jù)的位置。在插入時把后面的數(shù)據(jù)往后挪,刪除時把數(shù)據(jù)向前挪。
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);
? ?} ? ?//把后面的數(shù)據(jù)往后挪
? ?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;
}

?
完整代碼
using namespace std;//創(chuàng)建結構體struct sql{
? ?EleType* elem;//創(chuàng)建一個指針
? ?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;
}