第一篇文章中用c实现了静态顺序表,但是使用静态顺序表还有不足的地方。当我们需要存储的数据很少时,如果静态顺序表的数组容量较大就会造成空间的浪费;当我们需要存储的数据很多时,如果静态顺序表的数组容量较小可能就会造成数据丢失。所以一般情况我们应该尽量把顺序表实现成动态的。需要多大容量就开辟多大容量。

静态顺序表和动态顺序表只有以下函数不同:

1.定义结构体时,多定义一个capacity,并对capacity进行初始化和增加大小的设置;

#defineINIT_CAPACITY3#defineDEFAULT_INC3


typedefstruct{DataType*Data;intsize;intcapacity;}SeqList,*pSeqList;


2.动态顺序表多了容量检测函数(没有容量时进行动态开辟);

voidCheckCapacity(pSeqListpSeq){assert(pSeq);//当存储的有效值个数和容量相等时进行扩容if(pSeq->size==pSeq->capacity){pSeq->Data=(DataType*)realloc(pSeq->Data,pSeq->capacity+DEFAULT_INC);pSeq->capacity=pSeq->capacity+DEFAULT_INC;}}


3.动态顺序表中进行数据存储时先要进行容量检测;

voidPushBack(pSeqListpSeq,DataTypex){assert(pSeq);CheckCapacity(pSeq);pSeq->Data[pSeq->size++]=x;}voidPushFront(pSeqListpSeq,DataTypex){inti=0;assert(pSeq);CheckCapacity(pSeq);for(i=pSeq->size;i>0;i--){pSeq->Data[i]=pSeq->Data[i-1];}pSeq->Data[0]=x;pSeq->size++;}voidInsert(pSeqListpSeq,intpos,DataTypex){inti=0;assert(pSeq);assert((pos<pSeq->size)&&(pos>=0));CheckCapacity(pSeq);for(i=pSeq->size;i>pos;i--){pSeq->Data[i]=pSeq->Data[i-1];}pSeq->Data[pos]=x;pSeq->size++;}