算法与数据结构---顺序表-创新互联
前言数据结构=结构定义+结构操作本文章为观看如下视频所写:
创新互联公司主要为客户提供服务项目涵盖了网页视觉设计、VI标志设计、成都营销网站建设、网站程序开发、HTML5响应式重庆网站建设公司、手机网站制作、微商城、网站托管及成都网站维护、WEB系统开发、域名注册、国内外服务器租用、视频、平面设计、SEO优化排名。设计、前端、后端三个建站步骤的完善服务体系。一人跟踪测试的建站服务标准。已经为混凝土搅拌罐行业客户提供了网站营销服务。3.顺序表代码演示_哔哩哔哩_bilibili
针对此线性表
1、size代表当前线性表的总大小,最多存储多少个元素。
2、length代表当前线性表一共存储的元素个数。
3、data_type代表当前线性表存储的每个元素的数据类型。
一、顺序表操作的相关代码
#include#include#include//类型定义
typedef struct Vector{
int *data;
int size,length;
}Vector;
//初始化创建一个存储n个元素的顺序表
Vector *init(int n){
Vector *vec=(Vector *)malloc(sizeof(Vector));
vec->data=(int *)malloc(sizeof(int)*n);
vec->size=n;
vec->length=0;//代表顺序表没有储存任何元素
return vec;
}
//顺序表的插入操作
int insert(Vector *vec,int ind,int val){
//去除非法性操作
if(vec==NULL) return 0;
if(vec->length==vec->size) return 0;
if(ind<0||ind>vec->length) return 0;
//插入操作
for(int i=vec->length;i>ind;i--){
vec->data[i]=vec->data[i-1];
}
vec->data[ind]=val;
vec->length+=1;
return 1;
}
//顺序表的删除操作
int erase(Vector *vec,int ind){
//去除非法性操作
if(vec==NULL) return 0;
if(vec->length==0) return 0;
if(ind<0||ind>=vec->length) return 0;
//删除操作‘
for(int i=ind+1;ilength;i++){
vec->data[i-1]=vec->data[i];
}
vec->length-=1;
return 1;
}
//顺序表销毁
void clear(Vector *vec){
if(vec==NULL) return ;//顺序表为空直接返回
free(vec->data);
free(vec);
return ;
}
//输出顺序表
void output(Vector *vec){
printf("Vector(%d)=[",vec->length);
for(int i=0;ilength;i++){
if(i!=0) printf(", "); //输出两个及以上元素用“,”隔开
printf("%d",vec->data[i]);
}
printf("]\n");
return ;
}
int main()
{ srand(time(0));
#define MAX_OP 20
Vector *vec=init(MAX_OP);
int op,ind,val;
//随机产生20个元素
for(int i=0;ilength+1);
val=rand()%100;
switch(op){
//op为0,2,3执行插入操作,75%概率插入
case 3:
case 2:
case 0:{
printf("insert %d at %d to vector\n",val,ind);
insert(vec,ind,val);
break;
}
//op为1执行删除操作 ,25%概率删除
case 1:{
printf("erase item at %d from vector\n",ind);
erase(vec,ind);
break;
}
}
output(vec);
}
return 0;
}
二、代码优化和功能扩充#include#include#include//类型定义
typedef struct Vector{
int *data;
int size,length;
}Vector;
//初始化创建一个存储n个元素的顺序表
Vector *init(int n){
Vector *vec=(Vector *)malloc(sizeof(Vector));
vec->data=(int *)malloc(sizeof(int)*n);
vec->size=n;
vec->length=0;//代表顺序表没有储存任何元素
return vec;
}
//扩容操作
int expand(Vector *vec){
int new_size=vec->size*2;
//重新分配空间
//realloc重新分配后会销毁原来空间 ,返回重新申请空间的首地址
int *p=(int *)realloc(vec->data,sizeof(int)*vec->size);
//先判断分配的地址是否为空,若为空代表分配空间失败,此时不能将该地址赋值给vec->data,否则会丢失原地址,造成内存泄漏
if(p==NULL) return 0;
vec->size=new_size;
vec->data=p;
return 1;
}
//顺序表的插入操作
int insert(Vector *vec,int ind,int val){
//去除非法性操作
if(vec==NULL) return 0;
//如果表满后尝试对表进行扩容,扩容失败才对操作进行非法性排除
if(vec->length==vec->size){
if(!expand(vec)) return 0;
printf("expand vector size to %d success\n",vec->size);
}
if(ind<0||ind>vec->length) return 0;
//插入操作
for(int i=vec->length;i>ind;i--){
vec->data[i]=vec->data[i-1];
}
vec->data[ind]=val;
vec->length+=1;
return 1;
}
//顺序表的删除操作
int erase(Vector *vec,int ind){
//去除非法性操作
if(vec==NULL) return 0;
if(vec->length==0) return 0;
if(ind<0||ind>=vec->length) return 0;
//删除操作‘
for(int i=ind+1;ilength;i++){
vec->data[i-1]=vec->data[i];
}
vec->length-=1;
return 1;
}
//顺序表销毁
void clear(Vector *vec){
if(vec==NULL) return ;//顺序表为空直接返回
free(vec->data);
free(vec);
return ;
}
//输出顺序表
void output(Vector *vec){
printf("Vector(%d)=[",vec->length);
for(int i=0;ilength;i++){
if(i!=0) printf(", "); //输出两个及以上元素用“,”隔开
printf("%d",vec->data[i]);
}
printf("]\n");
return ;
}
int main()
{ srand(time(0));
#define MAX_OP 20
Vector *vec=init(1);
int op,ind,val;
//随机产生20个元素
for(int i=0;ilength+1);
val=rand()%100;
switch(op){
//op为0,2,3执行插入操作,75%概率插入
case 3:
case 2:
case 0:{
printf("insert %d at %d to vector\n",val,ind);
insert(vec,ind,val);
break;
}
//op为1执行删除操作 ,25%概率删除
case 1:{
printf("erase item at %d from vector\n",ind);
erase(vec,ind);
break;
}
}
output(vec);
}
return 0;
}
三、realloc相关知识 realloc首先会在原有的数组首地址向后寻找申请空间,此时返回的还是原有数组的首地址;如果在原有首地址后找不到所需大小的空间,realloc则会调用malloc,重新申请空间,而且把原有空间中的数据拷贝到新空间中,然后释放原有空间,最后返回新申请空间的首地址;如果找不到所需大小的空间,realloc不会释放原空间,而且会返回一个空地址,代表重新分配空间失效。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
分享标题:算法与数据结构---顺序表-创新互联
浏览路径:http://scjbc.cn/article/egshc.html