C++實現(xiàn)線性表順序存儲的示例代碼
我學習順序表時找不到相關的代碼,以及我不清楚寫一個線性表需要的知識,當我寫出來可以使用的線性表我就把這些內(nèi)容貼了出來。
前置知識點:結構體,常量指針
順序表的特點:
- 需要一片連續(xù)的存儲空間
- 邏輯上相連的數(shù)據(jù)的存儲位置也是相鄰的。
所以如果我們想要創(chuàng)建一個順序表我們需要做兩件事:
- 向系統(tǒng)申請一片空間供數(shù)組使用。
- 創(chuàng)建一個指針記錄空間地址。
而刪除順序表就是把空間釋放,并讓指針指向空。
順序表的創(chuàng)建和銷毀:
#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; }
數(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; }
完整代碼
#include<iostream> #include<cstdlib> #define Maxsize 1000 #define EleType int//方便日后使用 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; }
到此這篇關于C++實現(xiàn)線性表順序存儲的示例代碼的文章就介紹到這了,更多相關C++線性表順序存儲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
基于linux下C開發(fā)中的幾點技術經(jīng)驗總結
本篇文章是對linux下C開發(fā)中的幾點技術經(jīng)驗總結進行了詳細的分析介紹,需要的朋友參考下2013-05-05