代码
c
#include <stdio.h>
#include <stdlib.h>
typedef int E; //这里我们的元素类型就用int为例吧,先起个别名
//定义结构体
struct List{
E * array;
int capacity; //数组的容量
int size;
};
//给结构体指针起别名
typedef struct List * ArrayList; //因为是数组实现,所以就叫ArrayList,这里直接将List的指针起别名
//初始化
_Bool initList(ArrayList list){
list->array = malloc(sizeof (E) * list->capacity); //使用malloc函数申请10个int大小的内存空间,作为底层数组使用
if(list->array == NULL) return 0; //需要判断如果申请的结果为NULL的话表示内存空间申请失败
list->capacity = 10; //直接将数组的容量设定为10即可
list->size=0;
return 1;
}
//插入数据操作
_Bool insertList(ArrayList list, E element, int index){
if(index < 1 || index > list->size + 1) return 0; //判断插入位置,转换成位序,也就是[1, size + 1]这个闭区间
if(list->size == list->capacity) { //如果size已经到达最大的容量了,肯定是插不进了,那么此时就需要扩容了
int newCapacity = list->capacity + (list->capacity >> 1); //我们先计算一下新的容量大小,这里我取1.5倍原长度,当然你们也可以想扩多少扩多少
E * newArray = realloc(list->array, newCapacity * sizeof(E)); //这里我们使用新的函数realloc重新申请更大的内存空间
if(newArray == NULL) return 0; //如果申请失败,那么就确实没办法插入了,只能返回0表示插入失败了
list->array = newArray;
list->capacity = newCapacity;
}
for (int i = list->size; i > index - 1; --i)
list->array[i] = list->array[i - 1];
list->array[index - 1] = element;
list->size++;
return 1;
}
//打印数据
void printList(ArrayList list){ //编写一个函数用于打印表当前的数据
for (int i = 0; i < list->size; ++i) //表里面每个元素都拿出来打印一次
printf("%d ", list->array[i]);
printf("\n");
}
//删除操作
_Bool deleteList(ArrayList list, int index){
if(index < 1 || index > list->size) return 0;
for (int i = index - 1; i < list->size - 1; ++i)
list->array[i] = list->array[i + 1]; //实际上只需要依次把后面的元素覆盖到前一个即可
list->size--; //最后别忘了size - 1
return 1;
}
//获取size的大小
int sizeList(ArrayList list){
return list->size;
}
//按位置获取元素
E * getList(ArrayList list, int index){
if(index < 1 || index > list->size) return NULL;
return &list->array[index - 1];
}
int findList(ArrayList list, E element){
for (int i = 0; i < list->size; ++i) { //一直遍历,如果找到那就返回位序
if(list->array[i] == element) return i + 1;
}
return -1; //如果遍历完了都没找到,那么就返回-1
}
int main(){
struct List list; //创建新的结构体变量
if(initList(&list)){ //对其进行初始化,如果失败就直接结束
for (int i =0; i<30; i++){
insertList(&list, i*10, i+1);
}
deleteList(&list, 10);
deleteList(&list, 10);
printList(&list);
printf("获取数组容量:%d\n", list.capacity); //获取数组容量
printf("按位置获取元素:%d\n", *getList(&list, 3)); //按位置获取元素
printf("按值查找元素位置:%d\n", findList(&list, 30)); //按值查找元素位置
} else{
printf("顺序表初始化失败,无法启动程序!");
}
}