【数据结构(C++)】顺序表(动态)基本操作(初始化,扩容,增删查改等操作)

文章详细介绍了如何在C++中使用动态顺序表,包括初始化、扩容操作流程以及插入、查找和删除等基本操作。重点强调了扩容时对内存空间的重新分配策略。
摘要由CSDN通过智能技术生成

动态分配顺序表总体和静态的没多大区别,就是随时可以进行扩容。

扩容流程为:1、分配一段连续的新空间,空间大小为扩容后的大小。

2、将原空间的数据粘贴到新空间。

3、释放原空间,将原空间指针指向新空间。

需要注意的是扩容并不是在原空间的基础上再加一点空间,而是在其他位置分配一段连续的,大小足够的新空间,将数据都放在新空间,原空间释放掉。

#include<bits/stdc++.h>
using namespace std;
#define InitSize 10//表长度初始化定义; 

typedef struct{
	int *data;//指示动态分配数组的指针 ;
	int MaxSize,Length;//最大容量和当前个数;
}SqList; 

//初始化 
void InitList(SqList &L){
	L.data=new int[InitSize];//分配大小为IntSize的int数据类型的空间;
	L.Length=0;
	L.MaxSize=InitSize;//初始化存储容量; 
}

//扩容,表的大小不够时进行扩容,前提是要有足够内存大小
void ExpendList(SqList &L,int NewSize){
	SqList Newdata;
	Newdata.data=new int[NewSize];
	Newdata.Length=0;
	for(int i=0;i<L.Length;i++){
		Newdata.data[i]=L.data[i];
		Newdata.Length++;
	}
	delete[] L.data;
	L.data=Newdata.data;
	L.MaxSize=NewSize;
} 

//插入,在第i个位置插入e
bool ListInsert(SqList &L,int i, int e){
	if(i<1||i>L.Length+1){
		return false;
	}
	if(L.Length>=L.MaxSize){
		return false;
	}
	for(int j=L.Length;j>i-1;j--){
		L.data[j]=L.data[j-1];
	} 
	L.data[i-1]=e;
	L.Length++;
	return true;
} 

//按值查找,查找value,返回它在表中位置(假设表中只有唯一一个value,或者返回第一个);
int LocateElem(SqList &List,int value){
	for(int i=0;i<List.Length;i++){
		if(List.data[i]==value){
			return i+1;//注意返回的位置是从1开始,不是下标; 
		}
	}
	return -1;//没找到返回-1; 
}

//按位查找,查找第i个元素,对应下标为i-1; 
int GetElem(SqList &List,int i){
	if(i>List.Length || i<1){
		return false;
	}
	return List.data[i-1];
}

/*删除操作,删除第i个元素;
 也可以进行按值删除,过程类似*/
 bool SqListDelet(SqList &List,int i){
 	if(i<1 || i>List.Length){
 		return false;
	 } 
	for(int j=i-1;j<List.Length;j++){
		List.data[j]=List.data[j+1];
	}
	List.Length--;
	return true;
 } 

int main(){
	SqList List;
	InitList(List);//初始化长为10的静态顺序表;
	for(int i=0;i<10;i++){
			List.data[i]=i+1;//把值赋了[1,2,3,4,5,6,7,8,9,10]; 
			List.Length++;
			cout<<List.data[i];
		}
		
		cout<<endl<< "数字8在表中位置为"<<LocateElem(List,8)<<endl;
		cout<<"第3个数字为:"<<GetElem(List,3)<<endl;
		
		//因为再插入元素,表的长度会大于最大长度,而我们又没有重新分配空间
		//所以下面这个插入操作没执行 
		if(ListInsert(List,3,9)){
		//在第三个位置插上9999; 
			for(int i=0;i<List.Length;i++){
				cout<<List.data[i];
			}
		}
		
		cout<<endl;
		if(SqListDelet(List,3)){
			//删除第3个元素 
			for(int i=0;i<List.Length;i++){
				cout<<List.data[i];
			}
		}
		
		cout<<endl; 
		if(ListInsert(List,3,3)){
		//在第3个位置插上3; 
			for(int i=0;i<List.Length;i++){
				cout<<List.data[i];
			}
		}
		
		cout<<endl<<"扩容前长度为:"<<List.Length<<endl<<"最大长度为:"<<List.MaxSize<<endl; 
		
		//扩容,扩容后大小为15
		ExpendList(List,15);
		cout<<"扩容后长度为:"<<List.Length<<endl<<"最大长度为:"<<List.MaxSize<<endl; 
		
		//扩容后添加数据;
		for(int i=List.Length;i<List.MaxSize;i++){
			List.data[i]=i+1;
			List.Length++;
		}
		cout<<"扩容后数据:" ;
		for(int i=0;i<List.Length;i++){
			cout<<List.data[i]<<endl;
		}
		cout<<endl<<"长度为:"<<List.Length;
		return 0;
	}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C语言中,顺序表是一种常见的数据结构,它是一种线性表,元素按照顺序存储在连续的内存空间中。顺序表的查找操作是指在顺序表中根据给定的关键字查找对应的元素。 顺序表的查找可以分为两种常见的方式:顺序查找和二分查找。 1. 顺序查找(Sequential Search): 顺序查找是一种简单直接的查找方法,它从顺序表的第一个元素开始逐个比较,直到找到目标元素或者遍历完整个顺序表。具体步骤如下: - 从顺序表的第一个元素开始,依次与目标元素进行比较。 - 如果找到目标元素,则返回其在顺序表中的位置。 - 如果遍历完整个顺序表仍未找到目标元素,则返回查找失败。 2. 二分查找(Binary Search): 二分查找是一种高效的查找方法,但要求顺序表中的元素必须是有序的。它通过将目标元素与顺序表中间位置的元素进行比较,根据比较结果确定继续在左半部分还是右半部分进行查找,以此类推,最终找到目标元素或者确定不存在。具体步骤如下: - 将顺序表按照关键字的大小进行排序。 - 比较目标元素与顺序表中间位置的元素。 - 如果目标元素等于中间位置的元素,则返回其位置。 - 如果目标元素小于中间位置的元素,则在左半部分继续进行二分查找。 - 如果目标元素大于中间位置的元素,则在右半部分继续进行二分查找。 - 重复以上步骤,直到找到目标元素或者确定不存在。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值