2.2線性表的順序表示

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)

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章