資料結構之動態順序表
阿新 • • 發佈:2018-12-02
動態順序表
動態順序表是跟靜態順序表大體相似,有些地方是不同的,動態順序表是在動態變化中,當我們的所需的記憶體不夠時,它會自動開闢一個我們需要的空間,來供我們使用。
動態順序表與靜態順序表的不同在於初始化/銷燬/所有插入,其他和靜態順序表完全一樣。
定義一個結構體
先將我們需要的都定義好
#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我!