C++實(shí)現(xiàn)線性表順序存儲(chǔ)的示例代碼
我學(xué)習(xí)順序表時(shí)找不到相關(guān)的代碼,以及我不清楚寫一個(gè)線性表需要的知識(shí),當(dāng)我寫出來可以使用的線性表我就把這些內(nèi)容貼了出來。
前置知識(shí)點(diǎn):結(jié)構(gòu)體,常量指針
順序表的特點(diǎn):
- 需要一片連續(xù)的存儲(chǔ)空間
- 邏輯上相連的數(shù)據(jù)的存儲(chǔ)位置也是相鄰的。
所以如果我們想要?jiǎng)?chuàng)建一個(gè)順序表我們需要做兩件事:
- 向系統(tǒng)申請一片空間供數(shù)組使用。
- 創(chuàng)建一個(gè)指針記錄空間地址。
而刪除順序表就是把空間釋放,并讓指針指向空。
順序表的創(chuàng)建和銷毀:
#include<iostream>
#include<cstdlib>
#define EleType int//方便日后使用
#define Maxsize 1000
using namespace std;
//定義結(jié)構(gòu)體
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ù)的插入和刪除:
因?yàn)樵陧樞虼鎯?chǔ)所有的數(shù)據(jù)的存儲(chǔ)地址是連續(xù)的,所以在插入和刪除數(shù)據(jù)時(shí)你需要改變后續(xù)的所有數(shù)據(jù)的位置。在插入時(shí)把后面的數(shù)據(jù)往后挪,刪除時(shí)把數(shù)據(jù)向前挪。
void adds(sql &l,EleType target,int sit)
{
if(sit>l.len+1 || sit <1)
{
cout<<"sit is wrong"<<endl;//插入位置錯(cuò)誤
exit(0);
}
if(l.len+1>Maxsize)
{
cout<<"Too many"<<endl;//存儲(chǔ)空間已滿
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)建結(jié)構(gòu)體
struct sql{
EleType* elem;//創(chuàng)建一個(gè)指針
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;
}
到此這篇關(guān)于C++實(shí)現(xiàn)線性表順序存儲(chǔ)的示例代碼的文章就介紹到這了,更多相關(guān)C++線性表順序存儲(chǔ)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于linux下C開發(fā)中的幾點(diǎn)技術(shù)經(jīng)驗(yàn)總結(jié)
本篇文章是對linux下C開發(fā)中的幾點(diǎn)技術(shù)經(jīng)驗(yàn)總結(jié)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
VScode配置C++運(yùn)行環(huán)境的完整步驟
這篇文章主要給大家介紹了關(guān)于VScode配置C++運(yùn)行環(huán)境的完整步驟,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01

