seqList.h
#pragma once
#include<stdbool.h>
#define INIT_SEQLIST_SIZE 8 //顺序表初始大小
typedef int Data; //抽象数据类型ADT
//数组 容量(最多能存储多少个元素) 当前大小
typedef struct SeqList //顺序表结构
{
Data* base; //指向动态内存分配的数组的指针
int capacity; //容量
int size; //当前元素个数
}SeqList;
//初始化顺序表
void initList(SeqList*list);
//获取大小
int size(SeqList* list);
//是否为空
bool empty(SeqList* list);
//尾部插入
void push_back(SeqList* list,const Data* const pval);
//删除最后一个元素
void pop_back(SeqList* list);
//删除指定的元素
void removeOne(SeqList* list, const Data* const pval);
//查找元素,返回下标
int find_pos(SeqList* list, const Data* const pval);
//查找元素,返回元素地址
Data* find_val(SeqList* list, const Data* const pval);
//回调登记函数
typedef void (*CallBack)(Data* pval);
void transform(SeqList* list, CallBack dosomething);
seqList.c
#include"seqList.h"
#include<malloc.h>
#include<stdio.h>
void initList(SeqList* list)
{
list->capacity = INIT_SEQLIST_SIZE;
list->size = 0;
list->base = (Data*)calloc(list->capacity, sizeof(Data));
if (!list)
{
puts("内存申请失败~");
return;
}
}
int size(SeqList* list)
{
return list->size;
}
bool empty(SeqList* list)
{
return list->size == 0;
}
void push_back(SeqList* list, const Data* const pval)
{
//判断顺序表有没有位置(是否已满)
if (list->size == list->capacity)
{
puts("顺序表已满,无法插入~");
return;
}
list->base[list->size] = *pval; //插入
list->size++; //元素个数加1
}
void pop_back(SeqList* list)
{
if(!empty(list))
list->size--;
}
void removeOne(SeqList* list, const Data* const pval)
{
if (empty(list)) //为空直接返回,无需删除
return;
//先找到pval,需要下标还是元素地址
int delPos = find_pos(list, pval);
if (delPos == -1)
{
return;
}
//开始删除元素(把要删除的元素后面的元素都往前挪动)
for (int i = delPos; i < list->size-1 ; i++)
{
list->base[i] = list->base[i + 1];
}
//size-1
list->size--;
}
int find_pos(SeqList* list, const Data* const pval)
{
for (int i = 0; i < list->size; i++)
{
if (list->base[i] == *pval)
{
return i;
}
}
return -1;
}
Data* find_val(SeqList* list, const Data* const pval)
{
for (int i = 0; i < list->size; i++)
{
if (list->base[i] == *pval)
{
return list->base + i;
}
}
return NULL;
}
void transform(SeqList* list, CallBack dosomething)
{
for (int i = 0; i < list->size; i++)
{
dosomething(list->base + i);
}
}
main.c
#include<stdio.h>
#include"seqList.h"
/*
* 顺序表:线性表的一种,每个元素都是连续的,内存连续(数组)
*
*/
void print(Data* pval)
{
printf("%d ",*pval);
}
int main()
{
SeqList list = {0};
initList(&list);
//插入数据
for (int i = 0; i < list.capacity; i++)
{
push_back(&list, &i);
}
//输出所有元素
transform(&list, print);
//删除元素
pop_back(&list);
int len = list.size;
for (int i = 0; i < len; i++)
{
pop_back(&list);
//removeOne(&list, &i);
}
printf("\n");
transform(&list, print);
return 0;
}