顺序表
1.特点:
空间连续,访问元素方便
2.顺序表结构体
//存放数据类型
typedef int DataType;
//顺序表结构体
typedef struct list
{
DataType *pData;//存放数据空间首地址
int tlen;//最大存放元素个数
int clen;//当前元素个数
}SeqList;
如果要存放字符串类型的,最好写成以下形式
typedef struct str
{
char data[128];
}str_t;
//存储数据类型
typedef str_t DataType;
3.创建顺序表
//创建顺序表
SeqList *CreateSeqList(int Maxlen){
SeqList *pHead = NULL;
//1.对标签申请空间
pHead = malloc(sizeof(SeqList));
if(NULL == pHead){
perror("fail to malloc");
return NULL;
}
//2.赋初值
pHead->clen = 0;
pHead->tlen = Maxlen;
//3.对数据申请空间
pHead->pData = malloc(Maxlen *sizeof(pHead->pData));
if (NULL == pHead->pData)
{
return NULL;
}
return pHead;
}
4.判断顺序表
//顺序表是否已满
int IsFullSeqList(SeqList *pTmpList){
return pTmpList->clen == pTmpList->tlen ? 1:0;
}
//顺序表是否为空
int IsEmptySeqList(SeqList *pTmpList){
return pTmpList->clen == 0 ? 1 : 0;
}
//获得顺序表中元素的个数
int GetCountSeqList(SeqList *pTmpList){
return pTmpList->clen;
}
//获得顺序表中元素的容量
int GetCapacitySeqList(SeqList *pTmpList){
return pTmpList->tlen;
}
5.末尾添加元素
//末尾添加
int AppendSeqList(SeqList *pTmpList, DataType TmpData){
//1.判断顺序表有没有满
if(IsFullSeqList(pTmpList)){
return -1;
}
pTmpList->pData[pTmpList->clen] = TmpData;
pTmpList->clen++;
return 0;
}
6.指定位置插入
返回-1 表示顺序表已满 返回-2 表示插入数据的位置错误
//指定位置插入
//返回-1 表示顺序表已满 返回-2 表示插入数据的位置错误
int PosInsertSeqList(SeqList *pTmpList, int Pos, DataType TmpData){
int i = 0;
//1。判断顺序表有没有满
if(IsFullSeqList(pTmpList){
return -1;
}
//2.判断插入数据有错误吗
if(!(Pos >= 0 && Pos <= pTmpList->clen)){
return -2;
}
//3.从后往前移数据
for(i = pTmpList->clen; i > Pos; i--){
pTmpList->pData[i] = pTmpList->pData[i-1];
}
pTmpList->pData[Pos] = TmpData;
pTmpList->clen++;
return 0;
}
7.元素遍历
//参数:
// pFun:对遍历到的每一个数据的操作方法
// arg:对pFun函数的传参
int ForeachSeqList(SeqList *pTmList, int (*pFun)(void *Element,void *arg),void *arg){
int i = 0;
int ret = 0;
for(i = 0; i < pTmList->clen; i++){
ret = pFun(&pTmList->pData[i],arg);
if(ret != 0){
return -1;
}
}
return 0;
}
例如:查找顺序表中的某个元素所在下标,就可以使用ForeachSeqList函数,搭配FindData函数传参对遍历到的数据进行操作
int n = 0;
int FindData(void *pElement, void *arg){
int *pData =(int *) pElement;
if(20 == *pData){
return 1;
}else{
(*(int *)arg)++;
}
return 0;
}
ForeachSeqList(pseqlist,FindData,&n);
printf("n = %d\n",n);
8.删除某个元素
int DeleteSeqList(SeqList *pTmpList, int Pos){
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;
}
9.清零
int ClearSeqList(SeqList *pTmpList){
pTmpList->clen = 0;
return 0;
}
10.销毁顺序表
int DestroySeqList(SeqList **ppTmpList){
free((*ppTmpList)->pData);
free((*ppTmpList));
*ppTmpList = NULL;
return 0;
}