数据结构之顺序表(C语言)

数据结构之顺序表

引言

顺序表是最基本的数据结构,主要知识点在于其的初始化、查找、遍历、删除元素、插入元素、扩容、释放空间

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是用来释放空间。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值