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

数据结构顺序表的实现

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

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

//头文件----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;
}

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

http://www.xdnf.cn/news/2250.html

相关文章:

  • PyTorch作为深度学习框架在建筑行业的应用
  • 从基础到实践(三十三):USB接口简介
  • Python文件操作及数据库交互(Python File Manipulation and Database Interaction)
  • 【刷题Day27】Python/JAVA - 01(浅)
  • 状态压缩DP:蒙德里安的梦想
  • 极简桌面app官网版下载 极简桌面最新版 安装包下载
  • 导览项目KD-Tree最近地点搜索优化
  • Java集合复习题目
  • 【matlab】绘制maxENT模型的ROC曲线和omission curve
  • 基于 IPMI + Kickstart + Jenkins 的 OS 自动化安装
  • 如何监控和分析MySQL数据库的性能?
  • 指针遍历数组
  • 如何控制DeepSeek的输出内容之AI时代的流量入口GEO
  • JavaScript基础-运算符的分类
  • HiSpark Studio如何使用Trae(Marscode)插件
  • SpringBoot 常用注解通俗解释
  • puppeteer注入浏览器指纹过CDP
  • linux blueZ 第五篇:高阶优化与性能调优——蓝牙吞吐、延迟与功耗全攻略
  • 详解 Network.framework:iOS 网络开发的新基石
  • Spring进阶篇
  • Java面试高频问题(29-30)
  • 解释PyTorch中的广播机制
  • 如何在 Ubuntu 22.04|20.04|18.04 上安装 PostGIS
  • Docker 学习入门篇:镜像构建、推送与私有仓库搭建全攻略
  • JAVA JVM面试题
  • MQ消息的不可靠性发生情况与解决方案
  • Goland终端PowerShell命令失效
  • YOLOv5修改检测框颜色,粗细,标签大小,标签名称
  • 提示词的神奇魔力——如何通过它改变AI的输出
  • 7.Geometric Intersection: Interval