当前位置: 首页 > news >正文

数据结构顺序表的实现

在实现顺序表的时候,一定要注意下标,一不小心就会出错;

下面是实现顺序表的代码:

//头文件----SeqList.h#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>typedef int SLDataType;
typedef struct seqlist
{SLDataType* arr;int sz;//计算元素个数int capacity;//计算空间的容量
}SL;//为什么要用指针呢?因为形参是实参的临时拷贝,传地址是要对参数进行修改的void SLInit(SL* ps);//顺序表初始化
void SLDestroy(SL* ps);//顺序表销毁
void SLPrint(SL s);//打印顺序表
void SLCheckCapacity(SL* ps);//空间不够申请空间
//尾部插⼊和删除 
void SLPushBack(SL* ps, SLDataType x);
void SLPopBack(SL* ps);
//头部插⼊和删除
void SLPushFront(SL* ps, SLDataType x);
void SLPopFront(SL* ps);
//指定位置之前插⼊和删除数据
void SLInsert(SL* ps, int pos, SLDataType x);
void SLErase(SL* ps, int pos);
//查找指定的元素
int SLFind(SL* ps, SLDataType x);

#pragma once的作用是防止后续的代码多次包含该文件。 

//源文件-------SeqList.c
#include"SeqList.h"void SLInit(SL* ps)//顺序表初始化
{ps->arr = NULL;ps->sz = 0;ps->capacity = 0;
}
void SLDestroy(SL* ps)//顺序表销毁
{if(ps->arr!=NULL){free(ps->arr);}ps->arr = NULL;ps->sz = 0;ps->capacity = 0;
}
void SLPrint(SL s)//打印顺序表
{for (int i = 0; i < s.sz; i++){printf("%d ",s.arr[i]);}printf("\n");
}
void SLCheckCapacity(SL* ps)//空间不够申请空间
{if (ps->sz == ps->capacity){int newcapacity = ps->capacity==0 ? 4 : 2 * ps->capacity;SLDataType* tmp = (SLDataType*)malloc(sizeof(SL) * newcapacity);if (tmp == NULL){perror("malloc fail");return;}ps->arr = tmp;ps->capacity = newcapacity;}
}
//尾部插⼊和删除 
void SLPushBack(SL* ps, SLDataType x)
{assert(ps);//等价于ps!=nullSLCheckCapacity(ps);ps->arr[ps->sz] = x;ps->sz++;
}
void SLPopBack(SL* ps)
{assert(ps);assert(ps->sz);//避免sz==0.所以要断言一下ps->sz--;
}
//头部插⼊和删除
void SLPushFront(SL* ps, SLDataType x)
{assert(ps);SLCheckCapacity(ps);int i = 0;for (int i = ps->sz; i > 0; i--){ps->arr[i] = ps->arr[i-1];//要注意下标}ps->arr[i] = x;ps->sz++;
}
void SLPopFront(SL* ps)
{assert(ps);int i = 0;for (i = 0; i < ps->sz; i++){ps->arr[i] = ps->arr[i + 1];}ps->sz--;
}
//指定位置之前插⼊和删除数据
void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos>=0&&pos<=ps->sz);//pos是指定下标位置(大于等于0且小于有效数据个数)SLCheckCapacity(ps);int i = 0;for (i = ps->sz; i >pos; i--){ps->arr[i] = ps->arr[i-1];}ps->arr[pos] = x;ps->sz++;
}
void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos <= ps->sz);int i = 0;for (i = pos; i < ps->sz-1; i++){ps->arr[i ] = ps->arr[i+1];}ps->sz--;
}
//查找指定的元素
int SLFind(SL* ps, SLDataType x)
{assert(ps);int i = 0;for (i = 0; i < ps->sz; i++){if (ps->arr[i] == x){return i;}}return -1;
}

函数传参使用地址是因为形参是实参的临时拷贝,传址是需要对值进行修改。在写的过程中一定要注意下标,出错了好多次。

相关文章:

  • react 报错
  • TortoiseGit 入门指南
  • [特殊字符] 深入理解Spring Cloud与微服务架构:全流程详解(含中间件分类与实战经验)
  • 什么是函数依赖中的 **自反律(Reflexivity)**、**增广律(Augmentation)** 和 **传递律(Transitivity)?
  • 大模型奖励建模新突破!Inference-Time Scaling for Generalist Reward Modeling
  • Python爬虫-爬取汽车之家各品牌月销量榜数据
  • Pygame终极项目:从零开发一个完整2D游戏
  • 一键快速转换音频视频格式的实用工具
  • Linux进程解析
  • Java操作数据库(JDBC)
  • C++异步并发支持库future
  • FPGA前瞻篇-组合逻辑电路设计-多路复用器
  • 云原生--核心组件-容器篇-3-Docker核心之-镜像
  • 我是如何用AI编程制作一个AI表情包生成的小程序
  • 大模型微调与蒸馏的差异性与相似性分析
  • (四) 实战Trae 编译调试C++项目(以minidocx为例)
  • 【学习】Codeforces Round 786 (Div. 3)G. Remove Directed Edges
  • strcmp()在C语言中怎么用(附带实例)
  • .NET8 依赖注入组件
  • day003-重置密码
  • 商务部:将打造一批国际消费集聚区和入境消费友好商圈
  • 一回合摘下“狮心”,张名扬霸气回应观众:再嘘一个我听听
  • 人民日报:光荣属于每一个挺膺担当的奋斗者
  • 乌方称泽连斯基与特朗普进行简短会谈
  • 国铁集团:一季度全国海铁运输商品车同比增长33.62%
  • “今日海上”对话“今日维也纳”,东西方艺术在上海碰撞