算法与数据结构---顺序表

前言

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

          3.顺序表代码演示_哔哩哔哩_bilibili

数据结构=结构定义+结构操作 

针对此线性表

 

 

1、size代表当前线性表的总大小,最多存储多少个元素。

2、length代表当前线性表一共存储的元素个数。

3、data_type代表当前线性表存储的每个元素的数据类型。


一、顺序表操作的相关代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//类型定义 
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;i<vec->length;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;i<vec->length;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;i<MAX_OP;i++){
   	  op=rand()%4;//四种情况0,1,2,3 
   	  ind=rand()%(vec->length+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 <stdio.h>
#include <stdlib.h>
#include <time.h>
//类型定义 
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;i<vec->length;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;i<vec->length;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;i<MAX_OP;i++){
   	  op=rand()%4;//四种情况0,1,2,3 
   	  ind=rand()%(vec->length+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不会释放原空间,而且会返回一个空地址,代表重新分配空间失效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值