線性表:一種邏輯結(jié)構(gòu)。
順序表:采用順序存儲方式實現(xiàn)的線性表。
位序:從1開始。
數(shù)組下標:從0開始。
&引用符的使用:
函數(shù)參數(shù)帶&和不帶&的區(qū)別。
malloc:申請一整片連續(xù)的存儲空間,返回一個指向該空間首地址的指針。
free:釋放一整片連續(xù)的存儲空間。
//順序表的動態(tài)分配
#define InitSize 10 //初始大小
typedef struct{int* data;//指針,指向動態(tài)分配的內(nèi)存空間的首地址
int length;//該順序表的長度
int MaxSize;//該順序表的大長度
}SeqList;
2. 順序表動態(tài)初始化:void InitList(SeqList &L){//初始化順序表,包括給順序表L動態(tài)分配內(nèi)存空間,設(shè)置順序表當前長度為0,設(shè)置順序表大長度100
L.data = (int*)malloc(sizeof(int) * InitSize);
L.length = 0;
L.MaxSize = 100;
}
3. 順序表擴容:void IncreaseSize(SeqList &L,int len){//順序表擴容
int* p = L.data;//創(chuàng)建一個指針指向順序表當前內(nèi)存空間的首地址,方便回收
L.data = (int*)malloc(sizeof(int) * (L.MaxSize+len));//重新請求一塊更大的內(nèi)存空間分配給該順序表
L.MaxSize += len;//修改順序表大長度
for(int i=0;i<=L.length;i++){L.data[i] = p[i];//將原內(nèi)存空間中的數(shù)據(jù)復(fù)制到新申請的空間中
}
free(p);//釋放原來的內(nèi)存空間
}
4. 插入:bool ListInsert(SeqList &L,int i,int e){//插入元素e到順序表位序為i的位置
if(i<1 || i>L.length+1){//判斷插入位置是否合法
return false;
}
if(L.length == L.MaxSize){//判斷順序表是否已滿
return false;
}
for(int j=L.length;j<=i;j++){//i位置及之后的元素后移一位(這里注意區(qū)分位序和數(shù)組下標的關(guān)系)
L.data[j] = L.data[j-1];
}
L.data[i-1] = e;//插入數(shù)據(jù)
L.length++;//注意別忘了順序表長度+1
return true;
}
5. 刪除:bool ListDelete(SeqList &L,int i,int &e){//刪除順序表為序為i的數(shù)據(jù)元素,并將該元素的值賦給e
if(i<1 || i>L.length){return false;
}
e = L.data[i-1];//將被刪除的元素的值賦值給e
for(int j=i;j//位序i之后的元素前移
L.data[j-1] = L.data[j];
}
L.length--;//注意別忘了順序表長度-1
return true;
}
6. 按位序查找:int getElem(SeqList L,int i){//按位序查找,返回該位序上的元素
if(i<1 || i>L.length){//判斷位置是否合法
return -1;
}
return L.data[i-1];
}
7. 按值查找:int LocateElem(SeqList L,int e){//按值查找,返回該值的位序
for(int j=0;jif(L.data[j] == e){ return j+1;//返回的是位序
}
}
return -1;
}
8. 輸出順序表:void printList(SeqList L){//輸出順序表的元素
printf("[");
for(int i=0;iprintf("%d ",L.data[i]);
}
printf("]\n");
}
9. 判斷順序表是否相等:bool equalsList(SeqList L1,SeqList L2){//判斷順序表內(nèi)容是否相同
if(L1.MaxSize == L2.MaxSize){if(L1.length == L2.length){ for(int i=0;i if(L1.data[i] == L2.data[i]){continue;
}
}
}
return true;
}
return false;
}
10.測試:#include#include//使用malloc和free關(guān)鍵字需要引入這個庫
//順序表的動態(tài)分配
#define InitSize 10 //初始大小
typedef struct{int* data;//指針,指向動態(tài)分配的內(nèi)存空間的首地址
int length;//該順序表的長度
int MaxSize;//該順序表的大長度
}SeqList;
void InitList(SeqList &L){//初始化順序表,包括給順序表L動態(tài)分配內(nèi)存空間,設(shè)置順序表當前長度為0,設(shè)置順序表大長度100
L.data = (int*)malloc(sizeof(int) * InitSize);
L.length = 0;
L.MaxSize = 100;
}
void IncreaseSize(SeqList &L,int len){//順序表擴容
int* p = L.data;//創(chuàng)建一個指針指向順序表當前內(nèi)存空間的首地址,方便回收
L.data = (int*)malloc(sizeof(int) * (L.MaxSize+len));//重新請求一塊更大的內(nèi)存空間分配給該順序表
L.MaxSize += len;//修改順序表大長度
for(int i=0;i<=L.length;i++){L.data[i] = p[i];//將原內(nèi)存空間中的數(shù)據(jù)復(fù)制到新申請的空間中
}
free(p);//釋放原來的內(nèi)存空間
}
bool ListInsert(SeqList &L,int i,int e){//插入元素e到順序表位序為i的位置
if(i<1 || i>L.length+1){//判斷插入位置是否合法
return false;
}
if(L.length == L.MaxSize){//判斷順序表是否已滿
return false;
}
for(int j=L.length;j<=i;j++){//i位置及之后的元素后移一位(這里注意區(qū)分位序和數(shù)組下標的關(guān)系)
L.data[j] = L.data[j-1];
}
L.data[i-1] = e;//插入數(shù)據(jù)
L.length++;//注意別忘了順序表長度+1
return true;
}
bool ListDelete(SeqList &L,int i,int &e){//刪除順序表為序為i的數(shù)據(jù)元素,并將該元素的值賦給e
if(i<1 || i>L.length){return false;
}
e = L.data[i-1];//將被刪除的元素的值賦值給e
for(int j=i;j//位序i之后的元素前移
L.data[j-1] = L.data[j];
}
L.length--;//注意別忘了順序表長度-1
return true;
}
int getElem(SeqList L,int i){//按位序查找,返回該位序上的元素
if(i<1 || i>L.length){//判斷位置是否合法
return -1;
}
return L.data[i-1];
}
int LocateElem(SeqList L,int e){//按值查找,返回該值的位序
for(int j=0;jif(L.data[j] == e){ return j+1;//返回的是位序
}
}
return -1;
}
void printList(SeqList L){//輸出順序表的元素
printf("[");
for(int i=0;iprintf("%d ",L.data[i]);
}
printf("]\n");
}
bool equalsList(SeqList L1,SeqList L2){//判斷順序表內(nèi)容是否相同
if(L1.MaxSize == L2.MaxSize){if(L1.length == L2.length){ for(int i=0;i if(L1.data[i] == L2.data[i]){continue;
}
}
}
return true;
}
return false;
}
int main(){SeqList L1;//聲明一個順序表
InitList(L1);//初始化順序表
//初始化、擴容測試
printf("順序表當前內(nèi)存空間的首地址:%d\n",&L1.data[0]);
printf("順序表當前大長度:%d\n",L1.MaxSize);
IncreaseSize(L1,5);//擴容順序表,擴容長度為5
printf("順序表當前內(nèi)存空間的首地址:%d\n",L1.data);
printf("順序表當前大長度:%d\n",L1.MaxSize);
//插入、輸出測試
ListInsert(L1,1,5);
printList(L1);
//按位查找、按值查找測試
printf("順序表中位序為1的元素為:%d\n",getElem(L1,1));
printf("順序表中元素5的位序為:%d\n",LocateElem(L1,5));
//刪除測試
int a;
ListDelete(L1,1,a);
printf("刪除的元素為:%d\n",a);
printList(L1);
//判斷順序表數(shù)據(jù)相等測試
SeqList L2;//聲明一個順序表
InitList(L2);//初始化順序表
ListInsert(L1,1,3);
ListInsert(L2,1,8);
printf("順序表L1和L2是否相等:%d\n",equalsList(L1,L2));
ListDelete(L1,1,a);
ListInsert(L1,1,8);
IncreaseSize(L2,5);
printf("順序表L1和L2是否相等:%d\n",equalsList(L1,L2));
return 0;
}
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)頁題目:C語言線性表實現(xiàn):順序表-創(chuàng)新互聯(lián)
URL標題:http://m.rwnh.cn/article18/djiedp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機、企業(yè)建站、移動網(wǎng)站建設(shè)、網(wǎng)站收錄、外貿(mào)網(wǎng)站建設(shè)、營銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容