將靜態順序表改為動態順序表
阿新 • • 發佈:2018-12-05
注:本篇只是大概實現動態順序表,靜態順序表詳敘請參照https://blog.csdn.net/R_T_P_A_D/article/details/84189236
實現動態順序表,只需在靜態順序表上做兩個變化就可以實現:
首先,需要將靜態順序表裡面的巨集定義取消掉,因為這是靜態順序表中最不安全的地方,任何人都可以去改變這個巨集,所以在這裡,我們需要將原本的陣列形式的data,改為*data,其實這兩種意義相同,編譯器在編譯時也會把data[]編譯成*data。
其次,需要在結構體中再加一個變數,capacity容量。因為在動態順序表中考慮到增容的原因,單純一個length已經不夠用了,此時必須有另一個變數來輔助增容。
typedef int DataType; typedef struct StrSeqList { DataType *data;//陣列 DataType length;//長度 DataType capacity;//容量 }StrSeqList; void InitStrSeqList(StrSeqList *spList) { assert(spList); spList->data = (DataType*)malloc(sizeof(DataType)*3); spList->capacity = 3; spList->length = 0; } int IsFullCapacityStrSeqList(StrSeqList *spList) { assert(spList); if(spList->capacity == spList->length) return 1; else return 0; } void PushBackStrSeqList(StrSeqList *spList, DataType d) { assert(spList); if(IsFullCapacityStrSeqList(spList)) { spList->capacity = spList->capacity * 2 + 3; spList->data = (DataType*)realloc(spList->data,sizeof(DataType*) * spList->capacity); } spList->data[spList->length] = d; spList->length++; } void PopBackStrSeqList(StrSeqList *spList) { assert(spList); spList->length--; }