数据结构 | 顺序线性表

news2025/1/13 7:36:23

一、数据结构定义

typedef int SqlTableType;

typedef struct seqTable{
    int MAXNUM;     // 最大元素个数   
    int curNum;     // 元素的个数
    SqlTableType* element;  // 连续空间的起始地址  
}*SqlTable;

二、方法概览

SqlTable CreateSqlTable(int max);   // 创建空顺序表
int IsSqlListFull(SqlTable L);      // 判断顺序线性表是否已满
int InsertSqlTable_P(SqlTable L, int p, SqlTableType x);     // 在下标p插入元素x
int InsertSqlTable_Pre(SqlTable L, int p, SqlTableType x);   // 在下标p的前面插入元素x
int InsertSqlTable_Post(SqlTable L, int p, SqlTableType x);  // 在下标p的后面插入元素x
int FindElement(SqlTable L, SqlTableType x);        // 查找元素x首次出现的位置
SqlTableType FindPostion(SqlTable L, int pos);      // 查找位置pos处的元素
int DeletePostion(SqlTable L, int pos);             // 删除下标pos处的元素
int DeleteElement(SqlTable L, SqlTableType x);      // 删除x值相同的数据元素
int DestroySqlTable(SqlTable L);                    // 销毁线性表
void PrintSqlTable(SqlTable L);     // 打印线性表

三、方法详解

// 创建空顺序表,能存放的最大元素个数为max
SqlTable CreateSqlTable(int max){
    SqlTable L = (SqlTable)malloc(sizeof(struct seqTable));
    if (L != NULL) {
        L->element = (SqlTableType*)malloc(sizeof(SqlTableType) * max);
        if (L->element) {
            L->MAXNUM = max;
            L->curNum = 0;
            return L;
        }
        else free(L);
    }
    return NULL;
}

// 判断顺序线性表是否已满
// 若已满,返回值为1,否则返回值为0
int IsSqlListFull(SqlTable L){
    return (L->curNum == L->MAXNUM);
}

// 在下标p插入元素x
// 若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
int InsertSqlTable_P(SqlTable L, int p, SqlTableType x){
    if (L->curNum >= L->MAXNUM) {
        printf("线性表已满");
        return 0;
    }
    if (p < 0) {
        printf("插入位置非法");
        return 0;
    }
    L->element[p] = x;
    L->curNum = L->curNum + 1;
    return 1;
}

// 在下标p的前面插入元素x
// 若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
int InsertSqlTable_Pre(SqlTable L, int p, SqlTableType x){
    if (L->curNum >= L->MAXNUM) {
        printf("线性表已满");
        return 0;
    }
    if (p <= 0 || p > L->curNum) {
        printf("插入位置非法");
        return 0;
    }
    for (int i = L->curNum - 1; i >= p - 1; i--)
        L->element[i + 1] = L->element[i];
    L->element[p - 1] = x;
    L->curNum = L->curNum + 1;
    return 1;
}

// 在下标p的后面插入元素x
// 若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
int InsertSqlTable_Post(SqlTable L, int p, SqlTableType x) {
    if (L->curNum >= L->MAXNUM) {
        printf("线性表已满");
        return 0;
    }
    if (p < 0 || p >= L->curNum) {
        printf("插入位置非法");
        return 0;
    }
    for (int i = L->curNum - 1; i >= p + 1; i--)
        L->element[i + 1] = L->element[i];
    L->element[p + 1] = x;
    L->curNum = L->curNum + 1;
    return 1;
}

// 打印线性表
void PrintSqlTable(SqlTable L) {
    for (int i = 0; i < L->curNum; i++)
        printf("%d ", L->element[i]);
    printf("\n");
}

// 查找元素x首次出现的位置
// 若待销毁的线性表不存在,则返回0
int FindElement(SqlTable L, SqlTableType x){
    for (int i = 0; i < L->curNum; i++) {
        if (L->element[i] == x) return i;
    }
    return -1;
}

// 查找位置pos处的元素
// 若不存在给定值,则返回-1
SqlTableType FindPostion(SqlTable L, int pos){
    if (pos<0 || pos>L->curNum) return L->element[0];
    else return L->element[pos];
}

// 删除下标pos处的元素
// 若pos非法,则返回-1;否则返回1
int DeletePostion(SqlTable L, int pos) {
    if (pos<0 || pos > L->curNum - 1) return -1;
    for (int i = pos; i < L->curNum - 1; i++)
        L->element[i] = L->element[i + 1];
    L->curNum = L->curNum - 1;
    return 1;
}

// 删除x值相同的数据元素
// 返回删除数据元素的个数
int DeleteElement(SqlTable L, SqlTableType x){
    int num = 0;
    for (int i = 0; i < L->curNum; i++){
        if (L->element[i] == x){
            DeletePostion(L, i);
            num++;
        }
    }
    return num;
}

// 销毁线性表
// 返回销毁线性表元素的个数
int DestroySqlTable(SqlTable L) {
    int num = L->curNum;
    free(L->element);
    free(L);
    return num;
}

四、运行结果

        main方法代码如下:

int main() {
    int max = 10;
    SqlTable table = CreateSqlTable(max);
    for (int i = 0; i < max; i++) {
        InsertSqlTable_P(table, i, i + 1);
    }
    PrintSqlTable(table);

    DeleteElement(table, 3);
    PrintSqlTable(table);

    DeletePostion(table, 3);
    PrintSqlTable(table);

    DestroySqlTable(table);
}

       运行结果如下:

  五、源代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

typedef int SqlTableType;

typedef struct seqTable{
    int MAXNUM;     // 最大元素个数   
    int curNum;     // 元素的个数
    SqlTableType* element;  // 连续空间的起始地址  
}*SqlTable;

SqlTable CreateSqlTable(int max);   // 创建空顺序表
int IsSqlListFull(SqlTable L);      // 判断顺序线性表是否已满
int InsertSqlTable_P(SqlTable L, int p, SqlTableType x);     // 在下标p插入元素x
int InsertSqlTable_Pre(SqlTable L, int p, SqlTableType x);   // 在下标p的前面插入元素x
int InsertSqlTable_Post(SqlTable L, int p, SqlTableType x);  // 在下标p的后面插入元素x
int FindElement(SqlTable L, SqlTableType x);        // 查找元素x首次出现的位置
SqlTableType FindPostion(SqlTable L, int pos);      // 查找位置pos处的元素
int DeletePostion(SqlTable L, int pos);             // 删除下标pos处的元素
int DeleteElement(SqlTable L, SqlTableType x);      // 删除x值相同的数据元素
int DestroySqlTable(SqlTable L);                    // 销毁线性表
void PrintSqlTable(SqlTable L);     // 打印线性表


// 创建空顺序表,能存放的最大元素个数为max
SqlTable CreateSqlTable(int max){
    SqlTable L = (SqlTable)malloc(sizeof(struct seqTable));
    if (L != NULL) {
        L->element = (SqlTableType*)malloc(sizeof(SqlTableType) * max);
        if (L->element) {
            L->MAXNUM = max;
            L->curNum = 0;
            return L;
        }
        else free(L);
    }
    return NULL;
}

// 判断顺序线性表是否已满
// 若已满,返回值为1,否则返回值为0
int IsSqlListFull(SqlTable L){
    return (L->curNum == L->MAXNUM);
}

// 在下标p插入元素x
// 若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
int InsertSqlTable_P(SqlTable L, int p, SqlTableType x){
    if (L->curNum >= L->MAXNUM) {
        printf("线性表已满");
        return 0;
    }
    if (p < 0) {
        printf("插入位置非法");
        return 0;
    }
    L->element[p] = x;
    L->curNum = L->curNum + 1;
    return 1;
}

// 在下标p的前面插入元素x
// 若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
int InsertSqlTable_Pre(SqlTable L, int p, SqlTableType x){
    if (L->curNum >= L->MAXNUM) {
        printf("线性表已满");
        return 0;
    }
    if (p <= 0 || p > L->curNum) {
        printf("插入位置非法");
        return 0;
    }
    for (int i = L->curNum - 1; i >= p - 1; i--)
        L->element[i + 1] = L->element[i];
    L->element[p - 1] = x;
    L->curNum = L->curNum + 1;
    return 1;
}

// 在下标p的后面插入元素x
// 若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
int InsertSqlTable_Post(SqlTable L, int p, SqlTableType x) {
    if (L->curNum >= L->MAXNUM) {
        printf("线性表已满");
        return 0;
    }
    if (p < 0 || p >= L->curNum) {
        printf("插入位置非法");
        return 0;
    }
    for (int i = L->curNum - 1; i >= p + 1; i--)
        L->element[i + 1] = L->element[i];
    L->element[p + 1] = x;
    L->curNum = L->curNum + 1;
    return 1;
}

// 打印线性表
void PrintSqlTable(SqlTable L) {
    for (int i = 0; i < L->curNum; i++)
        printf("%d ", L->element[i]);
    printf("\n");
}

// 查找元素x首次出现的位置
// 若待销毁的线性表不存在,则返回0
int FindElement(SqlTable L, SqlTableType x){
    for (int i = 0; i < L->curNum; i++) {
        if (L->element[i] == x) return i;
    }
    return -1;
}

// 查找位置pos处的元素
// 若不存在给定值,则返回-1
SqlTableType FindPostion(SqlTable L, int pos){
    if (pos<0 || pos>L->curNum) return L->element[0];
    else return L->element[pos];
}

// 删除下标pos处的元素
// 若pos非法,则返回-1;否则返回1
int DeletePostion(SqlTable L, int pos) {
    if (pos<0 || pos > L->curNum - 1) return -1;
    for (int i = pos; i < L->curNum - 1; i++)
        L->element[i] = L->element[i + 1];
    L->curNum = L->curNum - 1;
    return 1;
}

// 删除x值相同的数据元素
// 返回删除数据元素的个数
int DeleteElement(SqlTable L, SqlTableType x){
    int num = 0;
    for (int i = 0; i < L->curNum; i++){
        if (L->element[i] == x){
            DeletePostion(L, i);
            num++;
        }
    }
    return num;
}

// 销毁线性表
// 返回销毁线性表元素的个数
int DestroySqlTable(SqlTable L) {
    int num = L->curNum;
    free(L->element);
    free(L);
    return num;
}


int main() {
    int max = 10;
    SqlTable table = CreateSqlTable(max);
    for (int i = 0; i < max; i++) {
        InsertSqlTable_P(table, i, i + 1);
    }
    PrintSqlTable(table);

    DeleteElement(table, 3);
    PrintSqlTable(table);

    DeletePostion(table, 3);
    PrintSqlTable(table);

    DestroySqlTable(table);
}

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

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

相关文章

MySQL——mha高可用

MHA的概念 什么是 MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换的过…

【Android -- 面试】程序员面试必备软技能,值得收藏!

文章目录 一、准备技术型简历1. 准备简历模板2. 准备个⼈信息3. 准备专业技能4. 准备⼯作经历5. 准备项⽬经历 二、面试前的准备1. 利用脑图来梳理知识点2. 收到面试邀请后的准备 三、面试的注意事项1. ⾃我介绍2. 技术考察3. 向⾯试官提问4. 面试礼仪 四、如何通过 HR ⾯1. HR…

数据结构 | 顺序栈

一、数据结构定义 typedef int StackType; typedef struct seqStack{int MAXNUM; // 最大元素个数 int top; // 栈顶位置&#xff0c;初始化为0或-1StackType element[100]; // 元素的连续空间的起始地址 } *SeqStack; 二、方法概览 SeqStack CreateSqlStack…

【服务器数据恢复】ZFS文件系统下raid5数据恢复案例

服务器数据恢复环境&#xff1a; 某公司一台EMC某型号存储中有一组由12块硬盘组建的raid5磁盘阵列&#xff0c;其中有2块盘作为热备盘使用。 服务器故障&分析&#xff1a; raid5磁盘阵列中有2块磁盘离线&#xff0c;只有1块热备盘成功启用&#xff0c;另外一块热备盘未启用…

Elastic 栈中的 Kibana安装

Kibana 是一个开源分析和可视化平台&#xff0c;旨在与 Elasticsearch 协同工作。 你使用 Kibana 搜索&#xff0c;查看和与存储在 Elasticsearch 索引中的数据进行交互。 你可以轻松执行高级数据分析&#xff0c;并在各种图表&#xff0c;表格和地图中可视化你的数据。 官方链…

文件批量下载方法 文件批量下载工具

软件版本&#xff1a;Internet Download Manager 在当今数字化时代&#xff0c;我们日常使用电脑进行各种工作和娱乐活动。有时候&#xff0c;我们需要从互联网上下载大量文件&#xff0c;例如电影、音乐、文档等。在这种情况下&#xff0c;手动逐个下载文件将变得繁琐而耗时。…

梯度下降法求函数的解

题目 例如 y x^ 5 e^x3x−3&#xff0c;求解y 0的解 问题分析 首先要构造y 0的损失函数&#xff0c;让这个损失函数是凸的&#xff0c;也就是可以有最优解&#xff0c;并且是可到的&#xff0c;比较容易想到的是mse平方误差&#xff0c;我们要让y和0之间绝对误差最小。lo…

变压器铜铝材质分析仪技术参数

一、主要技术指标 1.输入特性 有源部分&#xff1a; 电压测量范围&#xff1a;0~10V 电流测量范围&#xff1a;0~10A 无源部分&#xff1a; 电压测量范围&#xff1a;0~750V 宽量限&#xff08;可以外接电压互感器&#xff09;。 电流测量范围&#xff1a;0~100A内部自动…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(6月 28 日论文合集)

文章目录 一、检测相关(6篇)1.1 Detector-Free Structure from Motion1.2 Irregular Change Detection in Sparse Bi-Temporal Point Clouds using Learned Place Recognition Descriptors and Point-to-Voxel Comparison1.3 Transferability Metrics for Object Detection1.4 …

【超全面】Linux嵌入式干货学习系列教程

文章目录 一、前言二、Linux基础篇三、数据结构与算法基础三、Linux应用篇四、Linux网络篇五、ARM篇六、Linux系统移植篇七、Linux驱动篇八、Linux特别篇九、Linux项目篇 一、前言 博主学习Linux也有几个月了&#xff0c;在这里为广大朋友整理出嵌入式linux的学习知识&#xff…

精彩回顾 | 迪捷软件亮相2023飞机航空电子国际论坛

2023年6月29日&#xff0c;2023&#xff08;第十二届&#xff09;飞机航空电子国际论坛&#xff08;以下简称论坛&#xff09;在上海市圆满落幕。论坛由中国航空学会、中国航空研究院、中航机载系统有限公司共同主办&#xff0c;中国航空无线电电子研究所、航空电子系统综合技术…

SpringCloud-Gateway网关全悉

1&#xff09;概述 使用说明文档 其他版本api文档请自由查阅&#xff1a; https://spring.io/projects/spring-cloud-gateway#learn 1.1&#xff09;是什么 Cloud全家桶中有个很重要的组件就是api网关&#xff0c;在1.x版本中都是采用的Zuul网关&#xff0c;但在2.x版本中&a…

【Logback技术专题】「入门到精通系列教程」深入探索Logback日志框架的原理分析和开发实战技术指南(下篇)

深入探索Logback日志框架的原理分析和开发实战技术指南&#xff08;下篇&#xff09; 根节点configuration包含的属性基本参数详解子节点介绍设置上下文名称<contextName>使用案例 设置变量属性值<property>获取时间戳字符串<timestamp>设置loggerroot根节点…

CDH 之 Hive 中文乱码平定通用法则

一、乱象 1.1 中文注释乱码 hive> DESCRIBE test; OK # col_name data_type comment id string ??ID ?? pcs string ????? …

java实现远程执行Linux下的shell脚本

java实现远程执行Linux下的shell脚本 背景导入Jar包第一步&#xff1a;远程连接第二步&#xff1a;开启Session第三步&#xff1a;新建测试脚本文件结果报错 背景 最近有个项目&#xff0c;需要在Linux下的服务器内写了一部分Python脚本&#xff0c;业务处理却是在Java内&…

采用三五555时基电路的简易/自动温度控制器电路设计

采用 555 时基电路的简易温度控制器 本电路是采用555时基集成电路和很少的外围元件组成的一个温度自动控制器。因为电路中各点电压都来自同一-直流电源&#xff0c;所以不需要性能很好的稳压电源&#xff0c;用电容降压法便能可靠地工作。电路元件价格低、体积小、便于在业余条…

喜报!Coremail实力上榜“邮件安全网关”和“反钓鱼”等三大赛道!

6月28日&#xff0c;由国内首家专业聚焦网络安全商业市场研究分析和加速服务的机构斯元商业咨询出品的「网安新兴赛道厂商速查指南|短名单精选」&#xff08;以下简称「短名单精选」&#xff09;正式出炉。 Coremail凭借出色的综合能力&#xff0c;成功上榜“邮件安全网关&…

最新导则下生态环评报告编制要求与规范

根据生态环评内容庞杂、综合性强的特点&#xff0c;依据生态环评最新导则&#xff0c;将内容分为4大篇章(报告篇、制图篇、指数篇、综合篇)、10大专题(生态环评报告编制、土地利用图的制作、植被类型及植被覆盖度图的制作、物种适宜生境分布图的制作、生物多样性测定、生物量及…

Django 的 REST framework 基础知识

系列文章目录 提示&#xff1a;阅读本章之前&#xff0c;请先阅读目录 文章目录 系列文章目录前言1. 创建django项目2. 修改settings.py3. 根目录创建static文件夹4. 启动项目5. 创建数据表6. 创建一个超级管理员7. 登录django的admin后台8. 安装 REST framework9. 配置setting…

Quiz 16_3-2: Databases | Python for Everybody 配套练习_解题记录

文章目录 Python for Everybody课程简介Quiz 16_3-2: Databases单选题&#xff08;1-10&#xff09;操作题Autograder 1: Counting Email in a DatabaseAutograder 2: Multi-Table Database - Tracks Python for Everybody 课程简介 Python for Everybody 零基础程序设计&…