數(shù)據(jù)結(jié)構(gòu)-線性表
線性表的定義:由n(n>=0)個數(shù)據(jù)特性相同的元素構(gòu)成的有限序列,稱為線性表。當(dāng)n=0時稱之為空表。
1.數(shù)據(jù)類型聲明
#define OK 1//定義一個宏,使用OK表示操作成功
#define ERROR 0//定義一個宏。使用ERROR表示操作失敗
#define OVERFLOW -2//定義宏,表示溢出操作
typedef int Status;//重命名為status用于表示函數(shù)的返回狀態(tài)
typedef int ElemType;//重命名為ElemType用于表示線性表數(shù)據(jù)元素類型
#define MAXSIZE 100//定義宏,表示線性表可能得最大空間
2.構(gòu)建線性表
typedef struct{
ElemType elem[MAXSIZE];//定義了數(shù)組,用于存儲線性表中的元素
int length;//表示當(dāng)前線性表的長度,順序表中的元素個數(shù)
}SqList;
3.初始化線性表
因為構(gòu)件線性表時元素數(shù)組已經(jīng)使用靜態(tài)分配,所以在此只需要對線性表的長度執(zhí)行初始化即可。
/**
* @brief 初始化
*
* @param L 線性表
*
* @return
**/
Status InitList(SqList *L){
L->length = 0;
return OK;
}
4.獲取線性表中數(shù)據(jù)
獲取數(shù)據(jù)需要參數(shù):
sqList:需要給定一個線性表從而獲取數(shù)據(jù),因為只是拿值而沒有改變線性表的內(nèi)容,所以使用值傳遞即可。
i:需要給一個數(shù)值,確定要查找的數(shù)據(jù)在線性表的那個位置。
&e:需要一個地址變量,要把找到的值傳遞出去。
/**
* @brief 獲取值
*
* @param sqList 操作數(shù)組
* @param i 數(shù)據(jù)位置
* @param e 返回地址
*
* @return
**/
Status GetElem(SqList sqList,int i,ElemType &e){
if(i<1 || i>sqList.length){//判斷i是否合法,是否在線性表的范圍內(nèi)
return ERROR;
}
e=sqList.elem[i];
return OK;
}
5.查找線性表中數(shù)據(jù)
l:給定一個線性表,確定要在那個線性表中查詢數(shù)據(jù)。
e:給定一個元素,確定我們需要查找那個元素,返回在線性表中的位置
/**
* @brief 查值
*
* @param l 操作線性表
* @param e 查找的元素
*
* @return 返回所在位置
**/
int LocateElemTyp(SqList l,ElemType e){
for(int i=1;i<l.length;i++){//根據(jù)線性表的大小進(jìn)行遍歷
if(l.elem[i]==e){//遍歷一遍進(jìn)行判斷是否是要查找的值
return i;//如果是返回位置
}
}
return ERROR;
}
6.插入數(shù)據(jù)
*p:給定一個線性表,因為需要改變線性表內(nèi)部數(shù)據(jù),所以需要傳遞進(jìn)一個線性表的地址。
i:給定一個位置,需要在那個位置插入數(shù)據(jù)。
e:給定一個元素,需要插入的元素。文章來源:http://www.zghlxwxcb.cn/news/detail-715886.html
/**
* @brief 插入數(shù)據(jù)
*
* @param p
* @param i
* @param e
*
* @return
**/
Status insertElem(SqList *p,int i,ElemType e){
if(i<1||i>p->length||p->length==MAXSIZE){//對i的進(jìn)行合法判斷,是否在線性表的范圍內(nèi)、判斷線性表是否已滿
//TODO
return ERROR;
}
for(int j=p->length;j>=i;j--){//對線性表進(jìn)行數(shù)據(jù)后移,空出插入位置的空間
//TODO
p->elem[j]=p->elem[j-1];
}
p->elem[i]=e;
p->length++;//表長度加一
return OK;
}
7.刪除數(shù)據(jù)
*p:給定一個線性表的地址,刪除需要改變線性表的內(nèi)容所以需要一個線性表的地址
i:給定一個位置,確定要刪除的位置元素文章來源地址http://www.zghlxwxcb.cn/news/detail-715886.html
/**
* @brief 刪除數(shù)據(jù)
*
* @param p
* @param i
*
* @return
**/
Status deleteElem(SqList *p,int i){
if(i<1||i>p->length){//判斷i在線性表中是否合法
//TODO
return ERROR;
}
for(int j=i;j<=p->length;j++){//直接對線性表數(shù)據(jù)進(jìn)行前置移位即可,直接覆蓋需要刪除的數(shù)據(jù)
//TODO
p->elem[j]=p->elem[j+1];
}
p->length--;//表長度減一
return OK;
}
測試:
int main(){
SqList sqlist;
InitList(&sqlist);
cout<<"請輸入要創(chuàng)建的線性表的元素個數(shù)(5個數(shù)據(jù))"<<endl;
for(int i=1;i<=5;i++){
cin>>sqlist.elem[i];
sqlist.length++;
}
cout<<"線性表中的數(shù)據(jù)元素為:";
for(int i=1;i<=5;i++){
cout<<sqlist.elem[i]<<" ";
}
cout<<endl;
ElemType value;
int index;
cout<<"請輸入要查找的位置:";
cin>>index;
if(OK == GetElem(sqlist,index,value)){
//TODO
cout<<"位置為"<<index<<"值為"<<value<<" ";
}else{
cout<<"取值不合法";
}
cout<<endl;
value = 2;
cout<<LocateElemTyp(sqlist,value);
cout<<endl;
if(OK==insertElem(&sqlist,3,2)){
//TODO
cout<<"插入成功";
}
cout<<"線性表中的數(shù)據(jù)元素為:";
for(int i=1;i<sqlist.length;i++){
cout<<sqlist.elem[i]<<" ";
}
cout<<endl;
if(OK==deleteElem(&sqlist,1)){
//TODO
cout<<"刪除成功";
}
cout<<"線性表中的數(shù)據(jù)元素為:";
for(int i=1;i<sqlist.length;i++){
cout<<sqlist.elem[i]<<" ";
}
cout<<endl;
}
到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)-線性表-順序表的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!