顺序表的结构图如下
定义存储数据类型和顺序表标签结构
//存储数据类型
typedef int DataType;
//顺序表标签结构
typedef struct list
{
DataType *pData; //存放数据空间首地址
int tLen; //最大存放元素个数
int cLen; //当前元素个数
}SeqList;
创建顺序表
SeqList *CreateSeqList(int MaxLen)
{
SeqList *pTmpList = NULL;
//1.申请标签空间
pTmpList = malloc(sizeof(*pTmpList));
if (NULL == pTmpList)
{
return NULL;
}
//2.对标签中的所有成员赋值
pTmpList->cLen = 0;
pTmpList->tLen = MaxLen;
//3.申请存放数据的空间
pTmpList->pData = malloc(MaxLen * sizeof(DataType));
if (NULL == pTmpList->pData)
{
return NULL;
}
//4.返回标签首地址
return pTmpList;
}
检测顺序表是否已满、是否为空
//顺序表是否已满
int IsFullSeqList(SeqList *pTmpList)
{
return pTmpList->cLen == pTmpList->tLen ? 1 : 0;
}
//顺序表是否为空
int IsEmptySeqList(SeqList *pTmpList)
{
return pTmpList->cLen == 0 ? 1 : 0;
}
末尾添加(尾插)
//末尾添加
int AppendSeqList(SeqList *pTmpList, DataType TmpData)
{
if (IsFullSeqList(pTmpList))
{
return -1;
}
pTmpList->pData[pTmpList->cLen] = TmpData;
pTmpList->cLen++;
return 0;
}
指定位置插入
//指定位置插入
//注意:
// 返回-1 表示顺序表已满
// 返回-2 表示插入数据的位置错误
int PosInsertSeqList(SeqList *pTmpList, int Pos, DataType TmpData)
{
int n = 0;
if (IsFullSeqList(pTmpList))
{
return -1;
}
//错误的插入位置
if (!(Pos >= 0 && Pos <= pTmpList->cLen))
{
return -2;
}
for (n = pTmpList->cLen; n > Pos; n--)
{
pTmpList->pData[n] = pTmpList->pData[n-1];
}
pTmpList->pData[Pos] = TmpData;
pTmpList->cLen++;
return 0;
}
对顺序表进行遍历
//元素遍历
//参数:
// pFun:对遍历到的每个数据的操作方法
// arg:对pFun函数的传参
//返回值:
// 成功返回0
// 失败返回-1
int ForeachSeqList(SeqList *pTmpList, int (*pFun)(void *Element, void *arg), void *arg)
{
int i = 0;
int ret = 0;
for (i = 0; i < pTmpList->cLen; i++)
{
ret = pFun(&pTmpList->pData[i], arg);
if (ret != 0)
{
return -1;
}
}
return 0;
}
删除指定位置的元素
//删除
int DeleteSeqList(SeqList *pTmpList, int Pos)
{
int i = 0;
int n = 0;
if (IsEmptySeqList(pTmpList))
{
return -1;
}
if (!(Pos >= 0 && Pos < pTmpList->cLen))
{
return -2;
}
for (n = Pos; n < pTmpList->cLen-1; n++)
{
pTmpList->pData[n] = pTmpList->pData[n+1];
}
pTmpList->cLen--;
return 0;
}
遍历元素并指定所需要的操作
//*pFun为函数指针,指向对元素做指定操作的函数
int ForeachSeqList(Seqlist *pseqlist,int (*pFun)(void *Element,void *arg),void *arg)
{
int i=0;
int ret=0;
for(i=0;i<pseqlist->clen;i++)
{
ret=pFun(&pseqlist->data[i],arg);
if(ret!=0)
{
return -1;
}
}
return 0;
}
例如:更新指定位置元素
int UpdateFun(void *Element,void *arg)
{
int *pData = Element;
if(*pData == 1)
{
*pData= 2;
}
return 0;
}
找到指定元素的位置
int FindFun(void *Element,void *arg)
{
int *pData = Element;
if(*pData == 1)
{
return 1;
}
else
{
(*(int *)arg)++;
printf("(*(int *)arg)=%d\n",(*(int *)arg));
}
return 0;
}
清零
int ClearSeqList(Seqlist *pseqlist)
{
pseqlist -> clen = 0;
return 0;
}
销毁顺序表
//销毁
int DestroySeqList(SeqList **ppTmpList)
{
free((*ppTmpList)->pData);
free((*ppTmpList));
*ppTmpList = NULL;
return 0;
}