一、顺序表结构
顺序表结构包含三部分:
1.一段连续的存储区,用于存储元素
2.整型变量size:顺序表的大小
3.整型变量count:顺序表存储了多少个元素
操作:
插入:插入时将该位置及后元素向后移一位,count+1
删除:删除时将该位置后元素向前移一位,count-1
二、顺序表代码
1.引库
#include<stdio.h>
#include<stdlib.h>
#include<ctime>
2.代码
typedef struct vector{
int size,count;
int *data;
} vector;//给结构体别名, 在后续的代码中直接使用 vector 作为类型名称来声明变量,不需要写 struct vector。
vector *getNewVector(int n){
vector *p=(vector *)malloc(sizeof(vector));//开辟顺序表本身的空间
p->size=n;
p->count=0;
p->data=(int *)malloc(sizeof(int)*n);
return p;
}
void clear(vector *v){
if(v==NULL) return ;
free(v->data);
free(v);
return ;
}
int insert(vector *v,int pos,int val){
if(pos<0||pos>v->count) return 0;
if(v->size==v->count) return 0;
for(int i=v->count-1;i>=pos;i--){//从后往前后移一位
v->data[i+1]=v->data[i];
}
v->data[pos]=val;
v->count+=1;
return 1;
}
int erase(vector *v,int pos){//删除
if(pos<0||pos>=v->count) return 0;
for(int i=pos+1;i<v->count;i++){//从前往后前移一位
v->data[i-1]=v->data[i];
}
v->count-=1;
return 1;
}
void output_vector(vector *v){
int len=0;
for(int i=0;i<v->size;i++){
len+=printf("%3d",i);//让每个序号占5个字符就,并记录长度len
}
printf("\n");
for(int i=0;i<len;i++) printf("-");
printf("\n");
for(int i=0;i<v->count;i++) printf("%3d",v->data[i]);
printf("\n\n");
}
int main(){
srand(time(0));
#define MAX_OP 20
vector *v=getNewVector(MAX_OP);
for(int i=0;i<MAX_OP;i++){
int op=rand()%4,pos,val;
switch(op){
case 0:
case 1:
case 2:
pos=rand()%(v->count+2);
val=rand()%100;
printf("insert %d at %d to vector=%d\n",val,pos,insert(v,pos,val));
break;
case 3:
pos=rand()%(v->count+2);
printf("erase item at %d in vector=%d\n",pos,erase(v,pos));
break;
}
output_vector(v);
}
clear(v);
return 0;
}
3.扩容
//扩容
int expend(vector *v){
if(v==NULL) return 0;
printf("expend v from %d to %d\n",v->size,2*v->size);
//realloc会试着在原内存地址向后拓展,拓展失败会找一片新的符合大小的内存
//找不到符合大小的内存,失败就会返回 NULL
int *p=(int *)realloc(v->data,sizeof(int)*2*v->size);
if(p==NULL) return 0;
v->data=p;
v->size*=2;
return 1;
}
//可以扩容的插入
int insert(vector *v,int pos,int val){
if(pos<0||pos>v->count) return 0;
if(v->size==v->count&&!expend(v)) return 0;
for(int i=v->count-1;i>=pos;i--){//从后往前后移一位
v->data[i+1]=v->data[i];
}
v->data[pos]=val;
v->count+=1;
return 1;
}
183

被折叠的 条评论
为什么被折叠?



