03.顺序表实现

        顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组上完成数据的增删改查。一般见到的顺序表都是在结构体中定义的数组,只是比普通数组多了增删改查等一些其他功能函数。

        上节已经介绍了顺序表有动态顺序表和静态顺序表。动态比静态有很多优点,这节将实现动态顺序表。

一、头文件定义

        1、包含实现动态顺序表所需的头文件。

        2、定义顺序表结构体。

        3、功能函数的声明。

//1、包含头文件
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
//assert()函数的作用:如果()内为假则断言报错终止运行//2、定义结构体
typedef int SLDataType;
typedef struct SeqList
{SLDataType* a;	//指针数组int size;		//数据个数int capacity;	//容量
}SL;//3、声明功能函数
//初始化加销毁
void SLInit(SL* ps);
void SLDestory(SL* ps);
//检查空间大小,如果空间小了则申请空间
void SLCheckCapacity(SL* ps);
//尾插和头插
void SLBackPush(SL* ps, SLDataType x);
void SLFrontPush(SL* ps, SLDataType x);
//尾删和头删
void SLBackPop(SL* ps);
void SLFrontPop(SL* ps);
//查找数据下标
int SLFind(SL* ps, SLDataType x);
//指定位置插入/删除
void SLInsert(SL* ps, int pos, SLDataType x);
void SLErase(SL* ps, int pos);
//打印顺序表
void SLPrint(SL* ps);

二、功能函数实现

#include "SeqList.h"//初始化加销毁
void SLInit(SL* ps)
{assert(ps);ps->a = NULL;ps->size = 0;ps->capacity = 0;
}
//销毁
void SLDestory(SL* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->size = 0;ps->capacity = 0;
}
//检查空间是否足够
void SLCheckCapacity(SL* ps)
{if (ps->size == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;SLDataType* tmp = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * newcapacity);if (tmp == NULL){perror("realloc fail\n");return;}ps->a = tmp;ps->capacity = newcapacity;}
}
//尾插
void SLBackPush(SL* ps, SLDataType x)
{assert(ps);		//断言SLCheckCapacity(ps);ps->a[ps->size] = x;ps->size++;
}
//头插
void SLFrontPush(SL* ps, SLDataType x)
{assert(ps);SLCheckCapacity(ps);for (int i = ps->size; i > 0; i--){ps->a[i] = ps->a[i - 1];}ps->a[0] = x;ps->size++;
}
//尾删
void SLBackPop(SL* ps)
{assert(ps);assert(ps->size);ps->size--;
}
//头删
void SLFrontPop(SL* ps)
{assert(ps);assert(ps->size);for (int i = 0; i < ps->size-1; i++){ps->a[i] = ps->a[i + 1];}ps->size--;
}
//查找数据下标
int SLFind(SL* ps, SLDataType x)
{assert(ps);assert(ps->size);for (int i = 0; i < ps->size; i++){if (ps->a[i] == x)return i;}return -1;
}
//在指定位置插入
void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);for (int i = ps->size; i > pos; i--){ps->a[i] = ps->a[i - 1];}ps->a[pos] = x;ps->size++;
}
//在指定位置删除
void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);ps->size--;for (int i = pos; i < ps->size; i++){ps->a[i] = ps->a[i + 1];}
}
//打印顺序表
void SLPrint(SL* ps)
{for (int i = 0; i < ps->size; i++){printf("%d ", ps->a[i]);}printf("\n");
}

三、主函数测试

#include "SeqList.h"int main()
{SL sl;SLInit(&sl);SLFrontPush(&sl, 1);SLFrontPush(&sl, 2);SLFrontPush(&sl, 3);SLFrontPush(&sl, 4);SLBackPush(&sl, 0);printf("插入的数据:");SLPrint(&sl);SLFrontPop(&sl);SLBackPop(&sl);printf("删除头和尾后:");SLPrint(&sl);printf("在下标1处添加数据9后:");SLInsert(&sl, 1, 9);SLPrint(&sl);int pos = SLFind(&sl, 9);printf("查找数据为9的下标:%d\n", pos);SLErase(&sl, pos);printf("删除下标为1的数据:");SLPrint(&sl);printf("查找数据为9的下标:%d\n", SLFind(&sl, 9));SLDestory(&sl);return 0;
}

 分别建立名为SeqList.h的头文件和SeqList.c的源文件,和一个主函数文件。运行上述代码:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/56735.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【android studio】Gradle和Gradle插件版本关系/配置/常见ERR示例

参考链接&#xff1a; Android之Gradle和Gradle插件区别及联系 grdle 的安装与配置 、gradle和jdk版本对应关系 Android Gradle Plugin与Gradle版本、JDK版本对应关系 配置示例 常见err 主要原因 1.编译版本未设定 2.有多个module而且gradle 版本设置不一致 修改如下&#xf…

虚幻闪烁灯光材质

创建一个材质 材质域改成光照函数 , Time让材质动起来 参数B用来控制速度 , Sine 让灯光闪烁 , Frac 增加了闪烁细节 把材质放到灯光材质上 效果还是挺不错的! 可以用于一些恐怖游戏~

OpenCV高级图形用户界面(8)在指定的窗口中显示一幅图像函数imshow()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在指定的窗口中显示一幅图像。 函数 imshow 在指定的窗口中显示一幅图像。如果窗口是以 cv::WINDOW_AUTOSIZE 标志创建的&#xff0c;图像将以原…

仕考网:国考笔试没进面还有机会吗?

在国家公务员考试及各省公务员考试中&#xff0c;除了常规的招录程序之外&#xff0c;还有调剂、递补和补录多重机会。 调剂&#xff1a;于笔试结束之后至面试启动之前.针对因报名人数不足未达到预定面试比例的岗位&#xff0c;将开放公开调剂。只要考生的笔试成绩超越了国考设…

如何查看默认网关地址:详细步骤

在日常的网络配置与故障排查中&#xff0c;了解并正确查看默认网关地址是一项基础且至关重要的技能。默认网关是连接本地网络与外部网络&#xff08;如互联网&#xff09;的关键节点&#xff0c;它扮演着数据包转发的重要角色。无论是家庭网络、办公室网络还是更复杂的网络环境…

一些简单的编程题(Java与C语言)

引言&#xff1a; 这篇文章呢&#xff0c;小编将会举一些简单的编程题用来帮助大家理解一下Java代码&#xff0c;并且与C语言做个对比&#xff0c;不过这篇文章所出现的题目小编不会向随缘解题系列里面那样详细的讲解每一到题&#xff0c;本篇文章的主要目的是帮助小编和读者们…

vcenter的使用

1 配置 1.1 时间配置 报错原因&#xff1a;ESXI主机没有配置DNS无法解析NTP服务器网址。 解决办法&#xff1a;配置ESXI主机DNS&#xff0c;操作如下图。 点击【配置】、【服务】 【编辑启动策略】 我们可以看到当前的【NTP服务状态】处于 已停止的状态 点击【配置】、【时间…

基于直播美颜SDK的实时美颜平台开发指南

随着直播平台的快速发展&#xff0c;用户对视频质量的要求越来越高&#xff0c;尤其是对于美颜效果的需求。为满足这一市场需求&#xff0c;基于直播美颜SDK的实时美颜平台应运而生。本文将探讨如何开发这样一个平台&#xff0c;助力开发者在激烈的竞争中脱颖而出。 一、理解美…

C#学习笔记(三)

C#学习笔记&#xff08;三&#xff09; 第 二 章 命名空间和类、数据类型、变量和代码规范二、类的组成和使用分析1. 基本概念2. 类的内容组成3. 方法的初步理解 第 二 章 命名空间和类、数据类型、变量和代码规范 二、类的组成和使用分析 1. 基本概念 类是程序的基本单元&a…

OpenCV高级图形用户界面(6)获取指定窗口中图像的矩形区域函数getWindowImageRect()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 提供窗口中图像的矩形区域。 该函数 getWindowImageRect 返回图像渲染区域的客户端屏幕坐标、宽度和高度。 函数原型 Rect cv::getWindowImage…

STM32_实验1_建立新工程

1、使用STM32CubeIDE建立一个新工程 1.1选择时钟源为外部晶振时钟。 1.2选择调试方式为 serial wire&#xff08;串行线&#xff09;。 1.3配置时钟树. 1.4选择以 c 和 h 文件型式管理工程文件。 1.5生成 hex 可执行文件。&#xff08;完成后点击锤子&#xff09; 2.串口输出调…

Windows环境NodeJS下载配置安装运行

Windows环境NodeJS下载配置安装运行 &#xff08;1&#xff09;下载 Node.js — Run JavaScript Everywhere 安装文件。 一路傻瓜式安装。 如果安装正常&#xff0c;输入命令可显示版本号&#xff1a; &#xff08;2&#xff09;可以查询nodejs默认的后续依赖安装包位置及缓存…

地方门户分类信息网站源码系统 用户可以自由发帖 PHP+MySQL组合开发 带完整的安装代码包以及搭建部署教程

系统概述 地方门户分类信息网站源码系统是一个基于PHP和MySQL开发的强大平台&#xff0c;旨在帮助用户轻松搭建地方性的分类信息网站。该系统集成了众多实用功能&#xff0c;支持用户自由发帖、浏览和搜索各类信息&#xff0c;如二手交易、求职招聘、房屋租售、生活服务、商家…

Winform和WPF的技术对比

WinForms&#xff08;Windows Forms&#xff09;和WPF&#xff08;Windows Presentation Foundation&#xff09;是用于创建桌面应用程序的两种技术。尽管两者都可以用于开发功能强大的Windows应用程序&#xff0c;但它们的设计理念、功能和开发体验都有显著区别。在本文中&…

三、ElementPlus下拉搜索加弹窗组件的封装

近期产品提出了一个需求&#xff0c;要求一个form的表单里面的一个组件既可以下拉模糊搜索&#xff0c;又可以弹窗搜索&#xff0c;我就为这个封装了一个组件&#xff0c;下面看效果图。 效果大家看到了&#xff0c;下面就看组件封装和实现方法 第一步&#xff0c;组件封装&…

Scratch图形化编程等级考试4级真题试卷(202409)

2024年9月Scratch图形化编程等级考试四级真题试卷 题目总数&#xff1a;24 总分数&#xff1a;100 选择题 第 1 题 单选题 Scratch运行下列程序&#xff0c;依次输入8、2、6后&#xff0c;角色说出的内容是&#xff1f;&#xff08; &#xff09; A.26862 B.62862 …

uni-app 开发微信小程序,实现图片预览和保存

1.使用 uni.previewImage() 预览图片 1.1 图片列表 1.2 预览 1.2.1 样式无法调整 1.2.2 微信小程序不支持预览本地文件路径图片&#xff08;图片上传到小程序的临时文件存储或云服务存储&#xff09; 1.3 无法绑定 longpress"saveImage(item)" 长按保存图片事件 …

C语言 | Leetcode C语言题解之第478题在圆内随机生成点

题目&#xff1a; 题解&#xff1a; typedef struct {double radius;double x_center;double y_center; } Solution;Solution* solutionCreate(double radius, double x_center, double y_center) {srand((unsigned)time(NULL));Solution *obj (Solution *)malloc(sizeof(Sol…

论文阅读(十六):Deep Residual Learning for Image Recognition

文章目录 1.介绍2.基本原理3.两种残差块4.网络结构 论文&#xff1a;Deep Residual Learning for Image Recognition   论文链接&#xff1a;Deep Residual Learning for Image Recognition   代码链接&#xff1a;Github 1.介绍 在ResNet网络提出之前&#xff0c;传统的卷…

如何快速部署一套智能化openGauss测试环境

一、openGauss介绍 openGauss是一款开源关系型数据库管理系统&#xff0c;采用木兰宽松许可证v2发行&#xff0c;允许用户自由地复制、使用、修改和分发软件。openGauss内核深度融合了华为在数据库领域多年的研发经验&#xff0c;结合企业级场景需求&#xff0c;持续构建竞争力…