數據結構--線性表的順序存儲(2)

1、什麼是順序表數組

  線性表的順序存儲類型又稱之爲順序表,他是在內存中一塊連續的區域,其中的每一個元素不只在表中是相鄰的,他們的物理地址也是相鄰的,咱們通常在c語言中使用的數組就屬於順序表,注意線性表中的元素位序是從1開始二數組中的元素下標是從0開始,線性表中每一個元素佔據相同大小的地址空間。函數

  

 

 2、順序表的特色spa

  1.順序表準重要的特色是能進行隨機訪問,經過元素下標尋找元素,其時間複雜度爲O(1)。指針

  2.由於順序表是在物理空間上相鄰存儲,因此順序表的存儲密度很高。code

  3.順序表在進行插入和刪除的時候須要移動大量元素。blog

 

3、靜態順序表的初始化內存

#define MaxSize 50            //順序表的最大長度

typedef int ElemType; /*ElemType是數據的類型,咱們這裏用int類型表示*/

typedef struct {
    ElemType data[MaxSize];        //順序表的元素
    int length;        //順序表的長度
}SqList;            //順序表的類型標識

 

4、靜態順序表的插入和刪除it

  順序表由於其插入或者刪除其中一個元素都要對後面的元素進行順序的調整,消耗很是大的,若是咱們在一個有n個元素的順序表在第一個位置插入元素,咱們須要把下標元素n-1到0所有日後移動一個單位,刪除也是一樣的道理,須要把元素向前移動一位,因此插入和刪除的平均時間複雜度爲O(n)。io

 

 插入和刪除的代碼class

Status InsertList(SqList *L, int i, ElemType e) {  //插入

    int j;
    if (i > L->length+1||i<1||L->length==MaxSize)        //判斷要插入的位置不能大於順序表的長度
        return -1;

    for (j = L->length - 1; j >= i - 1; j--) {
        L->data[j + 1] = L->data[j];
    }
    L->data[i - 1] = e;
    L->length++;
    
    return 1;
}

Status DeleteElem(SqList *L, int i, ElemType *e) {  //刪除
    
    ElemType *temp_data ;

    if (i > L->length || i<0 || L->length == MaxSize)        //判斷要刪除的位置不能大於順序表的長度
        return -1;

    temp_data = L->data[i-1];
    *e = temp_data;                    //使用指針賦值給指針

    for (i=i-1; i <= L->length-1; i++) {
    
        ElemType temp = L->data[i+1];        //i位後的元素每個向前移動一位
        L->data[i] = temp;
    }

    L->length--;
    return 1;

}

5、順序表的其它操做

seqList.h
#include<stdio.h>

#define MaxSize 50            //順序表的最大長度

typedef int Status; /* Status是函數的類型,其值是函數結果狀-1爲出現錯誤1爲正常態代碼,如OK等 */
typedef int Boolean; /* Boolean是布爾類型,其值是TRUE或FALSE 其中1爲TRUE 0爲FALSE */

typedef int ElemType; /*ElemType是數據的類型,咱們這裏用int類型表示*/

typedef struct {
    ElemType data[MaxSize];        //順序表的元素
    int length;        //順序表的長度
}SqList;            //順序表的類型標識

void InitList(SqList *L); //初始化線性表
int Length(SqList L);//返回線性表的長度
int LocateElem(SqList L, ElemType e);//查找元素e在表中的位置
ElemType GetElem(SqList L, int i);//獲取表中第i個位置的元素,並返回
Status InsertList(SqList *L, int i, ElemType e);//在表L中第i個位置插入元素e
Status DeleteElem(SqList *L, int i, ElemType *e);//刪除表中第i個元素,並用e返回其值
void PrintList(SqList L);//輸出線性表的全部元素
Boolean IsEmpty(SqList *L);//判斷線性表是否爲空
Status DestroyList(SqList *L);//銷燬線性表,並釋放所佔用的空間

函數文件

seqList.c

#include"seqList.h"

void InitList(SqList *L) {  //初始化線性表
    L->length = 0;
    return *L;
}

int Length(SqList L) { //返回線性表的長度
    return L.length;
}

int LocateElem(SqList L, ElemType e) { //查找元素e在表中的位置
    int i;
    for (i = 0; i<L.length; i++) {
        if (L.data[i] == e)
            return i+1;
    }
    return -1;
}

ElemType GetElem(SqList L, int i) { //獲取表中第i個位置的元素,並返回
    if (i<0 || i >= L.length)
        return -1;
    return L.data[i-1];
}


void PrintList(SqList L) { //輸出線性表的全部元素
    int i;
    
    for (i = 0; i < L.length; i++) {
        printf("%d ", L.data[i]);
    }
}

Boolean IsEmpty(SqList *L) { //判斷線性表是否爲空
    if (L->length<=0)        //由於線性表沒有初始化時長度數值爲小於等0
        return 1;
    else
        return 0;
}

Status DestroyList(SqList *L) { //銷燬線性表,並釋放所佔用的空間

    L->length = 0;            //順序存儲的線性表銷燬只需使長度爲0便可,由於是靜態的空間在建立時就被分配了

    return 1;
}

主函數文件

#include<stdio.h>
#include"seqList.h"

int main() {
    int i;
    int array[] = { 0,1,2,3,4,5 };
    ElemType e;
    SqList sq;
    
    InitList(&sq);
    
    for (i = 1; i < 6; i++) {
        InsertList(&sq, i, array[i]);
    }

    PrintList(sq);
    printf("\n");
    printf("線性表的長度爲%d\n", Length(sq));
    printf("定位元素5的位置爲%d\n", LocateElem(sq, 5));
    printf("獲取第2個位置的元素爲%d\n", GetElem(sq, 2));
    DeleteElem(&sq, 2, &e);
    printf("刪除表中位置爲2的元素,其值爲%d 刪除後的表爲", e);
    PrintList(sq);
    printf("\n");
    if (IsEmpty(&sq) == 1)
        printf("此表爲空\n");
    else
        printf("此表不爲空\n");

    printf("銷燬線性表");
    if (DestroyList(&sq) == 1)
        printf("銷燬成功!\n");
    else
        printf("銷燬失敗");
}
相關文章
相關標籤/搜索