線性表的順序存儲結構

1. 線性表的定義

線性表:零個或者多個數據元素的有限序列。
線性表元素的個數n(n≥0)定義爲線性表的長度,當n=0時,稱爲空表。
對於一個非空的線性表或者線性結構,具備如下特色:算法

  • 存在惟一的一個被稱做「第一個」的數據元素。
  • 存在惟一的一個被稱做「最後一個」的數據元素。
  • 除了第一個外,結構中的每一個數據元素都有一個前驅。
  • 除了最後一個外,結構中的每一個數據元素都有一個後繼。

2. 線性表的順序存儲結構

2.1 順序存儲定義

線性表的順序存儲結構是指用一段地址連續的存儲單元依次存儲線性表的數據元素。
線性表順序存儲結構示意.png
線性表順序存儲結構代碼以下:數組

#define MAXSIZE 100
#define OK 1~~~~
#define ERROR 0
#define TRUE 1
#define FALSE 0

/* ElemType類型根據實際狀況而定,這裏假設爲int */
typedef int ElemType;
/* Status是函數的類型,其值是函數結果狀態代碼,如OK等 */
typedef int Status;

/*線性結構使用順序表的方式存儲*/
//順序表結構設計
typedef struct {
    ElemType *data; // 數組存儲數據元素,最大值爲MAXSIZE。
    int length; // 線性表當前長度
}Sqlist;

2.2 順序存儲結構經常使用操做

2.2.1 順序表初始化

//1.1 順序表初始化
Status InitList(Sqlist *L){
    //爲順序表分配一個大小爲MAXSIZE 的數組空間
    L->data =  malloc(sizeof(ElemType) * MAXSIZE);
    //存儲分配失敗退出
    if(!L->data) exit(ERROR);
    //空表長度爲0
    L->length = 0;
    return OK;
}

2.2.2 順序表插入與刪除

插入算法實現思路函數

  1. 若是插入位置不合理,拋出異常。
  2. 若是線性表長度大於等於數組長度,則拋出異常或者動態增長容量。
  3. 從最後一個元素開始向前遍歷到第i個位置,分別將它們都向後移動一個位置。
  4. 將要插入的元素填入到第i位置。
  5. 表長度加1。

線性表順序存儲結構插入示意圖.png
代碼實現以下spa

/*
 初始條件:順序線性表L已存在,1≤i≤ListLength(L);
 操做結果:在L中第i個位置以前插入新的數據元素e,L的長度加1
 */
Status ListInsert(Sqlist *L,int i,ElemType e){
    //i值不合法判斷
    if((i<1) || (i>L->length+1)) return ERROR;
    //存儲空間已滿
    if(L->length == MAXSIZE) return ERROR;
    //插入數據不在表尾,則先移動出空餘位置
    if(i <= L->length){
        for(int j = L->length-1; j>=i-1;j--){
            //插入位置以及以後的位置後移動1位
            L->data[j+1] = L->data[j];
        }
    }
    //將新元素e 放入第i個位置上
    L->data[i-1] = e;
    //長度+1;
    L->length++;
    return OK;
}

刪除算法實現思路設計

  1. 若是刪除位置不合理,拋出異常。
  2. 取出刪除元素。
  3. 從刪除元素位置開始遍歷到最後一個元素位置,分別將它們都向前移動一個位置。
  4. 表長度減1。

線性表順序存儲結構刪除示意圖.png
代碼實現以下code

/*
 初始條件:順序線性表L已存在,1≤i≤ListLength(L)
 操做結果: 刪除L的第i個數據元素,L的長度減1。
 */
Status ListDelete(Sqlist *L,int i){
    //線性表爲空
    if(L->length == 0) return ERROR;
    //i值不合法判斷
    if((i<1) || (i>L->length)) return ERROR;
    for(int j = i; j < L->length; j++){
        //被刪除元素以後的元素向前移動
        L->data[j-1] = L->data[j];
    }
    //表長度-1;
    L->length--;
    return OK;
}

2.2.3 順序表其餘操做

1. 獲取指定位置的元素blog

//獲取指定位置的元素
Status GetElem(Sqlist L,int i, ElemType *e){
    //判斷i值是否合理, 若不合理,返回ERROR
    if(i<1 || i > L.length) return  ERROR;
    //data[i-1]單元存儲第i個數據元素.
    *e = L.data[i-1];
    return OK;
}

2. 清空順序表it

// 初始條件:順序線性表L已存在。操做結果:將L重置爲空表 
Status ClearList(Sqlist *L)
{
    L->length=0;
    return OK;
}

3. 判斷順序表是否爲空表class

/* 初始條件:順序線性表L已存在。操做結果:若L爲空表,則返回TRUE,不然返回FALSE */
Status ListEmpty(Sqlist L)
{
    if(L.length==0)
        return TRUE;
    else
        return FALSE;
}

4. 獲取順序表長度List

//獲取順序表長度即元素個數 */
int ListLength(Sqlist L)
{
    return L.length;
}

5. 順序輸出順序表

//順序輸出List
/* 初始條件:順序線性表L已存在 */
/* 操做結果:依次對L的每一個數據元素輸出 */
Status TraverseList(Sqlist L)
{
    int i;
    for(i=0;i<L.length;i++)
        printf("%d\n",L.data[i]);
    printf("\n");
    return OK;
}

2.3 線性表順序存儲結構的優缺點

優勢:

  • 無需爲表示表中元素以前的邏輯關係增長額外的存儲空間。
  • 能夠快速地存取表中任一位置的元素。

缺點:

  • 插入和刪除元素操做須要移動大量的元素。
  • 當線性表長度變化較大時,難以肯定存儲空間的容量。
  • 形成存儲空間的「碎片」。
相關文章
相關標籤/搜索