SeqListD.h
#pragma once
#include<assert.h>
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int DataType;
typedef struct SeqListD //动态顺序表讲解时间起始于2017.12.5___21:13分
{
DataType* _pData;
int _size;//顺序表中元素的个数
int _capacity;//顺序表中可容纳元素的最大值(容量)
}SeqListD,*PSeqListD;
///////////////////////////////////////////////////////////
//SeqListD.h
void SeqListDInit(PSeqListD pSeq);//初始化
void SeqListDPushBack(PSeqListD pSeq,DataType data);//尾插
void SeqListDPopBack(PSeqListD pSeq);//尾删
int SeqListDEmpty(PSeqListD pSeq);//判空
int SeqListDSize(PSeqListD pSeq);//判断有效元素的个数
int SeqListDCapacity(PSeqListD pSeq);//判断容量的大小
void SeqListDClear(PSeqListD pSeq);//清空 ,把顺序表中元素的个数清为0,不能修改空间的大小
int CheckCapacity(PSeqListD pSeq);//动态增容
void SeqListDDestroy(PSeqListD pSeq);
void Insert(PSeqListD pSeq,size_t pos,DataType data);//任意位置插入和删除
SeqListD.c
void SeqListDInit(PSeqListD pSeq)//初始化
{
assert(pSeq);
pSeq->_pData = (DataType*)(sizeof(DataType) * 3);
if (NULL == pSeq->_pData)
{
printf("系统空间不足\n");
exit(0);
}
pSeq->_capacity = 3;
pSeq->_size = 0;
}
void SeqListDPushBack(PSeqListD pSeq, DataType data)//尾插
{
assert(pSeq);
if(CheckCapacity(pSeq))//检测容量,如果动态顺序表已满,那么就动态增容。增容后,
//将旧空间元素搬移到新空间,并且将旧空间释放,更新_pData和_capacity,_size不改变
pSeq->_pData[pSeq->_size++] = data;
}
int CheckCapacity(PSeqListD pSeq)//顺序表已满,需要处理
{
if (pSeq->_size = pSeq->_capacity)
{
int newCapacity = pSeq->_capacity * 2;
DataType*pTemp = (DataType*)malloc(sizeof(DataType)* newCapacity);//产生新空间
if (NULL == pTemp)//判断一下如果没有申请成功,那么。。。
{
printf("系统空间不足\n");
return 0;
}
memcpy(pTemp, pSeq->_pData, sizeof(DataType)*pSeq->_size);//将旧空间元素搬移到新空间
free(pSeq->_pData);//释放旧空间
pSeq->_pData = pTemp;//更新
pSeq->_capacity = newCapacity;
}
return 1;
}
void SeqListDPopBack(PSeqListD pSeq)//尾删
{
assert(pSeq);
if (SeqListDEmpty(pSeq))
return;
pSeq->_size--;
}
int SeqListDEmpty(PSeqListD pSeq)//判空
{
assert(pSeq);
return pSeq->_size;
}
int SeqListDSize(PSeqListD pSeq)//判断有效元素的个数
{
assert(pSeq);
return pSeq->_size;
}
int SeqListDCapacity(PSeqListD pSeq)//判断容量的大小
{
assert(pSeq);
return pSeq->_capacity;
}
void SeqListDClear(PSeqListD pSeq)//清空 ,把顺序表中元素的个数清为0,不能修改空间的大小
{
assert(pSeq);
pSeq->_size = 0;
}
void SeqListDDestroy(PSeqListD pSeq)//销毁
{
assert(pSeq);
if (pSeq->_pData)
{
free(pSeq->_pData);
pSeq->_pData = NULL;
pSeq->_capacity = 0;
pSeq->_size = 0;
}
}
Test.c
void TestSeqListD()
{
SeqListD seq;
SeqListDInit(&seq);
SeqListDPushBack(&seq,0);
SeqListDPushBack(&seq,1);
SeqListDPushBack(&seq,2);
printf("size = %d\n",SeqListDSize(&seq));
printf("capacity = %d\n", SeqListDCapacity(&seq));
SeqListDPushBack(&seq, 3);
SeqListDPushBack(&seq, 4);
SeqListDPushBack(&seq, 5);
SeqListDPushBack(&seq, 6);
printf("size = %d\n", SeqListDSize(&seq));
printf("capacity = %d\n", SeqListDCapacity(&seq));
SeqListDPopBack(&seq);
SeqListDPopBack(&seq);
SeqListDPopBack(&seq);
printf("size = %d\n", SeqListDSize(&seq));
printf("capacity = %d\n", SeqListDCapacity(&seq));
SeqListDClear(&seq);
printf("size = %d\n", SeqListDSize(&seq));
printf("capacity = %d\n", SeqListDCapacity(&seq));
SeqListDDestroy(&seq);
}