数据结构(初阶)(二)----顺序表

server/2025/1/19 22:37:18/

顺序表

  • 顺序表
    • 概念与结构
    • 顺序表实现
      • 头文件
      • 创建与初始化
      • 尾插
        • 判断空间大小
      • 头插
      • 尾删
      • 头删
      • 查找
      • 指定位置之前插入数据
      • 指定位置删除数据
      • 销毁(回收)
    • 测试文件

概念与结构

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般采用数组存储。

顺序表实现

头文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>typedef int SLTDataType;
typedef struct SeqList 
{SLTDataType* arr;int size;int capacity;
}SLT;//初始化
void SLTInit(SLT* slt);//判断空间大小,如果不够增容
void SLTCheckCapacity(SLT* ps);//尾插
void SLTPushBack(SLT* ps,SLTDataType x);//打印顺序表
void SLTPrint(SLT* ps);//头插
void SLTPushFront(SLT* ps, SLTDataType x);//尾删
void SLTPopBack(SLT* ps);//头删
void SLTPopFront(SLT* ps);//查找元素,返回对应位置下标,没有返回-1
int SLTFind(SLT* ps, SLTDataType x);//指定位置之前插入数据
void SLTInsert(SLT* ps, int pos, SLTDataType x);//删除指定位置元素
void SLTErase(SLT* ps, int pos);//销毁顺序表
void SLTDestory(SLT* ps);

创建与初始化

#define _CRT_SECURE_NO_WARNINGS#include"SeqList.h"//初始化
void SLTInit(SLT* ps)
{assert(ps);ps->arr = NULL;ps->size = ps->capacity = 0;
}

尾插

在插入之前我们需要先判断顺序表的空间大小是否足够,如果不够就需要对原有空间增容,判断依据是size == capacity,如果等式成立,那么空间就满了,需要增容。

增容,一般是成倍的增加,这里我们使用2倍的增容。

判断空间大小
//判断空间大小,如果不够增容
void SLTCheckCapacity(SLT* ps)
{assert(ps);if (ps->size == ps->capacity){//注意在初始状态下,空间大小为0,需要判断给定初始空间int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;//扩容有可能失败,需要创建新的指针来接收,成功后再赋给原数组SLTDataType* tmp = (SLTDataType*)realloc(ps->arr, newCapacity * sizeof(SLTDataType));if (tmp == NULL){perrpr("SLTCheckCapacity()::realloc fail");exit(1);}ps->arr = tmp;ps->capacity = newCapacity;}
}
//尾插
void SLTPushBack(SLT* ps,SLTDataType x)
{assert(ps);SLTCheckCapacity(ps);ps->arr[ps->size++] = x;
}

头插

//头插
void SLTPushFront(SLT* ps, SLTDataType x)
{assert(ps);SLTCheckCapacity(ps);for (int i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[0] = x;++ps->size;
}

尾删

时间复杂度为O(1)

//尾删
void SLTPopBack(SLT* ps)
{//顺序表不为空,且有效数据个数不为0assert(ps && ps->size);--ps->size;
}

头删

时间复杂度O(n)

//头删
void SLTPopFront(SLT* ps)
{//顺序表不为空,且有效数据个数不为0assert(ps && ps->size);for (int i = 0; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}--ps->size;
}

查找

//查找元素,返回对应位置下标,没有返回-1
int SLTFind(SLT* ps, SLTDataType x)
{assert(ps);if (ps->size == 0){return -1;}for(int i = 0;i < ps->size;i++){if (ps->arr[i] == x){return i;}}return -1;
}

指定位置之前插入数据

//指定位置之前插入数据
void SLTInsert(SLT* ps, int pos, SLTDataType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);for (int i = ps->size; i > pos; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[pos] = x;++ps->size;
}

指定位置删除数据

//删除指定位置元素
void SLTErase(SLT* ps, int pos)
{assert(ps);assert(pos >= 0 && pos <= ps->size);for (int i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}--ps->size;
}

销毁(回收)

//销毁顺序表
void SLTDestory(SLT* ps)
{assert(ps);if (ps->arr)free(ps->arr);ps->arr = NULL;ps->size = ps->capacity = 0;
}

测试文件

#define _CRT_SECURE_NO_WARNINGS
#include"SeqList.h"void test1()
{SLT slt;SLTInit(&slt);//尾插SLTPushBack(&slt,1);SLTPushBack(&slt,2);SLTPushBack(&slt,3);SLTPushBack(&slt,4);SLTPushBack(&slt,5);头插//SLTPushFront(&slt, 11);//SLTPushFront(&slt, 12);//SLTPushFront(&slt, 13);//SLTPushFront(&slt, 14);///尾删//SLTPopBack(&slt);//SLTPopBack(&slt);//头删//SLTPopFront(&slt);//SLTPopFront(&slt);//打印顺序表SLTPrint(&slt);//查找元素,返回对应位置下标,没有返回-1int ret = SLTFind(&slt, 12);printf("%d\n", ret);指定位置之前插入数据//SLTInsert(&slt, ret, 21);//SLTInsert(&slt, ret, 22);//删除指定位置元素SLTErase(&slt, ret);SLTErase(&slt, ret);//打印顺序表SLTPrint(&slt);销毁顺序表//SLTDestory(&slt);
}int main()
{test1();return 0;
}

http://www.ppmy.cn/server/159741.html

相关文章

链家房价数据爬虫和机器学习数据可视化预测

完整源码项目包获取→点击文章末尾名片&#xff01;

Web3D交互展示:重塑产品展示的新维度

在当今数字化时代&#xff0c;如何高效、直观地展示产品成为企业营销的关键一环。传统的二维图片和视频展示虽然在一定程度上能够传达产品信息&#xff0c;但往往缺乏沉浸感和互动性&#xff0c;难以满足消费者日益增长的体验需求。在此背景下&#xff0c;Web3D交互展示应运而生…

构建高可用和高防御力的云服务架构第五部分:PolarDB(55)

引言 云计算与数据库服务 云计算作为一种革命性的技术&#xff0c;已经深刻改变了信息技术行业的面貌。它通过提供按需分配的计算资源&#xff0c;使得数据存储、处理和分析变得更加灵活和高效。在云计算的众多服务中&#xff0c;数据库服务扮演着核心角色。数据库服务不仅负…

彩色图像面积计算一般方法及MATLAB实现

一、引言 在数字图像处理中&#xff0c;经常需要获取感兴趣区域的面积属性&#xff0c;下面给出图像处理的一般步骤。 1.读入的彩色图像 2.将彩色图像转化为灰度图像 3.灰度图像转化为二值图像 4.区域标记 5.对每个区域的面积进行计算和显示 二、程序代码 %面积计算 cle…

洛谷P1113 杂务(拓扑排序)

题目链接&#xff1a;P1113 杂务 - 洛谷 | 计算机科学教育新生态 题目描述 John 给奶牛挤奶前要完成很多杂务&#xff0c;每一项杂务都需要一些时间来完成&#xff0c;有些杂务必须在另一些杂务完成的情况下才能进行。 比如&#xff1a;只有将奶牛赶进牛棚才能开始为它清洗乳房…

idea中远程调试中配置的参数说明

Ⅰ 远程调试中配置的端口号与服务本身端口号区别 一、远程调试中配置端口号的作用 在 IDEA 中进行远程调试时配置的端口号主要用于建立开发工具&#xff08;如 IDEA&#xff09;和远程服务之间的调试连接。当你启动远程调试时&#xff0c;IDEA 会监听这个配置的端口号&#xf…

jmeter事务控制器-勾选Generate Parent Sample

1、打开jmeter工具&#xff0c;添加线程组&#xff0c;添加逻辑控制器-事务控制器 2、在事务控制器&#xff0c;勾选Generate parent sample&#xff1a;生成父样本&#xff1b;说明勾选后&#xff0c;事务控制器会作为父节点&#xff0c;其下面的请求作为子节点 3、执行&#…

ChatGPT结合Excel辅助学术数据分析详细步骤分享!

目录 一.Excel在学术论文中的作用✔ 二.Excel的提示词✔ 三. 编写 Excel 命令 四. 编写宏 五. 执行复杂的任务 六. 将 ChatGPT 变成有用的 Excel 助手 一.Excel在学术论文中的作用✔ Excel作为一种广泛使用的电子表格软件&#xff0c;在学术论文中可以发挥多种重要作用&a…