1. 程式人生 > >資料結構之動態順序表

資料結構之動態順序表

動態順序表

動態順序表是跟靜態順序表大體相似,有些地方是不同的,動態順序表是在動態變化中,當我們的所需的記憶體不夠時,它會自動開闢一個我們需要的空間,來供我們使用。

動態順序表與靜態順序表的不同在於初始化/銷燬/所有插入,其他和靜態順序表完全一樣。

定義一個結構體

先將我們需要的都定義好

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
//為了觀看方便先寫在開頭,正常應該需要什麼去使用什麼

typedef
int DataType; #define INIT_CAPACITY(3)//定義一個動態的初始化空間容量為3 typedef struct SeqListD{ DataType* parray; int capacity; int size; }

在結構體的定義中,靜態與動態的定義是不同的。靜態的是直接定義了一個空間是有範圍確定的陣列。但是動態不同,動態定義的是一個指標,在這裡面儲存的範圍是不確定的,當我們定義了一個當前我們認為足夠大的空間時,它是在一個計算機給我們的隨機地址中。當我們需要更大的空間時,我們將申請新空間,這個時候我們將資料轉移,先將所有資料轉移到新的空間,之後我們將舊的空間釋放掉。這個時候空間是新開闢的一段空間,但是我們的地址是計算機重新分配的一段新地址。

初始化

void SeqListInit(SeqListD *pSeq){
    pSeq->capacity = INIT_CAPACITY;//當前容量我們都先設定為3,每當我們不夠時,
    							//我們就呼叫其他函式去擴充它
    pSeq->parray = (DataType *)malloc(sizeof(DataType)*pSeq->capacity);//我們的陣列利用malloc函式
    				//型別			//4*3
    assert(pSeq->parray);//判斷我的指標是否正常
    pSeq->size = 0;
}

malloc(): malloc的全稱是memory allocation,中文叫動態記憶體分配,用於申請一塊連續的指定大小的記憶體塊區域以void*型別返回分配的記憶體區域地址,當無法知道記憶體具體位置的時候,想要繫結真正的記憶體空間,就需要用到動態的分配記憶體。

一般需和free函式配對使用。

銷燬

void SeqListDestory(SeqListD *pSeq){
    free(pSeq->parray);
    //將它釋放掉
    pSeq->capacity = 0;
    pSeq->size = 0;
    pSeq->parry = NULL;
    //所有一切還原
}

插入

void SeqListPushBack(SeqListD *pSeq,DataType data){
    //靜態:如果滿了,不處理/報錯
	//動態:加入擴容機制
    ExpandIfRequired(pSeq);//每次都需要去判斷是否達到條件可以實現
    pSeq->parray[pSeq->size] = data;//
    pSeq->size++;
}

判斷是否需要擴大

static void ExpandIfRequired(SeqListD *pSeq){
    if(pSeq->size < pSeq->capacity){
        return;//還沒滿
    }
    //擴容
    pSeq->capacity *= 2;
    //開闢新空間
    DataType *newArray = (DataType *)malloc(sizeof(DataType)*pSeq->capacity);
    assert(newArray);
    //資料搬移
    for(int i = 0;i < pSeq->size;i++){
        newArray[i] = pSeq->parray[i];
    }
    //釋放老空間,申請的新空間與動態順序表關聯起來
    free(pSeq->parray);
    pSeq->parray = newArray;
}

同理,所有插入都需要加入擴容機制

其他的操作與靜態順序表的操作是相近的。可以參考我之前的對照著看。

資料結構重新在學!如有不對,請cue我!