算法
算法特徵:
1.有窮性
2.確定性
3.可行性
4.輸入和輸出
算法好壞評價:
- 正確性
- 可讀性
- 確定性
- 健壯性(效率和低存儲)
算法效率的度量:
- 時間複雜度
- 空間複雜度
線性表
順序存儲:線性表
鏈式存儲 :
指針實現
- 單鏈表、
- 雙鏈表
- 循環鏈表
靜態鏈表(藉助數組實現)
順序表存儲定義
使用數組靜態定義:即存儲空間一旦滿,再加入新的數據將產生溢出。
#define Maxsize 50 //定義線性表的最大長度
typedf struct
{
Elemtype *data;//順序表的元素
int length; // 順序表的當前長度
}Seqlist; //順序表的定義
使用數組動態定義:即存儲數據的空間滿時,可以使用realloc申請更大的空間,代替原來的空間。
#define MaxSize 100 //表的長度初始定義
typedef struct
{
ElemType *data; //指示動態分配數據的指針
int MaxSize, length; //數組的最大的容量和當前的個數
} SqList; //動態分配數據順序表的類型定義
c語言動態申請空間:L.data=(Elemtype*)malloc(sizeof(Elemtype)*InitSize)
特點:‘
1.順序表是一組地址連續的存儲單元。故表中的元素邏輯順序與物理順序相同。
2.可以隨機存儲,且存儲密度大。
3.缺點是在插入和刪除需要移動大量元素。
順序表插入
bool ListInsert(Sqlist &L, int i, ElemType e)
{
//將元素e插入到順序表L中的第i個位置
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;
L.length++;
return true;
}
此時插入的平均時間複雜度是O(n)。
順序的刪除
bool Listdele(Sqlist &L, int i, ElemType &e)
{
//刪除順序表L中的第i個位置,並用e作爲返還值
if(i<1 || i > L.length +1) //判斷i的位置是否有效
return false;
e = L.data[i-1];
for(int j=i; j<L.length; j--) //找到插入i位置,並將其以及之後的元素後移
L.data[j-1]= L.data[j];
L.length--;
return true;
}
此時刪除的平均時間複雜度是O(n)。