目录

线性表

顺序表

概念与结构

动态顺序表的实现

头文件的创建

顺序表初始化

顺序表的扩容

尾插功能

头插功能

尾删功能

头删功能

查找功能

任意位置前插入

任意位置前删除

销毁

动态顺序表整体呈现

SeqList.h

SeqList.c


线性表

线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...

线性表的逻辑结构一定是线性的,但物理结构不一定是线性的。

顺序表

概念与结构

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

结构:顺序表的底层结构是数组,对数组的封装,实现了常用的增删改查等接口

分类:分为静态顺序表和动态顺序表(常用)。

动态顺序表的实现

头文件的创建

我们要在头文件中完成顺序表的创建和头文件与函数的声明。

typedef int SLDataType;
typedef struct SeqList
{SLDataType* arr;int size;int capacity;
}SL;

这是头文件的包含和顺序表的创建。

这是对函数的声明,以上函数我们都会讲到。

顺序表初始化

首先我们要在源文件中包含刚刚我们创建的头文件。

然后对顺序表进行初始化。

void SLInit(SL* ps)//初始化
{ps->arr = NULL;ps->size = ps->capacity = 0;
}

顺序表的扩容

现在我们的顺序表里面什么都没有,我们要扩大我们的空间。或者当我们的顺序表空间满了的时候,我们也要扩大我们的空间。

所以我们要先写好函数对顺序表进行扩容。

扩容函数中我们需要使用realloc函数额外申请空间。

注意:进行扩容操作时请用临时变量,防止发生问题造成不可逆的伤害。

void SLCheckCapacity(SL* ps)//扩容
{if (ps->size == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType));if (tmp == NULL){perror("realloc fail!");exit(1);}ps->arr = tmp;ps->capacity = newcapacity;}
}

尾插功能

实现尾插功能很简单,size刚好是数组最后一个元素的后一个下标,确定指针的安全后直接令arr[size]等于x就完成了。

void SLPushBack(SL* ps,SLDataType x)//尾插
{assert(ps);SLCheckCapacity(ps);ps->arr[ps->size++] = x;
}

头插功能

头插功能比尾插复杂一点点,需要让数组中的元素整体后移一个位置,让arr[0]空缺起来实现x的插入。

void SLPushFront(SL* ps, SLDataType x)//头插
{assert(ps);SLCheckCapacity(ps);for (int i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[0] = x;++ps->size;
}

尾删功能

尾删很简单,直接让size减一就好了。

void SLPopBack(SL* ps)//尾删
{assert(ps && ps->size);--ps->size;
}

头删功能

头删也很简单,就让后面的元素把前面的元素一一覆盖就好了。

void SLPopFront(SL* ps)//头删
{assert(ps && ps->size);for (int i = 0; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}--ps->size;
}

查找功能

遍历数组查找元素,找到返回下标,没找到返回-1。

int SLFind(SL* ps, SLDataType x)//查找
{for (int i = 0; i < ps->size; i++){if (ps->arr[i] == x)return i;}return -1;
}

任意位置前插入

这是建立在头插的基础上的,让pos后的元素一一往后移一个位置把pos空出来实现插入。

void SLInsert(SL* ps, int pos, SLDataType 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;
}

任意位置前删除

和头删很相似,让pos后的元素一一往前移一个位置覆盖pos。

void SLErase(SL* ps, int pos)//任意位置前删除
{assert(ps && ps->size);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 SLDesTroy(SL* ps)//销毁
{if (ps->arr)free(ps->arr);ps->arr = NULL;ps->size = ps->capacity = 0;
}

动态顺序表整体呈现

SeqList.h

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>typedef int SLDataType;
typedef struct SeqList
{SLDataType* arr;int size;int capacity;
}SL;void SLInit(SL* ps);
void SLDesTroy(SL* ps);
void SListPrint(SL s);
void SLCheckCapacity(SL* ps);
void SLPushBack(SL* ps,SLDataType x);
void SLPushFront(SL* ps, SLDataType x);
void SLPopBack(SL* ps);
void SLPopFront(SL* ps);
void SLInsert(SL* ps, int pos, SLDataType x);
void SLErase(SL* ps, int pos);
int SLFind(SL* ps, SLDataType);

SeqList.c

#define _CRT_SECURE_NO_WARNINGS
#include "SeqList.h"void SLInit(SL* ps)//初始化
{ps->arr = NULL;ps->size = ps->capacity = 0;
}void SListPrint(SL s)//打印
{for (int i = 0; i < s.size; i++){printf("%d ", s.arr[i]);}printf("\n");
}void SLCheckCapacity(SL* ps)//扩容
{if (ps->size == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType));if (tmp == NULL){perror("realloc fail!");exit(1);}ps->arr = tmp;ps->capacity = newcapacity;}
}void SLPushBack(SL* ps,SLDataType x)//尾插
{assert(ps);SLCheckCapacity(ps);ps->arr[ps->size++] = x;
}void SLPushFront(SL* ps, SLDataType x)//头插
{assert(ps);SLCheckCapacity(ps);for (int i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[0] = x;++ps->size;
}void SLPopBack(SL* ps)//尾删
{assert(ps && ps->size);--ps->size;
}void SLPopFront(SL* ps)//头删
{assert(ps && ps->size);for (int i = 0; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}--ps->size;
}int SLFind(SL* ps, SLDataType x)//查找
{for (int i = 0; i < ps->size; i++){if (ps->arr[i] == x)return i;}return -1;
}void SLInsert(SL* ps, int pos, SLDataType 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 SLErase(SL* ps, int pos)//任意位置前删除
{assert(ps && ps->size);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 SLDesTroy(SL* ps)//销毁
{if (ps->arr)free(ps->arr);ps->arr = NULL;ps->size = ps->capacity = 0;
}

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

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

相关文章

自助餐厅:自主取餐的平衡术

自助餐厅&#xff0c;本质是通过 “固定客单价 自主取餐” 的模式&#xff0c;把 “吃什么、吃多少” 的选择权还给用户&#xff0c;同时用运营设计平衡 “用户体验” 与 “餐厅成本”—— 它不是 “让用户吃垮餐厅” 的游戏&#xff0c;而是餐饮行业里 “效率与体验结合” 的…

TypeScript: Reflect.ownKeys 操作(针对 Symbol)

Reflect.ownKeys 是 JavaScript ES6 引入的 Reflect API 中的一个方法&#xff0c;用于获取目标对象的所有自身属性键&#xff08;包括字符串键和 Symbol 键&#xff09;。1.基本概念&#xff1a;Reflect.ownKeys(target)&#xff1a;接受一个对象 target 作为参数&#xff0c;…

一般纳税人

目录 一文详解&#xff1a;什么是一般纳税人&#xff1f; 一、核心定义&#xff1a;什么是一般纳税人&#xff1f; 二、成为一般纳税人的两种途径 三、一般纳税人的关键特点与运作机制 四、一般纳税人的优点与缺点 五、与小规模纳税人的核心区别 六、企业应如何选择&…

@HAProxy 介绍部署使用

文章目录**1. HAProxy 简介****1.1 什么是 HAProxy&#xff1f;****1.2 核心特性****1.3 关键术语****2. 安装 HAProxy****2.1 在 Ubuntu/Debian 上安装****2.2 在 CentOS/RHEL/Rocky Linux/AlmaLinux 上安装****3. 配置与使用****3.1 核心配置文件结构****3.2 基础配置示例&am…

Two-Twer模型做歌曲智能推荐与规则算法对比的优缺点分析

基于规则与机器学习驱动的音乐推荐&#xff1a;核心差异分析1.推荐精度2. 个性化能力3. 模型适应性&#xff08;潜在特征关联发现&#xff09;4. 可扩展性与复杂性成本5. 冷启动/数据稀疏阶段表现6. 听感匹配与主观反馈1.推荐精度 规则推荐&#xff1a; 依赖预设的 if-then 逻…

【完整源码+数据集+部署教程】停车位状态检测系统源码和数据集:改进yolo11-DCNV2-Dynamic

背景意义 随着城市化进程的加快&#xff0c;城市交通拥堵问题日益严重&#xff0c;停车难成为了许多城市居民面临的普遍问题。有效的停车管理不仅可以提高城市交通的流动性&#xff0c;还能减少因寻找停车位而造成的时间浪费和环境污染。因此&#xff0c;开发一个高效的停车位状…

《Password Guessing Using Random Forest》论文解读

论文填补了传统统计方法&#xff08;如 PCFG、Markov&#xff09;与深度学习方法&#xff08;如 LSTM、GAN&#xff09;之间的研究空白&#xff0c;提出基于随机森林的口令猜测框架 RFGuess&#xff0c;覆盖三种核心猜测场景&#xff0c;为口令安全研究提供了全新技术路线。一、…

项目一系列-第9章 集成AI千帆大模型

第9章 集成AI千帆大模型 学习目标 能够说清楚健康评估模块在项目中的作用能够掌握千帆大模型的开通和对接能够掌握健康评估模块中的prompt提示词编写能够自主完成健康评估模块的接口开发 分析设计 需求说明 健康评估是指老人办理入住前需上传体检报告&#xff0c;由AI自动…

vben admin5组件文档(豆包版)---VbenTree

VbenTree 用法说明 VbenTree 是 Vben5 中基于 radix-vue 实现的树形组件&#xff0c;支持单选、多选、展开/折叠、权限控制等功能。以下是其核心用法说明&#xff1a; 1. 基础引入 import { VbenTree } from vben-core/shadcn-ui;2. 核心属性&#xff08;Props&#xff09;属性…

postman常用快捷键

作为一名IT程序猿&#xff0c;不懂一些工具的快捷方式&#xff0c;应该会被鄙视的吧。收集了一些Postman的快捷方式&#xff0c;大家一起动手操作~ 1小时postman接口测试从入门到精通教程简单操作 操作mac系统windows系统 打开新标签 ⌘TCtrl T关闭标签⌘WCtrl W强制关闭标签…

【物联网】什么是 DHT11(数字温湿度传感器)?

正面照片&#xff08;蓝色传感器朝上&#xff0c;针脚朝下&#xff09; 丝印标注非常清晰&#xff1a; 左边 → S &#x1f449; 信号 (DATA) 中间 → &#x1f449; VCC (电源&#xff0c;3.3V 或 5V) 右边 → - &#x1f449; GND (地) ✅ 正确接法&#xff08;Arduino Nano…

光谱相机在雾霾监测中有何优势?

光谱相机在雾霾监测中的优势主要体现在多维度数据采集和环境适应性方面&#xff0c;结合最新技术进展分析如下&#xff1a;一、核心优势‌穿透性监测能力‌ 短波红外&#xff08;SWIR&#xff09;波段可穿透雾霾颗粒&#xff0c;结合可见光成像实现雾霾浓度与能见度的同步监测&…

【c++】超好玩游戏

#include <iostream> #include <vector> #include <conio.h> #include <windows.h> #include <time.h>using namespace std;// 游戏常量 const int WIDTH 40; const int HEIGHT 20; const int PADDLE_WIDTH 5;// 方向枚举 enum Direction { S…

GitHub 热榜项目 - 日榜(2025-08-27)

GitHub 热榜项目 - 日榜(2025-08-27) 生成于&#xff1a;2025-08-27 统计摘要 共发现热门项目&#xff1a;15 个 榜单类型&#xff1a;日榜 本期热点趋势总结 本期GitHub热榜呈现出三大技术趋势&#xff1a;1. AI生产力工具持续升温&#xff1a;系统提示词泄露库、DeepCode…

基于Springboot + vue3实现的学校学报出版发行管理系统

项目描述本系统包含管理员和用户两个角色。管理员角色&#xff1a;用户管理&#xff1a;管理系统中所有用户的信息&#xff0c;包括添加、删除和修改用户。稿件分类管理&#xff1a;管理稿件分类信息&#xff0c;包括新增、查看、修改和删除稿件分类。新闻资讯管理&#xff1a;…

【Keil5教程及技巧】耗时一周精心整理万字全网最全Keil5(MDK-ARM)功能详细介绍【建议收藏-细细品尝】

&#x1f48c; 所属专栏&#xff1a;【单片机开发软件技巧】 &#x1f600; 作  者&#xff1a; 于晓超 &#x1f680; 个人简介&#xff1a;嵌入式工程师&#xff0c;专注嵌入式领域基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大家&#xff1…

国家育儿补贴政策遭利用,黑产组织借机窃取敏感数据

组织概况与作案手法近期网络安全领域出现了一个高度组织化的犯罪集团UTG-Q-1000&#xff0c;该组织通过利用中国国家育儿补贴政策实施大规模金融诈骗和数据窃取活动。这个结构严密的犯罪网络下设多个专业部门&#xff0c;包括财务组、新闻与色情组、设计与制造组以及黑市交易组…

Python Imaging Library (PIL) 全面指南:PIL高级图像处理-分割与颜色空间转换

高级图像处理&#xff1a;PIL中的图像分割与颜色空间转换 学习目标 本课程将深入探讨PIL&#xff08;Python Imaging Library&#xff09;中的一些高级功能&#xff0c;包括图像分割和颜色空间转换。通过本课程的学习&#xff0c;学员将能够掌握如何使用PIL进行更复杂的图像处理…

图解 OAuth,为什么这样设计?

OAuth 于 2007 年首次推出。它最初由 Twitter 创建&#xff0c;因为 Twitter 希望能够允许第三方应用代表用户发布推文。想象一下&#xff0c;如果今天设计类似的应用&#xff0c;你会怎么做&#xff1f;一种方法是直接要求用户输入用户名和密码。因此&#xff0c;你创建一个非…

WeakAuras Lua Script ICC (BarneyICC) Simplified Chinese [Mini]

WeakAuras Lua Script ICC &#xff08;BarneyICC&#xff09; Simplified Chinese [Mini] ICC 迷你版本会打了只需要团队框体高亮提示即可&#xff0c;因为有DBM&#xff0c;就不需要那么多了 !WA:2!S3xc4XrXzI6wkSjzcVSyb4aoKWGaC04ijMdPrsoit0OdRXwxmsYgmWoNTup4rZ0UNr2sKL…