#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct{
int *data,size,length;
} Arr;
Arr *init(int n){ //初始化一个顺序表
Arr *res=(Arr *)calloc(1,sizeof(Arr));
res->data=(int *)calloc(n,sizeof(int));
res->size=n;
res->length=0;
return res;
}
void clear(Arr *arr){ //删除顺序表
if(arr == NULL) return ;
if(arr->data) free(arr->data);
free(arr);
}
int exten(Arr *arr){ //顺序表扩容
int ex_size=arr->size; //要增加的尺寸
int *temp=NULL;
while(ex_size){
temp=(int *)realloc(arr->data,(arr->size + ex_size)*sizeof(int));
if(temp) break; //如果可以增加到当前尺寸
ex_size>>=1; //如果不能再增加一倍则相应的减少
}
if(temp == NULL) return 0; //如果扩容失败
arr->data=temp;
arr->size+=ex_size; //修改顺序表尺寸
return 1;
}
int insert(Arr *arr,int val,int index){//插入数据
if(arr == NULL) return 0;
if(index<0 || index > arr->length) return 0;
if(arr->length == arr->size && !exten(arr)) return 0;//如果顺序表已满并且扩容失败
for(int i=arr->length; i>index; --i){
arr->data[i]=arr->data[i-1]; //将要插入的元素之后的元素整体后移
}
arr->data[index]=val;
++arr->lenth;
return 1;
}
int erase(Arr *arr, int index){ //删除数据
if(arr == NULL) return 0;
if(index<0 || index>=arr->length) return 0;
for(int i=index+1; i<arr->length; ++i){
arr->data[i-1]=arr->data[i]; //将要删除的元素之后的元素整体前移一位
}
--arr->length;
return 1;
}
void output(Arr *arr){
printf("[");
for(int i=0; i < arr->length; ++i){
printf("%d",arr->data[i]);
i < arr->length-1 && printf(" ");
}
printf("]\n");
}
int main(){
srand(time(0));
Arr *arr=init(1);
for(int i=0; i<20; ++i){
int val=rand() % 100; //随机插入的值
int ind=rand() % (arr->length+5) -2; //随机操作的位置
int ope=rand() % 4; //随机操作类型
switch(ope){
case 0:
case 1:
case 2:
insert(arr,val,ind); //3/4的概率插入
break;
case 3:
erase(arr,ind); //1/4的概率删除
break;
}
output(arr);
}
clear(arr);
return 0;
}
c语言实现顺序表
最新推荐文章于 2023-07-26 23:47:19 发布