顺序表(C/C++)

        本篇将讲解一些关于顺序表的内容,顺序表分为静态顺序表和动态顺序表,其中经常用到的为动态顺序表,所以本篇将以动态顺序表为重点给出一些关于动态顺序表的操作。

        因为顺序表的实现逻辑较为简单,对于代码的讲解大多以注释给出。

1.顺序表相关操作

        以下包括顺序表的抽象类型定义、两种顺序表的定义方式、以及一些相关操作:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>//元素类型
typedef int DataType;
//静态表元素个数
#define MAX_SIZE 10//静态顺序表
typedef struct {       DataType arr[MAX_SIZE];int size;
}SL;//动态顺序表
typedef struct {       DataType* arr;int size;         int capacity;
}SqList;//顺序表初始化
void SLInit(SqList* ps);	//顺序表尾插/头插
void SLPushBack(SqList* ps,DataType x); 
void SLPushFront(SqList* ps, DataType x);//顺序表尾部删除/头部删除
void SLPopBack(SqList* ps);
void SLPopFront(SqList* ps);//指定位置之前插入/删除数据
void SLInsert(SqList* ps, int position, DataType x);
void SLErase(SqList* ps, int position);//在顺序表中找到相关的元素
int SLFind(SqList* ps, DataType x);//打印顺序表
void SLPrint(SqList* ps);				

2.顺序表的插入与初始化 

        顺序表的插入包括头插和尾插,头插就是在顺序表的第一个元素位置插入,尾插就是在最后一个元素后面插入。

//顺序表的初始化
void SLInit(SqList* ps) {ps->arr = NULL;ps->capacity = 0;ps->size = 0;
}//检查顺序表的当前容量
void SLCheckCapacity(SqList* ps) {if (ps->capacity == ps->size) {//三目操作符对容量进行分配int newCapacity = (ps->capacity == 0) ? 4 : 2 * ps->capacity; DataType* newBase = (DataType*)realloc(ps->arr, newCapacity * sizeof(DataType));if (newBase == NULL) {perror("realloc:");exit(1);}ps->arr = newBase;ps->capacity = newCapacity;}
}//头插
void SLPushFront(SqList* ps, DataType x) {SLCheckCapacity(ps);int count = ps->size;//将所有元素都向后移一位while (count != 0) {ps->arr[count] = ps->arr[count - 1];count--;}ps->arr[count] = x;ps->size++;
}//尾插
void SLPushBack(SqList* ps,DataType x) {SLCheckCapacity(ps);ps->arr[ps->size] = x;ps->size++;
}

3.顺序表的删除 

        以下为顺序表的头部删除和尾部删除。

//尾删
void SLPopBack(SqList* ps) {//检查顺表是否存在,以及容量是否为0assert(ps);assert(ps->size);ps->size--;
}void SLPopFront(SqList* ps) {assert(ps);assert(ps->size);//将所有元素都向前覆盖for (int i = 0; i < ps->size - 1; i++) {ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

4.顺序表的指定插入与删除

        以下的代码对指定位置的插入与删除:

//指定位置插入
void SLInsert(SqList* ps, int position, DataType x) {//判断位置是否合法assert(position >= 0 && position <= ps->size);assert(ps);for (int i = ps->size; i > position; i--) {ps->arr[i] = ps->arr[i - 1];}ps->arr[position] = x;ps->size++;
}//指定位置删除
void SLErase(SqList* ps, int position) {assert(ps);assert(position >= 0 && position < ps->size);//从指定位置开始往前覆盖for (int i = position; i < ps->size - 1; i++) {ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

5.顺序表的查找以及遍历 

        顺序表的查找为在表中找到对应的元素,遍历就是将所有元素给打印出来:

//顺序表的遍历
void SLPrint(SqList* ps) {assert(ps);assert(ps->size);for (int i = 0; i < ps->size; i++) {printf("%d ", ps->arr[i]);}printf("\n");
}//顺序表的查找
int SLFind(SqList* ps, DataType x) {assert(ps);assert(ps->size);int i = 0;for (i = 0; i < ps->size; i++) {if (ps->arr[i] == x) {return i + 1;}}return -1;
}

6.全部代码

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>//元素类型
typedef int DataType;//动态顺序表
typedef struct {       DataType* arr;int size;         int capacity;
}SqList;void SLInit(SqList* ps) {ps->arr = NULL;ps->capacity = 0;ps->size = 0;
}void SLCheckCapacity(SqList* ps) {if (ps->capacity == ps->size) {int newCapacity = (ps->capacity == 0) ? 4 : 2 * ps->capacity;DataType* newBase = (DataType*)realloc(ps->arr, newCapacity * sizeof(DataType));if (newBase == NULL) {perror("realloc:");exit(1);}ps->arr = newBase;ps->capacity = newCapacity;}
}//尾插
void SLPushBack(SqList* ps,DataType x) {SLCheckCapacity(ps);//检验容量ps->arr[ps->size] = x;ps->size++;
}//头插
void SLPushFront(SqList* ps, DataType x) {SLCheckCapacity(ps);int count = ps->size;while (count != 0) {ps->arr[count] = ps->arr[count - 1];count--;}ps->arr[count] = x;ps->size++;
}void SLPrint(SqList* ps) {assert(ps);assert(ps->size);for (int i = 0; i < ps->size; i++) {printf("%d ", ps->arr[i]);}printf("\n");
}void SLPopBack(SqList* ps) {assert(ps);assert(ps->size);ps->size--;
}void SLPopFront(SqList* ps) {assert(ps);assert(ps->size);for (int i = 0; i < ps->size - 1; i++) {ps->arr[i] = ps->arr[i + 1];}ps->size--;
}void SLInsert(SqList* ps, int position, DataType x) {assert(position >= 0 && position <= ps->size);for (int i = ps->size; i > position; i--) {ps->arr[i] = ps->arr[i - 1];}ps->arr[position] = x;ps->size++;
}void SLErase(SqList* ps, int position) {assert(ps);assert(position >= 0 && position < ps->size);for (int i = position; i < ps->size - 1; i++) {ps->arr[i] = ps->arr[i + 1];}ps->size--;
}int SLFind(SqList* ps, DataType x) {assert(ps);assert(ps->size);int i = 0;for (i = 0; i < ps->size; i++) {if (ps->arr[i] == x) {return i + 1;}}return -1;
}int main() {SqList SL;SLInit(&SL);SLPushBack(&SL, 1);SLPushBack(&SL, 2);SLPushBack(&SL, 3);SLPushBack(&SL, 4);SLPrint(&SL);  //1 2 3 4SLPushFront(&SL, 7);SLPushFront(&SL, 6);SLPushFront(&SL, 5);SLPrint(&SL);  //5 6 7 1 2 3 4SLPopBack(&SL);SLPopBack(&SL);SLPopFront(&SL);SLPrint(&SL);  //6 7 1 2SLErase(&SL, 0);SLInsert(&SL, 2, 9);SLPrint(&SL);  //7 1 9 2int ret = SLFind(&SL, 9);if (ret == -1) {printf("have not the element\n");}else {printf("the location of element is %d\n", ret);}return 0;
}

7.测试 

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

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

相关文章

IaC基础设施即代码:Terraform 使用 provider 自定义提供者

目录 一、实验 1.环境 2.Terraform 使用 provider 自定义提供者 &#xff08;Resource&#xff09; 3.Terraform 使用 provider 自定义提供者 &#xff08;Module&#xff09; 一、实验 1.环境 &#xff08;1&#xff09;主机 表1-1 主机 主机系统软件工具备注jia Windo…

深入数仓离线数据同步:问题分析与优化措施

一、前言 在数据仓库领域&#xff0c;离线数仓和实时数仓是常见的两种架构类型。离线数仓一般通过定时任务在特定时间点&#xff08;通常是凌晨&#xff09;将业务数据同步到数据仓库中。这种方式适用于对数据实时性要求不高&#xff0c;更侧重于历史数据分析和报告生成的场景…

2024.1.20每日一题

LeetCode 2788.按分隔符拆分字符串 2788. 按分隔符拆分字符串 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个字符串数组 words 和一个字符 separator &#xff0c;请你按 separator 拆分 words 中的每个字符串。 返回一个由拆分后的新字符串组成的字符串数组…

【Python】人工智能-机器学习——不调库手撕演化算法解决函数最小值问题

1 作业内容描述 1.1 背景 现在有一个函数 3 − s i n 2 ( j x 1 ) − s i n 2 ( j x 2 ) 3-sin^2(jx_1)-sin^2(jx_2) 3−sin2(jx1​)−sin2(jx2​)&#xff0c;有两个变量 x 1 x_1 x1​ 和 x 2 x_2 x2​&#xff0c;它们的定义域为 x 1 , x 2 ∈ [ 0 , 6 ] x_1,x_2\in[0,6] …

Linux 【C编程】 引入线程,线程相关函数

1.线程的引入 1.1使用线程同时读取键盘和鼠标 代码演示&#xff1a; #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> #include <termios.h> #include <fcntl.h> #include <string.h> // 读取…

爬取的数据可以入表吗?怎样入表?

合规是数据入表的前提。当前爬虫数据是非常敏感的&#xff0c;因为爬虫极容易造成两大不合规的问题&#xff1a;一是没有经过个人同意获取数据&#xff0c;二是爬取的数据里可能含有个人敏感信息也是一个问题。现在法律对于这部分非常严苛&#xff0c;如果企业里有50条未获得授…

Pytest系列(2) - assert断言详细使用

前言 与unittest不同&#xff0c;pytest使用的是python自带的assert关键字来进行断言assert关键字后面可以接一个表达式&#xff0c;只要表达式的最终结果为True&#xff0c;那么断言通过&#xff0c;用例执行成功&#xff0c;否则用例执行失败 assert小栗子 想在抛出异常之…

算数移位,逻辑移位以及循环移位

目录 一.算数移位 1.原码的算数移位一一符号位保持不变&#xff0c;仅对数值位进行移位 2.反码的算数移位 3.补码的算数移位 二.逻辑移位 三.循环移位 一.算数移位 1.原码的算数移位一一符号位保持不变&#xff0c;仅对数值位进行移位 算数移位是通过改变各个数码位和小…

vue二次封装ant-design-vue中的Modal弹窗组件,实现拖拽,全屏两种功能,原有参数属性不变

在我们的项目的有的地方需要用弹框的拖拽&#xff0c;以及弹窗自定义全屏显示的需求&#xff0c;所以再次将二次合一&#xff0c;同时弹框里面内容自适应屏幕高度 在ant-design-vue中&#xff0c;已经实现了拖拽&#xff0c;全屏的功能&#xff0c;下面是ant官网的示例 自定义…

宋仕强论道之再混华强北(三十五)

我是2012年重新回到华强北的&#xff0c;宋仕强说来深圳市第一份工作就在华强北担任一名工程师&#xff0c;和华强北有深厚的感情。我回来后经常混华强北的上层圈子跟老板老板娘们吹牛逼&#xff0c;最初大家看我穿的衣冠楚楚人模狗样的但态度吊儿郎当&#xff0c;理论一套一套…

K8s调试积累

文章目录 一、K8S 集群服务访问失败&#xff1f;二、K8S 集群服务访问失败&#xff1f;三、K8S 集群服务暴露失败&#xff1f;四、外网无法访问 K8S 集群提供的服务&#xff1f;五、pod 状态为 ErrImagePull&#xff1f;六、探测存活 pod 状态为 CrashLoopBackOff&#xff1f;七…

PDF.js - 免费开源的 JavaScript 读取、显示 PDF 文档的工具库,由 Mozilla 开发并且持续维护

最近新项目需要处理 PDF&#xff0c;研究了 PDf.js 之后觉得很不错&#xff0c;于是写篇文章推荐给大家。 PDF.js 的功能和它的名字一样简单&#xff0c;是一个使用 HTML5 技术来让前端网页支持读取、解析和显示 PDF 文档的 JS 工具库。这个项目由大名鼎鼎的 Mozilla 组织开发…