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