数据结构(c语言版) 顺序表

news2024/12/27 1:29:51

代码

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

typedef int E;     //这里我们的元素类型就用int为例吧,先起个别名

//定义结构体
struct List{
    E * array;
    int capacity;   //数组的容量
    int size;
};

//给结构体指针起别名
typedef struct List * ArrayList;    //因为是数组实现,所以就叫ArrayList,这里直接将List的指针起别名

//初始化
_Bool initList(ArrayList list){
    list->array = malloc(sizeof (E) * list->capacity);    //使用malloc函数申请10个int大小的内存空间,作为底层数组使用
    if(list->array == NULL) return 0;  //需要判断如果申请的结果为NULL的话表示内存空间申请失败
    list->capacity = 10;             //直接将数组的容量设定为10即可
    list->size=0;
    return 1;
}

//插入数据操作
_Bool insertList(ArrayList list, E element, int index){
    if(index < 1 || index > list->size + 1) return 0;                                    //判断插入位置,转换成位序,也就是[1, size + 1]这个闭区间

    if(list->size == list->capacity) {                                                   //如果size已经到达最大的容量了,肯定是插不进了,那么此时就需要扩容了
        int newCapacity = list->capacity + (list->capacity >> 1);                        //我们先计算一下新的容量大小,这里我取1.5倍原长度,当然你们也可以想扩多少扩多少
        E * newArray = realloc(list->array, newCapacity * sizeof(E));           //这里我们使用新的函数realloc重新申请更大的内存空间
        if(newArray == NULL) return 0;                                                   //如果申请失败,那么就确实没办法插入了,只能返回0表示插入失败了
        list->array = newArray;
        list->capacity = newCapacity;
    }

    for (int i = list->size; i > index - 1; --i)
        list->array[i] = list->array[i - 1];
    list->array[index - 1] = element;
    list->size++;
    return 1;
}

//打印数据
void printList(ArrayList list){   //编写一个函数用于打印表当前的数据
    for (int i = 0; i < list->size; ++i)   //表里面每个元素都拿出来打印一次
        printf("%d ", list->array[i]);
    printf("\n");
}

//删除操作
_Bool deleteList(ArrayList list, int index){
    if(index < 1 || index > list->size) return 0;
    for (int i = index - 1; i < list->size - 1; ++i)
        list->array[i] = list->array[i + 1];   //实际上只需要依次把后面的元素覆盖到前一个即可
    list->size--;   //最后别忘了size - 1
    return 1;
}

//获取size的大小
int sizeList(ArrayList list){
    return list->size;
}

//按位置获取元素
E * getList(ArrayList list, int index){
    if(index < 1 || index > list->size) return NULL;
    return &list->array[index - 1];
}

int findList(ArrayList list, E element){
    for (int i = 0; i < list->size; ++i) {   //一直遍历,如果找到那就返回位序
        if(list->array[i] == element) return i + 1;
    }
    return -1;  //如果遍历完了都没找到,那么就返回-1
}

int main(){
    struct List list;   //创建新的结构体变量
    if(initList(&list)){   //对其进行初始化,如果失败就直接结束
        for (int i =0; i<30; i++){
            insertList(&list, i*10, i+1);
        }
        deleteList(&list, 10);
        deleteList(&list, 10);
        printList(&list);
        printf("获取数组容量:%d\n", list.capacity);      //获取数组容量

        printf("按位置获取元素:%d\n", *getList(&list, 3));      //按位置获取元素
        printf("按值查找元素位置:%d\n", findList(&list, 30));  //按值查找元素位置
    } else{
        printf("顺序表初始化失败,无法启动程序!");
    }
}

运行效果

在这里插入图片描述

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

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

相关文章

【每日OJ题—— 141. 环形链表(链表)】

每日OJ题—— 141. 环形链表&#xff08;链表&#xff09; 1.题目&#xff1a;141. 环形链表2.方法讲解2.1 解法2.1.1 图文解析2.1.2 代码的实现2.1.3提交通过展示 1.题目&#xff1a;141. 环形链表 2.方法讲解 2.1 解法 2.1.1 图文解析 我们可以根据上述思路来解决本题。具体…

一机服务万人,拓世法宝AI智能商业数字人一体机,解锁文旅新表达

在人工智能的强劲推动下&#xff0c;人们走进了一个令人振奋的数字化时代。如何让文化传承与现代科技完美融合&#xff0c;成为一个十分有趣的议题&#xff0c;当AI技术结合文旅生活&#xff0c;便悄然开启了一种全新的旅游服务模式——AI数字文旅。 在我国国家博物馆、文旅大…

重生奇迹mu翅膀的合成!

你熟悉合成流程的话&#xff0c;只要拥有足够的材料&#xff0c;你便能拥有自己心仪的翅膀&#xff01;它的存在不仅仅只是美丽&#xff0c;其属性更是远远超过一般的装备概念&#xff0c;对游戏人物的加成幅度值得你投入&#xff01; 职业不同且翅膀各异 重生奇迹mu里面有着…

“抖音电商:颠覆传统,助力创新,引领未来电商新潮流“

一、引言 随着科技的飞速发展&#xff0c;电子商务已经成为人们日常生活的重要组成部分。近年来&#xff0c;抖音电商的异军突起&#xff0c;以其独特的助力方式&#xff0c;打破了传统电商的格局&#xff0c;引领了电商行业的新潮流。本文将探讨抖音电商的助力方式&#xff0…

正逆解项目

主要概念 正解&#xff1a;根据传动链的关节角度计算位置信息、旋量、姿态四位数、旋转矩阵 逆解&#xff1a;根据位置信息、旋量、姿态四位数、旋转矩阵计算传动链的关节角度 主要指责 下图为逆解的主要数据格式&#xff0c;Java端主要负责作为服务端接受客户端的报文消息&…

安全好用的远程协同运维软件重点推荐-行云管家

对于运维小伙伴而言&#xff0c;一个安全好用的远程协同运维软件至关重要&#xff0c;不仅可以提高工作率&#xff0c;降低工作风险&#xff0c;还能快速解决运维难题。目前市面上远程协同运维软件品牌比较多&#xff0c;这里我们小编给推荐行云管家IT远程协同运维平台。 安全…

不用流氓软件,如何在户外使用手机听下载到家中电脑里的音乐文件呢?

文章目录 本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是本教程使用环境&#xff1a;1 群晖系统安装audiostation套件2 下载移动端app3 内网穿透&#xff0c;映射至公网 很多老铁想在上班路上听点喜欢的歌或者相声解解闷儿&#xff0c;于是打开手…

最新神兽冲刺三件套,自控专业课复习最强资料详细介绍!

所谓又专又精&#xff0c;专是指我们售后群团队上百人都是自动化研究生&#xff0c;精是指我们只做自动化这一门专业学科7年了&#xff0c;研究到极致 专业课即将进入冲刺阶段啦&#xff0c;资料选的好&#xff0c;高分少不了&#xff0c;今天学姐给大家带来的是专业课复习的宝…

Linux工具git版本控制器介绍

git介绍 ​ git就是一个版本控制器&#xff0c;是由Linux之父写的开源软件&#xff0c;功能就是保存每个版本的内容。将被管理的内容&#xff08;文本&#xff09;&#xff0c;按照变化来进行管理的软件&#xff0c;你需要哪一个变化的版本都可以找到。 git是一个软件&#x…

动态IP和静态IP哪个安全,该怎么选择

随着互联网的普及&#xff0c;越来越多的人开始关注网络安全问题。其中&#xff0c;IP地址作为网络通信中的重要组成部分&#xff0c;也成为了人们关注的焦点。 在IP地址中&#xff0c;动态IP和静态IP是两种不同的分配方式&#xff0c;它们各自具有不同的特点&#xff0c;那么…

响应式特性

前言 持续学习总结输出中&#xff0c;今天分享的是响应式特性 1.什么是响应式&#xff1f; 简单理解就是数据变&#xff0c;视图对应变。 数据的响应式处理→ 响应式:数据变化&#xff0c;视图自动更新 聚焦于数据 → 数据驱动视图 使用 Vue 开发&#xff0c;我们主要关注…

石器时代?俄计划生产350纳米光刻机 | 百能云芯

在国际制裁的阴影下&#xff0c;俄罗斯正迈向自主研发生产芯片的新时代&#xff0c;接下来&#xff0c;俄罗斯计划采用土法炼钢研发生产芯片的光刻机。俄罗斯工业和贸易部副部长Vasily Shpak宣布&#xff0c;支持350纳米制程的光刻机将于2024年亮相&#xff0c;而支持130纳米制…

unity打AB包,AssetBundle预制体与图集(一)

第一步&#xff1a;打AB包 1、先创建一个AB包的按钮&#xff0c;如图 新建一个脚本 public class BulidBundle : Editor {[MenuItem("TOOL/BuildBundle")]public static void BuildAndroidBundle(){} }创建目录 public static void BuildAndroidBundle(){// 设置…

随时随地时时刻刻使用GPT类应用

疑问 很多人说GPT的广泛使用可能会使人们失业&#xff0c;会对一些互联网公司的存活造成挑战&#xff0c;那么这个说法是真的吗&#xff1f; 这个说法并不完全准确。虽然GPT等AI技术的广泛应用可能会对某些行业和职业产生影响&#xff0c;但并不意味着它会导致人们失业或互联网…

飞书开发学习笔记(四)-飞书API的访问凭证获取

飞书开发学习笔记(四)-飞书API的访问凭证获取 一.了解飞书的访问凭证体系 飞书有一套完善的鉴权管理系统&#xff0c;在飞书API开发时&#xff0c;请求头中必须包含有相关的凭证信息。这个凭证信息是整个开发的安全所在&#xff0c;并且有对应的时效&#xff0c;所以了解飞书…

回馈负载的工作原理

回馈负载是一种闭环控制系统&#xff0c;其基本原理是通过测量系统的输出&#xff0c;并将测量结果与期望的参考输入进行比较&#xff0c;从而产生一个误差信号。这个误差信号被送入控制器&#xff0c;控制器根据预先设定的控制算法来生成控制信号&#xff0c;以调整系统的行为…

UE5——源码阅读——5——引擎预初始化

初始化IO调度器 初始化文本本地化系统 初始化着色器代码库 检测当前的命令行参数是否包含文件覆盖的选项 向引擎二进制搜索路径中添加一些特定的限制的子目录&#xff0c;保证依赖的动态库文件可以被正确的找到&#xff0c;这些被限制的目录通常是包含一些受限的或者是特定…

【服务器使用】vscode winscp进行服务器容器连接(含修改初始密码)

1&#xff1a;获取docker的登陆信息 例如节点&#xff08;host&#xff09;、端口&#xff08;port&#xff09;、密码&#xff08;passwd&#xff09;等信息&#xff0c;这个自己找组内的前辈获取即可 2&#xff1a;配置config文件 找到vscode里面ssh处的config文件 人工找…

非父子通信事件、数据传递

非父子组件消息传递 1.作用 非父子组件之间&#xff0c;进行简易消息传递。(复杂场景→ Vuex) 2.步骤 创建一个都能访问的事件总线 &#xff08;空Vue实例&#xff09; import Vue from vue const Bus new Vue() export default BusA组件&#xff08;接受方&#xff09;&am…

手机升级STM32单片机,pad下载程序,手机固件升级单片机,局域网程序下载,STM32单片机远程下载升级

STM32单片机&#xff0c;是我们最常见的一种MCU。通常我们在使用STM32单片机都会遇到程序在线升级下载的问题。 STM32单片机的在线下载通常需要以下几种方式完成&#xff1a; 1、使用ST提供的串口下载工具&#xff0c;本地完成固件的升级下载。 2、自行完成系统BootLoader的编写…