2.2.1順序表的定義
2.2.2順序表的基本操作
思維導圖:
順序表的定義
靜態分配
#define MaxSize 50 //宏定義線性表最大長度爲50
typedef struct{ //定義一個結構體
ElemType data{maxSize}; //順序表的元素,數組
int length; //順序表當前長度
}SqList; //結構體名
動態分配
#define InitSize 50 //表長度的初始定義
typedef struct{ //定義一個結構體
ElemType *data; //動態分配數組的指針
int MaxSize,length; //順序表最大容量,當前個數
}SeqList; //結構體名
從上面的描述中可以看出,動態分配和靜態分配最主要的區別在於靜態分配的是數組,動態分配的是指針。指針存儲地址,當需要用到數據存儲的時候再申請空間。
C語言動態分配語句:
L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize);
C++動態分配語句:
L.data=new ElemType[InitSize];
動態分配必須有動態分配語句
順序表的基本操作
插入:
bool ListInsert(SqList &L,int i,ElemType e){
//設置成bool類型函數,若插入成功返回true,否則返回false
if(i<1||i>L.length+1)//判斷i的範圍是否有效
return false;
if(L.length>=MaxSize)//當前存儲空間已滿,不能插入
return false;
for(int j=L.length;j>=i;j--)//將第i個元素之後的元素後移
L.data[j]=L.data[j-1];
L.data[i-1]=e; //在位置i處放入e
L.length++; //線性表長度加1
return true;
}
時間複雜度:
最好:表尾插入,時間複雜度O(1)
最壞:執行n次,時間複雜度O(n)
平均:O(n)
刪除
bool ListDelete(SqList &L,int i,Elemtype &e){//引用e,將刪除的數賦值給e
if(i<1||i>L.length)//判斷i的範圍是否有效
return false;
e=L.data[i-1]; //將被刪除的元素賦值給e
for(int j=i;j<L.length;j++)//將i位置後的元素前移
L.data[j-1]=L.data[j];
L.length--; //線性表長度減1
return true;
}
最好:時間複雜度O(1)
最壞:時間複雜度O(n)
平均:O(n)
按值查找
順序表L中查找一個元素值等於e的元素,並返回其位序
int LocateElem(SqList L,ElemType e){
int i;
for(i=0;i<L.length;i++)
if(L.data[i]==e)
return i+1;//i是數組下標,i+1是位序
return 0;//查找失敗退出循環
}
最好:時間複雜度O(1)
最壞:時間複雜度O(n)
平均:O(n)