1. 程式人生 > >將靜態順序表改為動態順序表

將靜態順序表改為動態順序表

注:本篇只是大概實現動態順序表,靜態順序表詳敘請參照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--;
}