#数据结构 顺序表

线性表

顺序表

每种结构都有它存在意义

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

概念

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

逻辑结构:线性结构

物理结构:顺序存储结构

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

顺序表前言

操作:

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 

相关新闻

最新2023年行政区划、路网、土壤质地矢量数据

最新2023年行政区划、路网、土壤质地矢量数据

行政区划矢量数据是指用矢量格式表示的地理信息系统&#xff08;GIS&#xff09;数据&#xff0c;其中包含了行政区域的边界信息&#xff0c;如国家、省份、城市、区县、乡镇甚至村级的界限。这些数据通常以点、线、面的几何图形来表示具体的地理实体&#xff0c;并且每个实体都…

2026/7/12 7:15:15 阅读更多 →
ITIL4认证考试注意事项(附考试答题攻略)

ITIL4认证考试注意事项(附考试答题攻略)

作为一位持有ITIL4中级认证的IT服务管理专家&#xff0c;我深知备考ITIL4认证考试的重要性。在此分享我的复习备考经验&#xff0c;帮助你顺利通过考试。 1. 制定复习计划 制定详细的复习计划是备考的第一步。合理安排每天的复习时间&#xff0c;重点复习ITIL4的关键概念、四个…

2026/7/18 11:21:22 阅读更多 →
AnimateLCM:高效生成连贯真实的视频

AnimateLCM:高效生成连贯真实的视频

视频扩散模型因其能够生成连贯且高保真的视频而日益受到关注。然而&#xff0c;迭代去噪过程使得这类模型计算密集且耗时&#xff0c;限制了其应用范围。香港中文大学 MMLab、Avolution AI、上海人工智能实验室和商汤科技公司的研究团队提出了AnimateLCM&#xff0c;这是一种允…

2026/7/18 16:53:37 阅读更多 →
Kotlin与Flutter技术对比:移动开发选型指南

Kotlin与Flutter技术对比:移动开发选型指南

1. Kotlin与Flutter的技术定位解析 当我在2018年第一次接触Kotlin时&#xff0c;它刚被Google宣布为Android开发的官方语言。而Flutter在2017年发布后&#xff0c;我见证了它如何从一个实验性框架成长为如今的跨平台解决方案巨头。这两种技术看似平行发展&#xff0c;实则代表了…

2026/7/19 19:47:41 阅读更多 →
【Kimi编程辅助黄金配置清单】:VS Code + JetBrains双环境最优参数设置,错过再等半年

【Kimi编程辅助黄金配置清单】:VS Code + JetBrains双环境最优参数设置,错过再等半年

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Kimi编程辅助的核心能力与适用场景 Kimi 编程辅助依托超长上下文理解&#xff08;支持高达200万字输入&#xff09;与多模态代码感知能力&#xff0c;构建了面向开发者的一站式智能编码支持体系。其核心并非简…

2026/7/19 19:47:41 阅读更多 →
炼丹炉电商数据测评:从数据采集到决策闭环的完整解决方案

炼丹炉电商数据测评:从数据采集到决策闭环的完整解决方案

最近在帮几个电商团队做数据选型时&#xff0c;我发现了一个很有意思的现象&#xff1a;很多团队在选数据服务时&#xff0c;往往只关注"能不能爬数据"&#xff0c;却忽略了更关键的问题——这些数据到底能不能真正指导业务决策&#xff1f; 今天要测评的炼丹炉电商…

2026/7/19 19:47:41 阅读更多 →
别再手动筛选了!ChatGPT自动关联兴趣画像+消费习惯+社交语境的礼物推荐引擎上线

别再手动筛选了!ChatGPT自动关联兴趣画像+消费习惯+社交语境的礼物推荐引擎上线

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;别再手动筛选了&#xff01;ChatGPT自动关联兴趣画像消费习惯社交语境的礼物推荐引擎上线 传统礼物推荐依赖人工经验与碎片化信息拼凑&#xff0c;效率低、泛化差、易忽略隐性偏好。如今&#xff0c;我们构建了…

2026/7/19 19:47:41 阅读更多 →
通义千问+即梦双引擎创作闭环(2024最新私藏工作流曝光)

通义千问+即梦双引擎创作闭环(2024最新私藏工作流曝光)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;通义千问即梦双引擎创作闭环&#xff08;2024最新私藏工作流曝光&#xff09; 当大模型能力下沉至内容生产一线&#xff0c;真正高效的工作流不再依赖单点工具堆砌&#xff0c;而是构建「理解—生成—可…

2026/7/19 19:47:40 阅读更多 →
MCP协议:AI服务的通用即插即用接口标准

MCP协议:AI服务的通用即插即用接口标准

1. 项目概述&#xff1a;MCP不是新模型&#xff0c;而是AI系统间的“通用电源接口” 你有没有遇到过这样的场景&#xff1a;团队刚上线一个效果惊艳的RAG问答系统&#xff0c;结果销售部门想把它嵌入CRM弹窗&#xff0c;客服团队想接入飞书机器人&#xff0c;而BI组又希望把它的…

2026/7/19 19:45:29 阅读更多 →
鸿蒙 ArkTS 实战:Emoji Idiom Guess 从表情成语猜谜到交互闭环完整解析

鸿蒙 ArkTS 实战:Emoji Idiom Guess 从表情成语猜谜到交互闭环完整解析

鸿蒙 ArkTS 实战&#xff1a;Emoji Idiom Guess 从表情成语猜谜到交互闭环完整解析 前言 Emoji Idiom Guess 是一个基于鸿蒙 ArkTS 编写的单页互动应用&#xff0c;核心围绕 表情线索、答案输入、首字母提示和收藏关卡 展开。项目没有依赖复杂服务端&#xff0c;也没有把逻辑…

2026/7/19 0:00:03 阅读更多 →
Unity与Python本地通信:基于Flask的跨语言数据交换实战

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述&#xff1a;为什么我们需要一个本地通信服务器&#xff1f;在游戏开发、数字孪生、仿真训练等众多领域&#xff0c;Unity作为强大的实时3D内容创作平台&#xff0c;其核心逻辑通常由C#驱动。然而&#xff0c;当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/19 0:00:04 阅读更多 →
科研课题设计全流程:从选题到成果落地的实战指南

科研课题设计全流程:从选题到成果落地的实战指南

1. 课题设计全流程解析&#xff1a;从选题到成果落地的实战指南课题设计是科研工作者、高校师生以及企业研发人员日常工作中的核心环节。一个优秀的课题设计不仅决定了研究的方向和质量&#xff0c;更直接影响最终成果的学术价值和应用前景。作为在科研一线摸爬滚打多年的从业者…

2026/7/19 0:00:04 阅读更多 →
鸿蒙 ArkTS 实战:Emoji Idiom Guess 从表情成语猜谜到交互闭环完整解析

鸿蒙 ArkTS 实战:Emoji Idiom Guess 从表情成语猜谜到交互闭环完整解析

鸿蒙 ArkTS 实战&#xff1a;Emoji Idiom Guess 从表情成语猜谜到交互闭环完整解析 前言 Emoji Idiom Guess 是一个基于鸿蒙 ArkTS 编写的单页互动应用&#xff0c;核心围绕 表情线索、答案输入、首字母提示和收藏关卡 展开。项目没有依赖复杂服务端&#xff0c;也没有把逻辑…

2026/7/19 0:00:03 阅读更多 →
Unity与Python本地通信:基于Flask的跨语言数据交换实战

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述&#xff1a;为什么我们需要一个本地通信服务器&#xff1f;在游戏开发、数字孪生、仿真训练等众多领域&#xff0c;Unity作为强大的实时3D内容创作平台&#xff0c;其核心逻辑通常由C#驱动。然而&#xff0c;当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/19 0:00:04 阅读更多 →
科研课题设计全流程:从选题到成果落地的实战指南

科研课题设计全流程:从选题到成果落地的实战指南

1. 课题设计全流程解析&#xff1a;从选题到成果落地的实战指南课题设计是科研工作者、高校师生以及企业研发人员日常工作中的核心环节。一个优秀的课题设计不仅决定了研究的方向和质量&#xff0c;更直接影响最终成果的学术价值和应用前景。作为在科研一线摸爬滚打多年的从业者…

2026/7/19 0:00:04 阅读更多 →
ai agent框架spring ai/alibaba 源码原理分析(六) agent和组件

ai agent框架spring ai/alibaba 源码原理分析(六) agent和组件

简介 saa是java的ai agent框架&#xff0c;本系列将深入剖析 Spring AI Alibaba 的源码实现与核心原理&#xff0c;不仅可以指导agent的开发&#xff0c;更可以改造框架&#xff0c;增加新特性 系列内容&#xff1a; 系列(一) 架构 完成 系列(三) 调用 I 工具 完成 II M…

2026/7/19 0:01:20 阅读更多 →
终极指南:如何用Steam-auto-crack实现Steam游戏自动破解

终极指南:如何用Steam-auto-crack实现Steam游戏自动破解

终极指南&#xff1a;如何用Steam-auto-crack实现Steam游戏自动破解 【免费下载链接】Steam-auto-crack Steam Game Automatic Cracker 项目地址: https://gitcode.com/gh_mirrors/st/Steam-auto-crack Steam-auto-crack是一款功能强大的Steam游戏自动破解工具&#xff…

2026/7/19 9:10:31 阅读更多 →
移动端游戏功耗测试实战:电流、功率、亮度和场景对比

移动端游戏功耗测试实战:电流、功率、亮度和场景对比

移动端游戏功耗测试:先控制变量,再比较优化是否真的省电 摘要:功耗测试最容易犯的错误,是拿两次不同温度、不同亮度、不同场景的平均功率直接比较。本文给出一套可复现的游戏功耗测试方法,覆盖引擎特性验证、版本回归和黑盒体验测试,并说明如何把功耗与帧率、温控、CPU/G…

2026/7/19 19:29:48 阅读更多 →