###代码如下,代码的解析附于代码中:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define Init_size 5//使顺序表更加灵活
typedef int DataType;//使顺序表具有通用性
typedef struct SeqListD
{
DataType *_pData;//定义为指针,用于给其分配空间
int _size;//操作顺序表内元素的索引
int _capecity;//表示顺序表当前的容量
}SeqListD,*PSeqListD;
//用于扩充顺序表的空间的函数
int AddCapacity(PSeqListD pSeq)
{
assert(pSeq);
DataType new_space= (PSeqListD)malloc(sizeof(DataType)*Init_size*2);
if(new_space != NULL)
{
memcpy(new_space,pSeq,sizeof(DataType)*Init_size);
free(pSeq);
pSeq=new_space;
pSeq->_capacity=sizeof(DataType)*Init_size;
return 1;
}
return 0;
}
//用于初始化顺序表的函数
void SeqListInit(PSeqListD pSeq)
{
assert(pSeq);
pSeq=(PSeqListD)malloc(sizeof(DataType)*Init_size);
if(pSeq != NULL)
{
pSeq->_size=0;
pSeq->_capacity=sizeof(DataType)*Init_size;
}
else
exit(0);
}
//用于向顺序表的结尾添加元素的函数
void SeqListDPushBack(PSeqListD pSeq,DataType data)
{
assert(pSeq);
if(pSeq->_size == pSeq->_capacity)
{
if(AddCapacity(pSeq))
{
pSeq->_pData[pSeq->_size]=data;
pSeq->_size++;
}
else
{
printf("顺序表已满,内存分配失败!\n");
return;
}
}
pSeq->_pData[pSeq->_size]=data;
pSeq->_size++;
}
//用于删除顺序表结尾元素的函数
void SeqListDPopBack(PSeqListD pSeq)
{
assert(pSeq);
if(pSeq->_size == 0)
{
printf("顺序表为空,无法删除!\n");
return;
}
pSeq->_size--;
}
//用于向顺序表任意位置插入元素的函数
void SeqListDPushInsert(PseqListD pSeq,size_t pos,DataType data)
{
assert(pSeq);
assert(pos <= pSeq->_size);
if(pSeq->_size == pSeq->_capacity)
{
if(AddCapacity(pSeq)
{
int i=pSeq->_size;
for(;i > pos;--i)
{
pSeq->_pData[i]=pSeq->_pData[i-1];
}
pSeq->_pData[i]=data;
pSeq->_size++;
return;
}else
{
printf("顺序表已满,内存分配失败!\n);
return;
}
}
for(int i=pSeq->_size;i>pos;--i)
{
pSeq->[i]=pSeq->[i-1];
}
pSeq[pos]=data;
pSeq->_size++;
return;
}
//用于删除顺序表任意位置某元素的函数
void SeqListDEraseInsert(PSeqListD pSeq,size_t pos)
{
assert(pSeq);
assert(pos>=0 && pos<pSeq->_size);
if(pSeq->_size == 0)
{
printf("顺序表已为空!\n);
return;
}
for(int i=pos;i<pSeq->_size;i++)
{
pSeq->_pData[i]=pSeq->_pData[i+1];
}
pSeq->_size--;
}
//用于销毁顺序表的函数(动态顺序表创建后若是最后未销毁,则会导致内存泄漏)
void SeqListDEraseAll(PSeqListD* pSeq)
{
if(NULL != pSeq)
{
free(*pSeq);
*pSeq=NULL;
}
}
//用于依次打印顺序表内元素的函数(这类函数有很大的发挥空间)
void SeqListDPrint(PSeqListD pSeq)
{
assert(pSeq);
for(int i=0;i<pSeq->_size;i++)
{
printf("%d ",pSeq->_Data[i]);
}
}