數據結構之概念與線性表

算法

算法特徵:

1.有窮性

2.確定性

3.可行性

4.輸入和輸出

算法好壞評價:

  • 正確性
  • 可讀性
  • 確定性
  • 健壯性(效率和低存儲)

算法效率的度量:

  • 時間複雜度
  • 空間複雜度

線性表

  1. 順序存儲:線性表

  2. 鏈式存儲 :

指針實現

  • 單鏈表、
  • 雙鏈表
  • 循環鏈表  

靜態鏈表(藉助數組實現)

順序表存儲定義

使用數組靜態定義:即存儲空間一旦滿,再加入新的數據將產生溢出。

#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)。

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