数据结构之顺序表
引言
顺序表是最基本的数据结构,主要知识点在于其的初始化、查找、遍历、删除元素、插入元素、扩容、释放空间
C语言顺序表的代码实现
PS:下面用到的malloc、free函数位于stdlib头文件中
结构体
typedef struct Vector{
int length,size;//顺序表的长度、空间大小
int*data;//指向特定连续空间的指针
}Vector
初始化顺序表
void init(Vector*vector,int size) {
vector->size=size;
vector->length=0;
vector->data=(int*)malloc(sizeof(int)*size);
}
查找元素
bool search(Vector*vector,int val) {
for(int i=0;i<vector->length;i++){
if(vector->data[i]==val){return true;}
}
return false;
}
遍历顺序表
void print(Vector*vector) {
for(int i=0;i<vector->length;i++){
if(i>0)printf(" ");
printf("%d",vector->data[i]);
}
printf("\n");
}
扩容
如果顺序表的大小小于它的长度,扩容就是必须的
扩容的步骤如下
- 申请一个是原来空间两倍大的新空间
- 将原空间的顺序表元素复制到新空间中
void expand(Vector*vector) {
int *old_data=vector->data;//新建一个指针指向旧空间
vector->size*=2;
vector->data=(int*)malloc(sizeof(int)*vector->size);//申请一个原来空间两倍大的新空间
for(int i=0;i<vector->length;i++){vector>data[i]=old_data[i];}//复制元素
free(old_data); //释放原空间
}
插入元素
插入元素即为插入的位置的元素均向右移一位
bool insert(Vector*vector,int loc,int val) {
if(loc<0||loc>vector->length){return false;}//若传入位置不符合要求,则报错
if(vector->length>=vector->size){expand(vector);}//扩容
for(int i=vector->length;i>loc;i--)
{vector->data[i]=vector->data[i-1];}//复制元素
vector->data[loc]=val;
vector->length++;//更新长度
return true;
}
删除元素
删除元素和插入元素相反,
void delete_node(Vector*vector,int loc) {
if(loc<0||loc>=vector->length){return false;}
for(int i=loc;i<vector->length-1;i++)
{vector->data[i]=vector->data[i+1];}
vector->length--;
return true;
}
释放空间
申请的空间记得要释放空间。不然长时间不释放空间会导致系统崩溃
PS:c语言的空间要程序员手动清理,而java则是系统自动清理。
void clear(Vector*vector) {
free(vector->data);
free(vector);
}
C++版本
其实和上面都差不多。区别在于c++多了new,delete函数,使用起来更加方便。new是用于申请空间,delete是用来释放空间。