线性表
定义
具有相同数据类型的n(n>=0)个数据元素的有限序列。
线性表的初始化和释放
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
typedef struct Vectors{
int *data;
int size;
int len;
}Vec;
//初始化
int expand(Vec *v);
Vec *init(int n){
Vec *v = (Vec *)malloc(sizeof(Vec));
v -> data = (int *)malloc(sizeof(int));
v -> size = n;
v -> len = 0;
printf("创建成功,size = %d\n",v -> size);
return v;
}
//释放
void FreeVec(Vec *v){
if(v){
free(v -> data);
free(v);
}
printf("释放成功");
}
//插入
int insert(Vec *v,int idx,int val){//idx位置,val值
if(!v)
return 0;
if(idx < 0 || idx > v -> len)
return 0;
if(v -> len == v -> size)/*满了 */ {
if(!expand(v)){
return 0;
}
}
memcpy(v -> data + idx + 1,v -> data + idx, sizeof(int)*(v -> len - idx));//memcpy(dst(目的地),src(开头),n)
v -> data[idx] = val;
v -> len++;
return 1;//成功输出为1
}
//删除
int erase(Vec *v,int idx){//idx位置
if(!v)
return 0;
if(idx < 0 || idx > v -> len)
return 0;
memcpy(v -> data + idx,v -> data + idx + 1, sizeof(int)*(v -> len - idx - 1));//memcpy(dst(目的地),src(开头),n)
v -> len--;
return 1;
}
//显示
void showVec(Vec *v){
if(!v)
return ;
printf("Vec:[");
int i;
for(i = 0; i < v -> len; i++){
i && printf(",");
printf("%d",v -> data[i]);
}
printf("]\n");
}
//扩容
int expand(Vec *v){
if(!v)
return 0;
int expsize = v -> size;
int *tmp;
while(expsize){
tmp = (int *)realloc(v -> data, sizeof(int)*(v -> size + expsize));
if(tmp)
break;
expsize >>= 2;//如果扩容失败,则缩小原来的要求,exp size /= 2:
}
if(!tmp){
printf("expand failed\n");
return 0;
}
v -> data = tmp;
v -> size += expsize;
printf("expand success\n");
//realloc(4103369225)
return 1;
}
//主函数
int main(){
Vec *v = init(1);
int cnt = 20;
srand(time(0));
while(cnt--){
int val = rand() % 100;
int op = rand() % 4;//生成0/1码
int idx = rand() % (v ->len + 3) - 1;//-1到len+1之间
switch(op){
case 0:
case 1:
case 2:
printf("insert %d at %d,res = %d\n",val,idx,insert(v,idx,val));
break;
case 3:
printf("erase at %d,res = %d\n",idx,erase(v,idx));
break;
}
showVec(v);
}
FreeVec(v);
return 0;
}