算法与数据结构---顺序表-创新互联

前言

本文章为观看如下视频所写:

创新互联公司主要为客户提供服务项目涵盖了网页视觉设计、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://myzitong.com/article/egshc.html