当前位置: 首页 > 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-重置密码
  • 生命与大海相连:他在300多米的深海行走,在沉船一线打捞救援
  • 金融监管总局修订发布《行政处罚办法》,7月1日起施行
  • 中国海警位中国黄岩岛领海及周边区域执法巡查
  • 美参议院通过新任美国驻华大使任命,外交部回应
  • 中央党校(国家行政学院)举行2025年春季学期第一批进修班毕业典礼
  • 迎接八方来客:全国多地“五一”假期党政机关大院停车场免费开放