数据结构(使用静态数组实现顺序表)

2023-10-31

一.定义

1.线性表

(1)线性表的定义(逻辑结构):具有相同数据类型的n(n>=0)的有限个数的数据元素的有序排列。

(2)线性表的运算(操作):创建销毁,增删改查。

(3)线性表的存储结构:顺序存储(产生了顺序表),链式存储(产生了链表)

2.顺序表

使用静态数组是实现顺序表的一种方式。

使用静态数组十分简单,但是由于静态分配时,数组的大小和空间已经固定,一旦空间占满,再想加入新的数据就会造成数据溢出,进而导致程序崩溃。

二.代码分块

1.定义结构体

typedef struct{
	int data[Maxsize];//用静态数组存储数据元素 
	int length;//表示顺序表的长度 
}SqList;//typedef别名函数将该结构体别名为SqList 

2.初始化和数据元素预添加

void InitList(SqList *L){//初始化顺序表 
	for(int i=0;i<Maxsize;i++){//循环遍历该顺序表 
		L->data[i]=0;//将每个数据元素置为0,初始化 
	}
	L->length=0;//将顺序表长度置为0 
} 

void AddList(SqList *L){//给该顺序表添加元素 
	int x = 1; 
	int helfsize = Maxsize/2;//初始赋值长度为表总长度的一半 
	for(int i=0;i<helfsize;i++){
		L->data[i] = x;//将x的值赋给顺序表该位置的数据元素 
		x++;//增加x的值 
		L->length++;//增加顺序表表长 
	}
	
}

3.数据元素插入

bool InsertList(SqList *L){
	int inputPosition = 0;//定义记录插入位置并初始化 
	int inputNum = 0;//定义记录插入数据元素的值并初始化 
	printf("请输入要插入的位置:");
	scanf("%d",&inputPosition);//获取插入位置 
	printf("请输入要插入的内容:");
	scanf("%d",&inputNum);//获取插入内容 
	if(inputPosition>L->length||inputPosition<1){
	//条件判断一:该插入位置不能大于现在顺序表的总长
	//(提问为什么不能插入到超过总长的地方?因为顺序表是线性存储的,其数据元素逻辑相邻,并且存储相邻) 
	//条件判断二:插入位置不能小于最初位置 
		return false;
	}
	if(L->length>=Maxsize){
		//条件判断三:该顺序表是否存满 
		return false;
	}
	for(int i = L->length;i>=inputPosition;i--){//执行插入操作 :循环将要插入位置之后的元素全部后移一位 
		L->data[i] = L->data[i-1];//将顺序表最后一个位置的数据元素值放入下一个位置
		//请注意位序和数组下标的关系
		//该处造成的时间复杂度为O(n) 
	}
	L->data[inputPosition-1]=inputNum;//将插入值赋给要插入的位置 
	L->length++;//顺序表长度+1 
	return true;
	 
} 

4.按位查找

bool GetElem(SqList L){//按位查找
	int ElemPosition = 0;//定义记录查找的位置并初始化 
	printf("请输入要查找的位置:");
	scanf("%d",&ElemPosition);//获取查找位置 
	//感觉将输入输出这部分也封装一下会很方便使用 
	if(ElemPosition>L.length||ElemPosition<1){
		//判断输入是否合法 
		return false;
	} 
	int Elemdata = L.data[ElemPosition-1];//顺序表的存储结构是顺序存储,其优点为随机存储,时间复杂度为O(1); 
	printf("%d位置的元素值为%d\n",ElemPosition,Elemdata);
	return true;
	
}

 5.按值查找

bool LocateElem(SqList L){//按值查找 
	int ElemData = 0;//定义记录查找的值并初始化 
	printf("请输入要查找的数据元素:");
	scanf("%d",&ElemData);//获取查找位置 
	for(int i=0;i<L.length;i++){//按值查找无法发挥顺序表随机存储的优势
		if(L.data[i]==ElemData){
			printf("要查找的值为%d,其位置为%d\n",ElemData,i+1);
			//按值查找的平均时间复杂度为O(n) 
			return true;
		}
	} 
	printf("没有找到该值!\n");
	return true;
}

 6.删除操作

bool DelList(SqList *L,int *deldata){//删除操作
	int DelPosition = 0;//定义记录要删除数据元素的位置并初始化 
	printf("请输入要删除数据元素的位置:");
	scanf("%d",&DelPosition);//获取查找位置 
	if(DelPosition>L->length||DelPosition<1){
		//判断输入是否合法 
		return false;
	} 
	*deldata = L->data[DelPosition-1];//先将要删除的值存储一下
	for(int i =DelPosition;i<L->length;i++){//从删除点开始,将后一个元素迁移,一直到将最后一个元素都向前移动一位为止 
		L->data[i-1] = L->data[i];//将后一个元素前移 
	} 
	L->length--;//顺序表长度-1
	return true; 
	
}

三.整体代码

//用静态数组的方式实现顺序表 
#include <stdio.h>
#include <stdlib.h>
#define Maxsize 10 //宏定义最大长度 
//*L是指向顺序表的指针,&L是该顺序表的地址 
 
typedef struct{
    int data[Maxsize];//用静态数组存储数据元素 
    int length;//表示顺序表的长度 
}SqList;//typedef别名函数将该结构体别名为SqList 
 
void InitList(SqList *L){//初始化顺序表 
    for(int i=0;i<Maxsize;i++){//循环遍历该顺序表 
        L->data[i]=0;//将每个数据元素置为0,初始化 
    }
    L->length=0;//将顺序表长度置为0 
} 
 
void AddList(SqList *L){//给该顺序表添加元素 
    int x = 1; 
    int helfsize = Maxsize/2;//初始赋值长度为表总长度的一半 
    for(int i=0;i<helfsize;i++){
        L->data[i] = x;//将x的值赋给顺序表该位置的数据元素 
        x++;//增加x的值 
        L->length++;//增加顺序表表长 
    }
    
}
 
bool InsertList(SqList *L){
    int inputPosition = 0;//定义记录插入位置并初始化 
    int inputNum = 0;//定义记录插入数据元素的值并初始化 
    printf("请输入要插入的位置:");
    scanf("%d",&inputPosition);//获取插入位置 
    printf("请输入要插入的内容:");
    scanf("%d",&inputNum);//获取插入内容 
    if(inputPosition>L->length||inputPosition<1){
    //条件判断一:该插入位置不能大于现在顺序表的总长
    //(提问为什么不能插入到超过总长的地方?因为顺序表是线性存储的,其数据元素逻辑相邻,并且存储相邻) 
    //条件判断二:插入位置不能小于最初位置 
        return false;
    }
    if(L->length>=Maxsize){
        //条件判断三:该顺序表是否存满 
        return false;
    }
    for(int i = L->length;i>=inputPosition;i--){//执行插入操作 :循环将要插入位置之后的元素全部后移一位 
        L->data[i] = L->data[i-1];//将顺序表最后一个位置的数据元素值放入下一个位置
        //请注意位序和数组下标的关系
        //该处造成的时间复杂度为O(n) 
    }
    L->data[inputPosition-1]=inputNum;//将插入值赋给要插入的位置 
    L->length++;//顺序表长度+1 
    return true;
     
    
} 
 
void ShowList(SqList L){//显示该顺序表元素 (直接遍历显示所有元素) 
    for(int i=0;i<L.length;i++){
        printf("%d\n",L.data[i]);
    }
 
}
 
bool GetElem(SqList L){//按位查找
    int ElemPosition = 0;//定义记录查找的位置并初始化 
    printf("请输入要查找的位置:");
    scanf("%d",&ElemPosition);//获取查找位置 
    //感觉将输入输出这部分也封装一下会很方便使用 
    if(ElemPosition>L.length||ElemPosition<1){
        //判断输入是否合法 
        return false;
    } 
    int Elemdata = L.data[ElemPosition-1];//顺序表的存储结构是顺序存储,其优点为随机存储,时间复杂度为O(1); 
    printf("%d位置的元素值为%d\n",ElemPosition,Elemdata);
    return true;
    
}
 
bool LocateElem(SqList L){//按值查找 
    int ElemData = 0;//定义记录查找的值并初始化 
    printf("请输入要查找的数据元素:");
    scanf("%d",&ElemData);//获取查找位置 
    for(int i=0;i<L.length;i++){//按值查找无法发挥顺序表随机存储的优势
        if(L.data[i]==ElemData){
            printf("要查找的值为%d,其位置为%d\n",ElemData,i+1);
            //按值查找的平均时间复杂度为O(n) 
            return true;
        }
    } 
    printf("没有找到该值!\n");
    return true;
}
 
bool DelList(SqList *L,int *deldata){//删除操作
    int DelPosition = 0;//定义记录要删除数据元素的位置并初始化 
    printf("请输入要删除数据元素的位置:");
    scanf("%d",&DelPosition);//获取查找位置 
    if(DelPosition>L->length||DelPosition<1){
        //判断输入是否合法 
        return false;
    } 
    *deldata = L->data[DelPosition-1];//先将要删除的值存储一下
    for(int i =DelPosition;i<L->length;i++){//从删除点开始,将后一个元素迁移,一直到将最后一个元素都向前移动一位为止 
        L->data[i-1] = L->data[i];//将后一个元素前移 
    } 
    L->length--;//顺序表长度-1
    return true; 
    
}
 
void displayMenu(){
    int option = 0;
    bool flag =true;
    SqList L;//调用结构体类型创建一个静态数组线性表 
    InitList(&L);//初始化线性表 
    AddList(&L);//为顺序表表添加一些初始元素(占顺序表的一半)
    while (flag)
    {
        printf("----基于静态数组实现顺序表----\n");
        printf("1.初始化顺序表\n");
        printf("2.查看顺序表元素\n");
        printf("3.插入元素\n");
        printf("4.按位查找\n");
        printf("5.按值查找\n");
        printf("6.删除元素\n");
        printf("7.结束\n");
        printf("请输入要进行操作的序号:\n");
        scanf("%d",&option);
        printf("------------------------------\n");
        if(option==1){    
            InitList(&L);//初始化线性表 
            AddList(&L);//为顺序表表添加一些初始元素(占顺序表的一半)
            ShowList(L);//将顺序表表中的元素全部展示
        }else if(option==2){
            ShowList(L);//将顺序表表中的元素全部展示
        }else if(option==3){
            InsertList(&L);//向顺序表中插入元素(按位插入) 
            ShowList(L);//将顺序表表中的元素全部展示
        }else if(option==4){
            GetElem(L);//按位查找(请思考这里为什么使用的不是&L而是L? 因为查找不需要修改数据元素)
        }else if(option==5){
            LocateElem(L);//按值查找 
        }else if(option==6){
            int deldata = 0;//要删除的数据元素的值 
            DelList(&L,&deldata);//删除操作(按位) 
            ShowList(L);//将顺序表表中的元素全部展示 
        }
    
        if(option==7){
            exit(0);
        }
    }
    
    
}
 
 
 
int main(){
    displayMenu();
    
//    SqList L;//调用结构体类型创建一个静态数组线性表 
//    InitList(&L);//初始化线性表 
//    AddList(&L);//为顺序表表添加一些初始元素(占顺序表的一半) 
//    ShowList(L);//将顺序表表中的元素全部展示
//    InsertList(&L);//向顺序表中插入元素(按位插入) 
//    ShowList(L);//将顺序表表中的元素全部展示 
//    GetElem(L);//按位查找(请思考这里为什么使用的不是&L而是L? 因为查找不需要修改数据元素)
//    LocateElem(L);//按值查找 
//    int deldata = 0;//要删除的数据元素的值 
//    DelList(&L,&deldata);//删除操作(按位) 
//    ShowList(L);//将顺序表表中的元素全部展示 
 
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构(使用静态数组实现顺序表) 的相关文章

  • pytorch BUG :.grad=NONE? pytorch参数的使用

    在实验中 输出发现网络的某个新增的参数不更新 在输出 tensor grad NONE 然后查找资料进行修改输出从 tensor 0 9925 device cuda 0 grad fn
  • 面试题目搜集(3)

    本博客的 面试题目搜集系列不错 1 面试题目搜集1 2 面试题目搜集2 3 面试题目搜集3 4 面试题目搜集4 5 面试题目搜集5 6 面试题目搜集6 1 有这样一个数组A 大小为n 相邻元素差的绝对值都是1 如 A 4 5 6 5 6 7
  • R-基础:数据框操作

    title dataframe author intro date 2022 1 20 output html document knitr opts chunk set echo TRUE R基础 在学习中分享 在分享中学习 R中数据框是

随机推荐

  • Java发送附件到邮箱

    1 配置 导入依赖以及在yml中写好邮箱的配置信息
  • Git 详细安装教程【图文讲解】

    目录 一 前言 二 Git 的安装 2 1 Git 的下载 2 2 Git 的安装 2 2 1 使用许可声明 2 2 2 选择安装目录 2 2 3 选择安装组件 2 2 4 选择开始菜单文件夹 2 2 5 选择 Git 默认编辑器 2 2
  • 性能测试常见指标分析

    压力测试 强调极端暴力 稳定性测试 在一定压力下 长时间运行的情况 基准测试 在特定条件下的性能测试 负载测试 不同负载下的表现 容量测试 最优容量 外部指标 从外部看 性能测试主要关注如下三个指标 吞吐量 每秒钟系统能够处理的请求数 任务
  • 技术管理到底管什么

    https mp weixin qq com s QN1OKEFT3DiA82 OAp858Q 前些天从湾区日报上看到美国一家叫 Gusto 的公司 CTO 的文章 他 6 年前开始创业 一开始他是唯一的工程师 几乎 100 时间都在写代码
  • MS Chart 控件学习(一)常见属性

    最常用的属性包括 ChartAreas 增加多个绘图区域 每个绘图区域包含独立的图表组 数据源 用于多个图表类型在一个绘图区不兼容时 AlignmentOrientation 图表区对齐方向 定义两个绘图区域间的对齐方式 Alignment
  • 个人计算机多核cpu好处,电脑cpu核数全开会怎样 对电脑有什么影响

    不少网友听说开启电脑cpu核数可以让电脑性能变高 不知道是不是真的 也有网友担心电脑cpu核数全开会怎样 会不会对电脑有影响 今天小编就跟大家聊下电脑cpu核数全开对电脑影响 首先 想要开启cpu核数 是可以在运行中输入msconfig打开
  • 全球排名前500的网站都是做什么的

    数据来自Alexa权威2016 3 3 Google com Enables users to search the world s information including webpages images and videos Offe
  • HttpClient的基本使用

    HttpClient4 510 API参考 点我进入 HTTP 协议可能是现在 Internet 上使用得最多 最重要的协议了 越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源 虽然在 JDK 的 java net包
  • 【DirectX11学习02】绘制单个基本几何体的线框

    注 下面涉及的代码都基于这篇文章的内容 https blog csdn net Kurozaki Kun article details 86709050 绘制过程 要在DX上绘制一个基本图形 大体流程有以下几步 给出输入布局 主要是描述顶
  • 对象池(连接池):commons-pool2源码解析:GenericObjectPool的returnObject方法解析

    为什么会有对象池 在实际的应用工程当中 存在一些被频繁使用的 创建或者销毁比较耗时 持有的资源也比较昂贵的一些对象 比如 数据库连接对象 线程对象 所以如果能够通过一种方式 把这类对象统一管理 让这类对象可以被循环利用的话 就可以减少很多系
  • windows安装docker desktop

    windows安装docker desktop 前言 一 docker desktop 是什么 二 安装步骤 1 下载 2 安装 总结 前言 这里针对windows 10 家庭中文版 其他版本部分步骤可跳过 一 docker desktop
  • ChatGPT写作提示词指令大全

    1 用ChatGPT写影评 指令 你是一个自媒体人 同时也是一个专业的影评人 最近熬夜看完了韩剧黑暗荣耀第一季和第二季 忍不住想在公众号分享给粉丝们 请写一篇1000字左右的自媒体文章 并且加上一个有吸引力的标题 指令模板 你是一个自媒体人
  • 使用腾讯云 GPU 学习深度学习系列

    https cloud tencent com developer article 1005199
  • 模拟电路设计(17)---典型RC正弦波振荡器

    RC正弦波振荡器 采用LC器件作为振荡电路的反馈网络可以达到很高的输出频率 器件比较容易实现小体积 但是要求振荡器输出几十或者几百Hz信号时 LC器件的取值会很大 很难实现实用的产品 此时采用RC选频网络就会有很大的优势 RC LC反馈振荡
  • C#:Xxxx.GetTypes()引发了类型“System.Reflection.ReflectionTypeLoadException”的异常

    参考 Xxxx GetTypes 引发了类型 System Reflection ReflectionTypeLoadException 的异常 Nemo的笔记本 CSDN博客
  • 用户界面与业务逻辑的分离

    前面分别实现了计算器程序的用户界面和业务逻辑 基本程序架构一般包含 用户界面模块 UI 接受用户输入及呈现数据 业务逻辑模块 Business Logic 根据用户需求处理数据 基本设计原则 功能模块之间需要进行解耦 核心思想 强内聚 弱耦
  • 以太坊开发框架——Truffle的基础使用

    这里写目录标题 Truffle Truffle 简介 Truffle 的客户端 安装Truffle 创建项目 Migration artifacts require exports 的函数 deployer 对象 更新 migration
  • TCP三次握手

    TCP三次握手的原因 双方都确认对方具有接收和发送数据的功能 1 初始状态 双方都处于Closed状态 2 服务器开启监听功能 处于Listen状态 3 第一次握手 客户端发起请求 发送一个SYN标识 连接请求数据包 seq x 并处于SY
  • vue 树形结构数据的便捷遍历,及树形结构与平级列表的相互转换(使用xe-utils函数)

    一 使用xe utils函数 xe utils 的api地址 xe utils 函数库 工具类 二 安装 npm安装 npm install xe utils 引用 import XEUtils from xe utils 1 mapTre
  • 数据结构(使用静态数组实现顺序表)

    一 定义 1 线性表 1 线性表的定义 逻辑结构 具有相同数据类型的n n gt 0 的有限个数的数据元素的有序排列 2 线性表的运算 操作 创建销毁 增删改查 3 线性表的存储结构 顺序存储 产生了顺序表 链式存储 产生了链表 2 顺序表