c++顺序表复习,注解超详细!

本文介绍了使用C++实现顺序表的方法,包括基本操作如插入、删除等,并通过模板类实现泛型编程,适用于多种数据类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c++顺序表

距老师讲顺序表已经好久了,现在搞出来复习一下,自己打了个顺序表,加了一些注释,防止自己以后忘掉。

//源代码算是来源于老师,所以将老师写的博客地址在文章末尾粘贴
#include<iostream> 
using namespace std;
//模板类,T是泛化类型
template<typename T>class vec//链表T 
{
	T *elem;//整个连续空间的首地址
	int listsize;//设一个变量,表示连续空间的大小
	int length;//设一个变量,表示实际元素的个数
	public:
	vec()
	{//构造一个函数
		init();
	}
	void init()
	{//对线性表进行初始化
		elem=new T[1];//初始时,占用一个空间,多少都可以,但是一般是2的n次方 
		listsize=1;//连续空间大小当然为1; 
		length=0;	//实际元素个数也为 1;	
	}
	int enlarge()
	{//当L的空间不足时,将L的空间翻倍
	//如果成功返回1,失败返回0
	
		T *newbase=new T[listsize*2];//向操作系统申请一个新空间
		if(0==newbase)
			return 0;
		for(int i=0;i<length;i++)//把老空间已有数据拷贝到新空间
			newbase[i]=elem[i];
		delete []elem;//释放老空间
		elem=newbase;//elem指向新空间首地址,用的时候还是elem[] 
		listsize=listsize*2;//空间大小翻倍
		return 1;		
		
	}
	void push_back(T x)
	{//在顺序表尾部插入数据
		if(length==listsize)
		{//空间不足就调用enlarge函数 
			enlarge();
		}
		
		elem[length]=x;//插入数据后,插入的数据elem[]下标正好是没有++之前的length ; 
		length++; //现有的length+1; 
	}
	
	int insert(int i,T x)
	{//在顺序表的第i个位置插入元素x
	//如果成功,返回1,否则返回0
 
		if(i<0||i>length) return 0;//判断i是否符合条件 
		if(length==listsize)
		{//空间不够就 enlarge一个二倍的 
			int flag=enlarge();
			if(flag==0)return 0;
		}
		int j;
		for(j=length-1;j>=i;j--)//j为第几位元素对应下标。挪的时候是从后边开始一个一个挪 ,所以先拿elem[length-1]开刀; 
			elem[j+1]=elem[j];//第i到length-1个数据后移一位; 
		elem[i]=x;//插入数据; 
		length++;//表长增一; 
		return 1;
		
	}
	int erase(int i)
	{//删除下标为 i 的数据 
		if(i<0 || i>=length)//如果删除位置不合法
			return -1;
		else
		{
			for(int j=i+1;j<=length-1;j++)//j同上,删除是从前往后挪,所以j++,先拿length[i+1]开刀; 
				elem[j-1]=elem[j];//元素前移一位
			length--;
			return 1;
		}
		
	}
	int find(T e)
	{//在顺序表中查找元素e是否存在,
		//如果存在返回对应的下标
		//否则返回-1
		for(int i=0;i<=length-1;i++)
		{
			if(elem[i]==e)
				return i;
		}
		return -1;
	} 
		
	
	void print() 
	{
		int i;
		for(i=0;i<length;i++)
		{
			cout<<elem[i]<<" ";
		}
		cout<<"\n";
	}
	~vec()
	{
		delete []elem;
	}
};
 
int main()
{
	vec<int> v;
	//v.init();
	v.push_back(1);v.push_back(2);
	v.push_back(4);v.push_back(5);
	v.print();
	v.insert(2,3);
	v.print();
	v.erase(4);
	v.print();
	cout<<v.find(3)<<endl;
    return 0;
    } 

这次先更个顺序表,下次再更个链表,单向循环和双向循环全部来一遍,哈哈,感觉我的注释易懂的道友点个关注啊!下边还会持续更新

DS004-C++模板类-顺序表-超级数组-占用连续空间-随机存取-动态扩展空间-尾部插入效率高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值