顺序表操作

本文详细探讨了顺序表的两种内存管理方式,静态分配的Sqlist与动态分配的SeqList。首先介绍了静态分配的初始化和打印操作,然后转向动态分配的内存申请、扩容和元素操作。最后对比了两者的灵活性和效率。
摘要由CSDN通过智能技术生成
//顺序表  静态分配
#define MaxSize 10   //定义一个长度
typedef struct{
	int date[MaxSize];//  定义一个数组,存放数据元素
	int length;      //定义一个顺序表当前长度
}Sqlist;        //用Sqlist这个类型名,代替了 struct Sqlist
//初始化顺序表
void InitList(Sqlist &L){          //&L 是指有返回值的参数,即为调用这个函数之后,数据表的内容就和这个函数的一致了
	for(int i=0;i<MaxSize;i++){    //赋值初始化这步可省略
		L.date[i]=0;
	}
	L.length=0;   //未存入任何值,所以顺序表的当前长度为0
}
int main(){
	Sqlist L;    //数据表声明
	InitList(L);  //调用初始化函数
	for(int i=0;i<MaxSize;i++){   //这种方法错误
		printf("data[%d]=%d\n",i,L.date[i]);
	}
	system("pause");
	return 0;
}




//顺序表动态分配
#define InitSize 10   //默认最大长度
typedef struct{
	int *data;   //动态分配数组指针
	int MaxSize;   //定义个顺序表最大容量
	int length;   //定义个顺序表当前长度
}SeqList;
//顺序表初始化
void InitList(SeqList &L){
	//用malloc申请一片连续的存储空间
	L.data=(int *)malloc(sizeof(int)*InitSize);//申请10个int类型大小的空间
	L.length=0;
	L.MaxSize=InitSize;
}
//增加动态数组长度
void increaseList(SeqList &L,int len){
	int *p=L.data;   //让指针p指向顺序表的起始地址
	L.data=(int *)malloc(sizeof(int)*(L.MaxSize+len));     //给data重新开辟空间
	for(int i=0;i<L.length;i++){    //将原来data的值复制到开辟新空间的data中
		L.data[i]=p[i];
	}
	L.MaxSize=L.MaxSize+len;   //数据元素MaxSize也增加了len的长度
	free(p);  //把指针p所指向的顺序的原来的的存储空间释放
}

//调用
int main(){
	SeqList L;
	InitList(L);
	increaseList(L,5);
	system("pause");
	return 0;
}


//顺序表-插入
#define MaxSize 0
typedef struct{
	int data[10];
	int length;
}SqList;
void InitList(SqList &L){
	L.length=0;
}

//插入
bool InsertList(SqList &L,int i,int e){
	if(i<1 || i>L.length+1){        //判断i的范围是否合法,L.length+1是插入到顺序表的末尾
		return false;
	}
	if(L.length>=MaxSize){       //判断存储空间是否已经满了
		return false;
	}
	for(int j=L.length;j>=i;i--){   //i-1之后的元素后移
		L.data[j]=L.data[j-1];
	}
	L.data[i-1]=e;
	L.length++;
	return true;
}

//删除
bool ListDelete(SqList &L,int i,int &e){
	if(1<i || i>L.length){
		return false;
	}
	e=L.data[i-1];
	for(int j=i;j<L.length;j++){
		L.data[j-1]=L.data[j];
	}
	L.length--;
	return false;
}
int main(){
	SqList L;
	InitList(L);
	//调用插入
	InsertList(L,2,3);
	//调用删除
	int e=2;
	if(ListDelete(L,3,e)){
		printf("已经删除第三个元素,删除的值为%d\n",e);
	}else{
		printf("输入的位序i不合法,删除失败!\n");
	}
	return 0;
}



//线性表按位查找
//静态分配
#define MaxSize 10
typedef struct{
	int data[10];
	int length;
}SqList;
int GetElem(SqList &L,int i){
	return L.data[i-1];
}



//动态分配
#define InitSize 10
typedef struct{
	int *data;
	int	MaxSize;
	int length;
}SeqList;
int GetElem(SeqList &L,int i){
	return L.data[i-1];
}*/

//线性表按值查找
//查找第一个为e的函数,按值查找返回的是其位序
#define InitSize 10
typedef struct{
	int *data;
	int MaxSize;
	int length;
}SeqList;
int LocateElem(SeqList L,int e){
	for(int i=0;i<L.length;i++){
		if(L.data[i]==e){
			return i+1;
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值