#数据结构 顺序表

线性表

顺序表

每种结构都有它存在意义

线性表的顺序存储实现指的是用一组连续的存储单元存储线性表的数据元素。

概念

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性表,一般情况下采用数组存储。在数组上完成数据的增查改删。

逻辑结构:线性结构

物理结构:顺序存储结构

线性表的特点:一对一,每个节点最多一个前驱和一个后继,首尾节点特殊:首节点无前驱,尾节点无后继

顺序表前言

操作:

1.创建一个空的顺序表

2.向顺序表的指定位置插入数据

3.删除顺序表指定位置的数据

命名法则:

大驼峰:InsertInto

小驼峰: insertinto

加下划线: insert_into

见名知意;

练习1:

int buf[32] = {1,996,520,4,5,6,7,8}; // 8 个最后一个下标 7 n-1

1 996 520 100 4 5 6 7 8

(1)向数组的第几个位置插入数据

	int  *p 		  //保存的数组的首地址int  n		 //n代表的是数组中有效的元素个数(非数组的长度size 100)int  post;		 //位置代表的是第几个位置(数组元素下标),数组元素下标 位置的编号从0开始 positionint  data;		//插入到数组中的数据int  InsertInto(int *p,int n,int post,int data);

(2)遍历数组中的有效元素

	int  *p		        //保存的数组的首地址int  n			//n代表的是数组中有效的元素个数(非数组的长度size 100)void  Show(int *p,int n)
	int main(){int  buf[32] = {1,996,520,4,5,6,7,8}; // 8 个最后一个下标 7  n-1InsertInto(buf,8,3, 100); // 1 996 520 100 4 5 6 7 8Show(buf,9);//1 996 520 100 4 5 6 7 8return 0;}

#include <stdio.h>
int InsertInto(int *p,int n,int post,int data);
void Show(int *p,int n);
int main(int argc, const char *argv[])
{int buf[32] = {1,996,520,4,5,6,7,8};InsertInto(buf,8,3,100);Show(buf,9);return 0;
}
int  InsertInto(int *p,int n,int post,int data)
{int i;if(post < 0 || post > n){printf("InsertInto error\n");return  -1;}for(i = n -1; i >= post; i--){p[i+1] = p[i];}p[post] = data;return 0;
}
void Show(int *p,int n)
{int i;for(i = 0; i < n; i++){printf("%d ",p[i]);}putchar(10);
}
1 996 520 100 4 5 6 7 8 

练习2:

修改成last版本后

前提条件:

全局变量:last :始终表示最后一个有效元素的下标

#include <stdio.h>
int  InsertInto(int *p,int post,int data);
void DeletPost(int *p,int post);
void Show(int *p);
//始终表示数组中最后一个有效元素的下标(全局变量)
int last = 7;
int main(int argc, const char *argv[])
{int buf[32] = {1,996,520,4,5,6,7,8};InsertInto(buf,3,100);Show(buf);DeletPost(buf,3);Show(buf);return 0;
}
int  InsertInto(int *p,int post,int data)
{int i;if(post < 0 || post > last+1){printf("InsertInto error\n");return  -1;}for(i = last; i >= post; i--){p[i+1] = p[i];}p[post] = data;last++;return 0;
}void DeletPost(int *p,int post)
{if(post < 0 || post > last){printf("DeletPost error\n");}int i;
#if 0for(i = post; i < last; i++){p[i] = p[i+1];//p[last] = p[last+1]}
#endif
#if 1for(i = post +1; i <= last; i++){p[i-1] = p[i];//p[last -1] = p[last]}
#endiflast--;
}
void Show(int *p)
{int i;for(i = 0; i <= last; i++){printf("%d ",p[i]);}putchar(10);
}

1 996 520 100 4 5 6 7 8 
1 996 520 4 5 6 7 8 

顺序表:SequeueList

顺序表操作函数

#ifndef _SEQLIST_H_
#define _SEQLIST_H_
#include <stdio.h>
#include <stdlib.h>
// 1. 定义操作顺序表的结构体
#define N 5      // 定长数组的大小
typedef int DataType;	// 顺序表数据类型
typedef  struct  seq
{DataType data[N];  int last;//last始终代表数组中最后一个有效元素的下标 
}SL;
//1.创建一个空的顺序表
SL *CreateEpSeqlist();//返回的是申请空间的首地址
//2.向顺序表的指定位置插入数据
int InsertIntoSeqlist(SL *p, int post,DataType data);//post第几个位置,data插入的数据
//3.遍历顺序表sequence 顺序 list 表
void ShowSeqlist(SL *p);
//4.判断顺序表是否为满,满返回1 未满返回0
int IsFullSeqlist(SL *p);
//5.判断顺序表是否为空
int IsEpSeqlist(SL *p);
//6.删除顺序表中指定位置的数据post删除位置
int DeletePostSeqlist(SL *p, int post);
//7.清空顺序表
void ClearSeqList(SL *p)
//8.修改指定位置的数据
int ChangePostSeqList(SL *p,int post,DataType data);//post被修改的位置,data修改成的数据
//9.查找指定数据出现的位置
int SearchDataSeqList(SL *p,DataType data);//data代表被查找的数据
#endif

为了后续方便需改表中数据的数据类型,我们可以typedef一个新的数据类型叫做DataType顺序表数据类型。

为了让在定义结构体变量或结构体指针时使用更方便,我们同样可以将struct SeqList重定义为SL

此时SL == struct SeqList

  1. 创建seqlist.h函数声明头文件
  2. 创建seqlist.c函数实现源文件
  3. 创建main.c用来测试顺序表接口

定义操作顺序表的结构体

// 1. 定义操作顺序表的结构体
#define N 5     // 定长数组的大小
typedef int DataType;	// 顺序表数据类型
typedef  struct  seq
{DataType data[N];  int last;//last始终代表数组中最后一个有效元素的下标 
}SL;

all:gcc main.c seqlist.c -o seqlist

创建空顺序表

SL *CreateEpList()
{SL *p = (SL*)malloc(sizeof(SL));if(NULL == p)//NULL == p; NULL = p;p = NULL;{printf("malloc error\n");return NULL;}//int last = -1;p->last = -1;return p;
}
#ifndef _SEQLIST_H_
#define _SEQLIST_H_
#include <stdlib.h>
#include <stdio.h>
#define N 5
typedef int datatype;
typedef struct seq
{datatype data[N];int last;//last始终代表数组中最后一个有效元素的下标 
}SL;
//创建一个表(表首地址返回)
SL *CreateEpList();
//2.向顺序表的指定位置插入数据
#endif
#include "seqlist.h"
int main(int argc, const char *argv[])
{SL *p = CreateEpList();return 0;
}

插入

  1. post不能小于0
  2. post不能大于last + 1
  3. 表不能溢出last+1不能大于N
//2.向顺序表的指定位置插入数据
int InsertIntoSeqlist(SL *p, int post,datatype data)//post第几个位置,data插入的数据
{if(IsFullSeqlist(p) || post < 0 || post > p->last+1){printf("InsertIntoSeqlist error\n");return -1;}int i;for(i = p->last; i >= post; i--){p->data[i+1] = p->data[i];}p->data[post] = data;p->last++;return 0;
}
//3.遍历顺序表sequence 顺序 list 表
void ShowSeqlist(SL *p)
{     int i;for(i = 0; i <= p->last; i++){printf("%d ",p->data[i]);}putchar(10);	
}
//4.判断顺序表是否为满,满返回1 未满返回0
int IsFullSeqlist(SL *p)
{return p->last == N -1;//真(1) 假(0)
}
99 88 77 
99 66 88 77 

打印

//3.遍历顺序表sequence 顺序 list 表
void ShowSeqlist(SL *p)
{     int i;for(i = 0; i <= p->last; i++){printf("%d ",p->data[i]);}putchar(10);
}

查找

查找指定数据出现的位置下标

思路:自变量为顺序表下标[0, last]for循环进行遍历访问,如果相等返回下标。

缺陷:无法返回重复出现数据的位置下标

解决办法:不做要求。

//9.查找指定数据出现的位置
int SearchDataSeqList(SL *p,datatype data)//data代表被查找的数据
{if(IsEpSeqlist(p)){printf("SearchDataSeqList error\n");return -1;}int i;for(i = 0; i <= p->last; i++){if(p->data[i] == data)return i;} 	return -1;
}

修改

修改顺序表指定位置的数据。

参数:

  1. 结构体指针P
  2. 修改的位置post
  3. 期望的数据data

步骤:

  1. 容错判断 [0, last]
  2. 直接修改 P->data[post] = data
//8.修改指定位置的数据
int ChangePostSeqList(SL *p,int post,datatype data)//post被修改的位置,data修改成的数据
{if(IsEpSeqlist(p) || post < 0 || post > p->last){printf("ChangePostSeqList error\n");return -1;}p->data[post] = data;return 1;
}

删除

删除顺序表中指定位置的数据

参数:

  1. 结构体指针P
  2. 删除的位置post

步骤:

  1. 容错判断 同修改接口[0, last]
  2. post+1~last向前移动

5.判断顺序表是否为空
int IsEpSeqlist(SL *p)
{return p->last == -1;
}
//6.删除顺序表中指定位置的数据post删除位置
int DeletePostSeqlist(SL *p, int post)
{if(IsEpSeqlist(p) || post < 0 || post > p->last){printf("DeletePostSeqlist error\n");return -1;}int i;
#if 0for(i = post; i < p->last; i++){p->data[i] = p->data[i+1];}
#endif
#if 1for(i = post+1; i <= p->last; i++){p->data[i-1] = p->data[i];}
#endifp->last--;return 0;
}
#include "seqlist.h"
int main(int argc, const char *argv[])
{SL *p = CreateEpList();InsertIntoSeqlist(p,0,99);InsertIntoSeqlist(p,1,88);InsertIntoSeqlist(p,2,77);ShowSeqlist(p);InsertIntoSeqlist(p,1,66);ShowSeqlist(p);DeletePostSeqlist(p,1);ShowSeqlist(p);return 0;
}
99 88 77 
99 66 88 77 
99 88 77 

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

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

相关文章

IDEA配Git

目录 前言 1.创建Git仓库&#xff0c;获得可提交渠道 2.选择本地提交的项目名 3.配置远程仓库的地址 4.新增远程仓库地址 5.开始进行commit操作 6.push由于邮箱问题被拒绝的解决方法&#xff1a; 后记 前言 以下操作都是基于你已经下载了Git的前提下进行的&#xff0c…

CSRF靶场通关合集

目录 前言 CSRF漏洞总结 1.PiKachu靶场 1.1CSRF(get) 1.2 CSRF(post)请求 1.3 CSRF Token 2.DVWA靶场 难度低 难度中 难度高 前言 最近系统的将从web渗透到内网渗透的知识点做一个回顾,同时结合一些实战的案例来演示,下面是对刚开始学习时对靶场的一个总结. CSRF漏洞…

OPENCV(图像入门笔记)

使用OpenCV读取图像 使用cv.imread()函数读取图像。 第一个参数为图像名称 第二个参数是一个标志&#xff0c;它指定了读取图像的方式。分别有三种 cv.IMREAD_COLOR&#xff1a; 加载彩色图像。任何图像的透明度都会被忽视。它是默认标志。 cv.IMREAD_GRAYSCALE&#xff1a;以…

【Nvidia+AI相机】涂布视觉检测方案专注提高锂电池质量把控标准

锂电池单元的质量在多个生产制造领域都至关重要&#xff0c;特别是在新能源汽车、高端消费电子等行业。这些领域的产品高度依赖锂电池提供持续、稳定的能量供应。优质的锂电池单元不仅能提升产品的性能和用户体验&#xff0c;还能确保使用安全。因此&#xff0c;保证锂电池单元…

go语言Gin框架的学习路线(六)

gin的路由器 Gin 是一个用 Go (Golang) 编写的 Web 框架&#xff0c;以其高性能和快速路由能力而闻名。在 Gin 中&#xff0c;路由器是框架的核心组件之一&#xff0c;负责处理 HTTP 请求并将其映射到相应的处理函数上。 以下是 Gin 路由器的一些关键特性和工作原理的简要解释…

昇思25天学习打卡营第19天|LSTM+CRF序列标注

概述 序列标注指给定输入序列&#xff0c;给序列中每个Token进行标注标签的过程。序列标注问题通常用于从文本中进行信息抽取&#xff0c;包括分词(Word Segmentation)、词性标注(Position Tagging)、命名实体识别(Named Entity Recognition, NER)等。 条件随机场&#xff08…

水箱高低水位浮球液位开关

水箱高低水位浮球液位开关概述 水箱高低水位浮球液位开关是一种用于监测和控制水箱中液位的自动化设备&#xff0c;它能够在水箱液位达到预设的高低限制时&#xff0c;输出开关信号&#xff0c;以控制水泵或电磁阀的开闭&#xff0c;从而维持水箱液位在一个安全的范围内。这类设…

【排序算法】插入排序(希尔排序)

一.直接插入排序 1.基本思想 直接插入排序是一种简单的插入排序法&#xff0c;其核心思想是对一个已经有序的序列插入一个数据&#xff0c;该数据依次比较有序序列中的值&#xff0c;直到插入到合适的位置。在我们玩扑克牌整理牌序的时候&#xff0c;用到的就是直接插入排序的…

Vue3.js“非原始值”响应式实现基本原理笔记(二)

如果您觉得这篇文章有帮助的话&#xff01;给个点赞和评论支持下吧&#xff0c;感谢~ 作者&#xff1a;前端小王hs 阿里云社区博客专家/清华大学出版社签约作者/csdn百万访问前端博主/B站千粉前端up主 此篇文章是博主于2022年学习《Vue.js设计与实现》时的笔记整理而来 书籍&a…

28行代码完成深度学习模型——线性模型 01

在这里插入代码片## 线性模型 机器学习中的线性模型是一种预测模型&#xff0c;它基于线性关系来预测输出值。这种模型假设输入特征&#xff08;自变量&#xff09;和输出&#xff08;因变量&#xff09;之间存在线性关系。线性模型通常具有以下形式&#xff1a; y x*w b 其…

【TB作品】数码管独立按键密码锁,ATMEGA16单片机,Proteus仿真 atmega16数码管独立按键密码锁

文章目录 基于ATmega16的数码管独立按键密码锁设计实验报告实验背景硬件介绍主要元器件电路连接 设计原理硬件设计软件设计 程序原理延时函数独立按键检测密码显示主函数 资源代码 基于ATmega16的数码管独立按键密码锁设计实验报告 实验背景 本实验旨在设计并实现一个基于ATm…

数据库系统原理练习 | 作业1-第1章绪论(附答案)

整理自博主本科《数据库系统原理》专业课完成的课后作业&#xff0c;以便各位学习数据库系统概论的小伙伴们参考、学习。 *文中若存在书写不合理的地方&#xff0c;欢迎各位斧正。 专业课本&#xff1a; 目录 一、选择题 二&#xff1a;简答题 三&#xff1a;综合题 一、选择…

DAY21-力扣刷题

1.买卖股票的最佳时机 121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int maxProfit(int[] prices) {int minpriceInteger.MAX_VALUE;int maxprofit0;for(int i0;i<prices.length;i){if(prices[i]<minprice){minpriceprices[…

昇思MindSpore学习笔记5-01生成式--LSTM+CRF序列标注

摘要&#xff1a; 记录昇思MindSpore AI框架使用LSTMCRF模型分词标注的步骤和方法。包括环境准备、score计算、Normalizer计算、Viterbi算法、CRF组合,以及改进的双向LSTMCRF模型。 一、概念 1.序列标注 标注标签输入序列中的每个Token 用于抽取文本信息 分词(Word Segment…

InetAddress.getLocalHost().getHostAddress()阻塞导致整个微服务崩溃

InetAddress.getLocalHost().getHostAddress()阻塞导致整个微服务崩溃 import java.net.InetAddress;public class GetHostIp {public static void main(String[] args) {try {long start System.currentTimeMillis();String ipAddress InetAddress.getLocalHost().getHostA…

【计算机网络】物理层(作业)

1、若信道在无噪声情况下的极限数据传输速率不小于信噪比为30dB 条件下的极限数据传输速率&#xff0c;则信号状态数至少是&#xff08;D&#xff09;。 A. 4B. 16C. 8D. 32 解析&#xff1a;可用奈奎斯特采样定理计算无噪声情况下的极限数据传输速率&#xff0c;用香农第二定…

Docker 容器网络及其配置说明

Docker 容器网络及其配置说明 docker容器网络docker的4种网络模式bridge 模式container模式host 模式none 模式应用场景 docker 容器网络配置Linux 内核实现名称空间的创建创建 Network Namespace操作 Network Namespace 转移设备veth pair创建 veth pair实现 Network Namespac…

三、docker配置阿里云镜像仓库并配置docker代理

一、配置阿里云镜像仓库 1. 登录阿里云官网&#xff0c;并登录 https://www.aliyun.com/ 2. 点击产品 - 容器 - 容器与镜像服务ACR - 管理控制台 - 镜像工具 - 镜像加速器 二、配置docker代理 #1. 创建docker相关的systemd文件 mkdir -p /etc/systemd/system/docker.servic…

SQLite 嵌入式数据库

目录&#xff1a; 一、SQLite 简介二、SQLite 数据库安装1、安装方式一&#xff1a;2、安装方式二&#xff1a; 三、SQLite 的命令用法1、创建、打开、退出数据库&#xff1a;2、编辑数据库&#xff1a; 四、SQLite 的编程操作1、打开 / 创建数据库的 C 接口&#xff1a;2、操作…

Qt/C++音视频开发78-获取本地摄像头支持的分辨率/帧率/格式等信息/mjpeg/yuyv/h264

一、前言 上一篇文章讲到用ffmpeg命令方式执行打印到日志输出&#xff0c;可以拿到本地摄像头设备信息&#xff0c;顺藤摸瓜&#xff0c;发现可以通过执行 ffmpeg -f dshow -list_options true -i video“Webcam” 命令获取指定摄像头设备的分辨率帧率格式等信息&#xff0c;会…