動態順序表的實現
阿新 • • 發佈:2018-12-11
順序表的插入:
靜態順序表:如果滿了,不處理 / 報錯;
動態順序表:如果滿了,加入擴容機制。
實現程式碼如下:
#include <stdlib.h> #include <assert.h> typedef int DataType; #define INIT_CAPACITY (3) typedef struct SeqListD{ DataType *parray; int capacity; // 當前容量 等於 靜態順序表 MAX_SIZE int size; // 同靜態順序表 } SeqListD; // 初始化/銷燬/所有插入(尾插) // 其他和靜態順序表完全一樣 //初始化 void SeqListDInit(SeqListD *pSeq) { //為了獲得容量空間 pSeq->capacity = INIT_CAPACITY; pSeq->parray = (DataType*)malloc(sizeof(DataType)*pSeq->capacity); assert(pSeq->parray); //這個和順序表一樣 pSeq->size = 0; } //銷燬 void SeqListDDestroy(SeqListD *pSeq) { free(pSeq->parray); pSeq->capacity = 0; pSeq->parray = NULL; pSeq->size = 0; } // 頭插 static void ExpandIfRequired(SeqListD *pSeq); void SeqListDPushBack(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; // 1.申請新空間 DataType *newArray = (DataType *)malloc(sizeof(DataType)* pSeq->capacity); assert(newArray); // 2.資料搬移 for (int i = 0; i < pSeq->size; i++) { newArray[i] = pSeq->parray[i]; } // 3.釋放老空間,關聯老空間 free(pSeq->parray); pSeq->parray = newArray; }
測試函式與主函式:
void Test()
{
SeqListD sld;
SeqListDInit(&sld);
SeqListDPushBack(&sld, 1);
SeqListDPushBack(&sld, 2);
SeqListDPushBack(&sld, 3);
// 這下面會擴容
SeqListDPushBack(&sld, 4);
SeqListDPushBack(&sld, 5);
}
int main()
{
Test();
return 0;
}