【数据结构】顺序表的定义和运算

目录

1.初始化

2.插入

3.删除

4.查找

5.修改

6.长度

7.遍历

8.完整代码


🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。

💡本文由Filotimo__✍️原创,首发于CSDN📚。

📣如需转载,请事先与我联系以获得授权⚠️。

🎁欢迎大家给我点赞👍、收藏⭐️,并在留言区📝与我互动,这些都是我前进的动力!

🌟我的格言:森林草木都有自己认为对的角度🌟。

在C语言中,线性表的顺序存储结构可以使用数组来实现。顺序表是一种将元素按照顺序存储在连续的存储空间中的线性结构。

顺序表可以使用结构体来定义,例如:

#define MAXSIZE 100  // 线性表的最大长度

typedef struct {
    int data[MAXSIZE];  // 存储线性表元素的数组
    int length;         // 当前线性表长度
} List;

以下是顺序表的基本运算:

1.初始化

初始化一个空的顺序表:

void initList(List *L) {
    L->length = 0;
}

L:指向顺序表的指针。

将顺序表的长度length赋值为0,相当于清空了顺序表,使得顺序表L中不再有任何元素。

2.插入

在某个位置插入一个元素,使得该位置原来的元素和之后的元素往后移动:

int listInsert(List *L, int i, int elem) {
    int j;
    if (i < 1 || i > L->length + 1) {
        return 0; // 越界
    }
    if (L->length >= MAXSIZE) {
        return 0; // 线性表已满
    }
    for (j = L->length; j >= i; j--) {
        L->data[j] = L->data[j-1];
    }
    L->data[i-1] = elem;
    L->length++;
    return 1;
}

函数的目的是将一个元素elem插入到顺序表L的第i个位置。

i:要插入的位置

elem:要插入的元素的值

代码的逻辑:

(1)判断要插入的位置i是否越界,即是否小于1或大于线性表的长度加1。如果越界则返回0,表示失败。

(2)判断顺序表L是否已满,即顺序表的长度是否达到了最大容量MAXSIZE。如果已满则返回0,表示失败。

(3)通过一个循环,将从位置i开始的元素都向后移动一位,为要插入的元素留出空位。

(4)将要插入的元素elem赋值给位置i-1的元素。

(5)增加顺序表的长度。

(6)返回1,表示插入成功。

3.删除

删除某个位置的元素,使得该位置后面的元素往前移动:

int listDelete(List *L, int i) {
    int j;
    if (i < 1 || i > L->length) {
        return 0; // 越界
    }
    for (j = i; j < L->length; j++) {
        L->data[j-1] = L->data[j];
    }
    L->length--;
    return 1;
}

i:要删除的元素的位置

代码的逻辑:

(1) 判断要删除的位置i是否越界,即是否小于1或大于顺序表的长度。如果越界则返回0,表示失败。

(2)通过一个循环,将从位置i+1开始的元素都向前移动一位,覆盖了要被删除的元素。

(3)减少顺序表的长度。

(4)返回1,表示删除成功。

4.查找

根据值或位置查找一个元素:

int locateElem(List *L, int elem) {
    int i;
    for (i = 0; i < L->length; i++) {
        if (L->data[i] == elem) {
            return i+1;
        }
    }
    return 0; // 没找到
}

elem:要查找的元素的值

代码的逻辑:

(1)通过一个循环,遍历顺序表L中的每个元素。

(2)在循环中,判断当前元素是否等于要查找的元素elem。如果相等,则返回当前元素的位置(即i+1)。

(3)如果循环结束还没有找到相等的元素,则返回0,表示没有找到。

5.修改

根据位置修改某个元素的值:

int setElem(List *L, int i, int elem) {
    if (i < 1 || i > L->length) {
        return 0; // 越界
    }
    L->data[i-1] = elem;
    return 1;
}

 i:要设置元素的位置

-elem:要设置的新值

代码的逻辑:

(1)判断要设置的位置i是否越界,即是否小于1或大于线性表的长度。如果越界则返回0,表示失败。

(2)将线性表L的第i个位置的元素值设置为elem。

(3)返回1,表示设置成功。

6.长度

返回顺序表的长度:

int listLength(List *L) {
    return L->length;
}

直接返回顺序表L的长度L->length。

7.遍历

依次访问顺序表中的每个元素:

void traverseList(List *L) {
    int i;
    for (i = 0; i < L->length; i++) {
        printf("%d ", L->data[i]);
    }
    printf("\n");
}

代码的逻辑:

(1)通过一个循环,遍历顺序表L中的每个元素。

(2)在循环中,使用printf函数依次将每个元素的值输出到屏幕上,并在元素之间添加一个空格。

(3)在循环结束后,输出一个换行符,以便下一行输出。

8.完整代码

这里顺序表中的元素均设为 int 类型:

#include <stdio.h>

#define MAXSIZE 100  // 线性表的最大长度

typedef struct {
    int data[MAXSIZE];  // 存储线性表元素的数组
    int length;         // 当前线性表长度
} List;

// 初始化线性表
void initList(List *L) {
    L->length = 0;
}

// 在第 i 个位置插入元素 elem
int listInsert(List *L, int i, int elem) {
    int j;
    if (i < 1 || i > L->length + 1) {
        return 0; // 越界
    }
    if (L->length >= MAXSIZE) {
        return 0; // 线性表已满
    }
    for (j = L->length; j >= i; j--) {
        L->data[j] = L->data[j-1];
    }
    L->data[i-1] = elem;
    L->length++;
    return 1;
}

// 删除第 i 个元素
int listDelete(List *L, int i) {
    int j;
    if (i < 1 || i > L->length) {
        return 0; // 越界
    }
    for (j = i; j < L->length; j++) {
        L->data[j-1] = L->data[j];
    }
    L->length--;
    return 1;
}

// 查找第一个等于 elem 的元素
int locateElem(List *L, int elem) {
    int i;
    for (i = 0; i < L->length; i++) {
        if (L->data[i] == elem) {
            return i+1;
        }
    }
    return 0; // 没找到
}

// 返回第 i 个元素的值
int getElem(List *L, int i) {
    if (i < 1 || i > L->length) {
        return 0; // 越界
    }
    return L->data[i-1];
}

// 修改第 i 个元素的值为 elem
int setElem(List *L, int i, int elem) {
    if (i < 1 || i > L->length) {
        return 0; // 越界
    }
    L->data[i-1] = elem;
    return 1;
}

// 返回线性表的长度
int listLength(List *L) {
    return L->length;
}

// 遍历线性表
void traverseList(List *L) {
    int i;
    for (i = 0; i < L->length; i++) {
        printf("%d ", L->data[i]);
    }
    printf("\n");
}

int main() {
    List L;
    initList(&L);
    listInsert(&L, 1, 1);
    listInsert(&L, 2, 2);
    listInsert(&L, 3, 3);
    printf("插入 1, 2, 3 后的线性表:");
    traverseList(&L);  // 打印:1 2 3
    listDelete(&L, 2);
    printf("删除第 2 个元素后的线性表:");
    traverseList(&L);  // 打印:1 3

    int elem = getElem(&L, 2);
    printf("第 2 个元素的值为%d\n", elem);  // 打印:第 2 个元素的值为3
    setElem(&L, 1, 4);
    printf("修改第 1 个元素的值为 4 后的线性表:");
    traverseList(&L);  // 打印:4 3
    printf("线性表的长度为 %d\n", listLength(&L)); // 打印:线性表的长度为 2
    int pos = locateElem(&L, 3);
    if (pos) {
        printf("元素 3 的下标为 %d\n", pos);  // 打印:元素 3 的下标为 2
    } else {
        printf("元素 3 没有找到\n");
    }
    return 0;
}

输出结果如下:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot+线程池实现高频调用http接口并多线程解析json数据

场景 SpringbootFastJson实现解析第三方http接口json数据为实体类(时间格式化转换、字段包含中文)&#xff1a; SpringbootFastJson实现解析第三方http接口json数据为实体类(时间格式化转换、字段包含中文)-CSDN博客 Java中ExecutorService线程池的使用(Runnable和Callable多…

swiftUi——颜色

在SwiftUI中&#xff0c;您可以使用Color结构来表示颜色。Color可以直接使用预定义的颜色&#xff0c;例如.red、.blue、.green等&#xff0c;也可以使用自定义的RGB值、十六进制颜色代码或者系统提供的颜色。 1. 预定义颜色 Text("预定义颜色").foregroundColor(.…

使用STM32 HAL库进行GPIO控制的实例

✅作者简介&#xff1a;热爱科研的嵌入式开发者&#xff0c;修心和技术同步精进&#xff0c; 代码获取、问题探讨及文章转载可私信。 ☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。 &#x1f34e;获取更多嵌入式资料可点击链接进群领取&#xff0c;谢谢支持&#xff01;…

人工智能学习9(LightGBM)

编译工具&#xff1a;PyCharm 文章目录 编译工具&#xff1a;PyCharm lightGBM原理lightGBM的基础使用案例1&#xff1a;鸢尾花案例2&#xff1a;绝对求生玩家排名预测一、数据处理部分1.数据获取及分析2.缺失数据处理3.数据规范化4.规范化输出部分数据5.异常数据处理5.1删除开…

调用win32 api获取电脑名字和系统目录

学习一下几个函数的功能&#xff0c;和调用方式&#xff1b; void CBasenameView::OnDraw(CDC* pDC) {CBasenameDoc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCString str1;TCHAR myname1[50], myname2[50], mydirname1[50], myd…

class061 最小生成树【算法】

class061 最小生成树【算法】 2023-12-8 11:48:12 算法讲解061【必备】最小生成树 code1 P3366 【模板】最小生成树 // Kruskal算法模版&#xff08;洛谷&#xff09; // 静态空间实现 // 测试链接 : https://www.luogu.com.cn/problem/P3366 // 请同学们务必参考如下代码中…

实战:Docker Compose 下 Nginx、Java、Mysql 和 Redis 服务协同部署(包含解决浏览器访问Linux部署服务器本地资源问题)

1. 背景 在该实战中&#xff0c;我们将探讨如何使用Docker Compose协同部署Nginx、Java、Mysql和Redis服务&#xff0c;实现一个视频上传与展示的应用。具体需求如下&#xff1a; Java应用负责上传视频和图片资源到Nginx目录下&#xff0c;作为资源服务器。Nginx服务作为静态…

Redis数据已经删除了,为什么内存占用还是很高?

Redis数据已经删除了&#xff0c;为什么内存占用还是很高&#xff1f; Redis做了数据删除操作&#xff0c;为什么使用top命令时&#xff0c;还是显示Redis占了很多内存&#xff1f; 没做相关功课的人觉得这个问题有问题&#xff0c;删了数据还说占着内存&#xff0c;面试官不…

ubuntu22.04 安装cuda

CUDA&#xff08;Compute Unified Device Architecture&#xff09;是由 NVIDIA 开发的一种并行计算平台和编程模型。它允许开发者利用 NVIDIA 的 GPU&#xff08;图形处理单元&#xff09;进行高效的计算处理。CUDA 通过提供一系列的 C、C 和 Fortran 扩展&#xff0c;使得开发…

Navicat 技术指引 | 连接 GaussDB 分布式

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结…

小程序开发要多少钱

随着智能手机的普及和人们对移动应用的需求不断增长&#xff0c;小程序作为一种轻量级应用形式&#xff0c;在商业领域中备受关注。众多企业都渴望抓住这一机遇&#xff0c;但他们最关心的问题之一是&#xff1a;小程序开发需要多少钱&#xff1f; 一、开发方式选择 在开始小…

【LuatOS】笔记(二)基础框架

开发环境搭建 合宙官方搭建的是&#xff1a;vscodeLuatOS-SOC推荐拓展包(vscode插件)&#xff0c;原文链接&#xff1a;LuatOS开发环境搭建。安装完创建项目文件&#xff0c;创建main.lua文件&#xff0c;就可以开始编写了。 函数与使用 LuatOS-SOC接口文档1&#xff0c;该文档…

MongoDB的插入文档、更新文档语句

本文主要介绍MongoDB的插入文档、更新文档语句。 目录 MongoDB插入文档MongoDB更新文档 MongoDB插入文档 在MongoDB中&#xff0c;可以通过使用insertOne或insertMany方法向集合中插入文档。 insertOne方法可以插入一个文档&#xff0c;例如&#xff1a; db.collection.inse…

【深度学习】一维数组的聚类

在学习聚类算法的过程中&#xff0c;学习到的聚类算法大部分都是针对n维的&#xff0c;针对一维数据的聚类方式较少&#xff0c;今天就来学习下如何给一维的数据进行聚类。 方案一&#xff1a;采用K-Means对一维数据聚类 Python代码如下&#xff1a; from sklearn.cluster im…

【Cisco Packet Tracer】路由器实验 静态路由/RIP/OSPF/BGP

本教程讲解路由器的静态IP配置、RIP、OSPF、BGP等实验内容。 一、基本设置 绘制以下拓扑结构&#xff1a; PC0设置&#xff1a; PC1设置&#xff1a; Router0端口0设置&#xff1a; Router0端口1设置&#xff1a; Router1端口0设置&#xff1a; Router1端口1设置&#xff1a…

Elasticsearch:使用 Elasticsearch 向量搜索及 RAG 来实现 Chatbot

Elasticsearch 的向量搜索为我们的语义搜索提供了可能。而在人工智能的动态格局中&#xff0c;检索增强生成&#xff08;Retrieval Augmented Generation - RAG&#xff09;已经成为游戏规则的改变者&#xff0c;彻底改变了我们生成文本和与文本交互的方式。 RAG 使用大型语言模…

PR剪辑视频做自媒体添加字幕快速方式(简单好用的pr视频字幕模板)

如何选择合适的字幕添加进短视频呢&#xff1f;首先要先确定增加的视频风格&#xff0c;简约、商务、科技感、炫酷&#xff1b;再确定用途&#xff0c;注释、标记、语音翻译、引用、介绍&#xff1b;最后在相应的模板中挑选几个尝试&#xff0c;悬着一个最切合主题的使用&#…

数据结构——队列

目录 一、队列的定义 二、队列的实现 1. 队列的顺序存储结构 1.1. 顺序队 1. 创建顺序队 2. 删除顺序队 3. 判断队列是否为空 4. 判断队列是否已满 5. 入队 6. 出队 7. 获取队列长度 8. 获取队首元素 1.2. 环形队 1. 创建环形队 2. 删除环形队 3. 判断环形队列…

QMenu风格设计qss+阴影

Qt的菜单经常在软件开发中用到&#xff0c;默认的菜单效果都不符合设计师的要求&#xff0c;本篇介绍QMenu菜单的风格设计&#xff0c;包括样式表和阴影。 1.QMenu样式表的设计 首先看一个默认的菜单 void QGraphicsDropShadowEffectDemo::slotShowDialog() {qDebug() <&l…

Navicat 技术指引 | 适用于 GaussDB 分布式的查询功能

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结…