rsa算法c语言实现_数据结构与算法之线性表-顺序表实现(C语言版本)

dd16984dcd492dd1f55aae8c934dc1d0.png
原文托管在Github: https://github.com/shellhub/blog/issues/52

数据结构与算法之线性表-顺序表实现(C语言版本)

前言

数据结构与算法是一个程序员必备的技能之一,而顺序表更是每个程序员在面试过程中要经常被问到的,如Java语言中的ArrayList类的底层实现就是使用顺序表实现的,别把顺序表想的有多么高大上,其实就是使用数组实现的一种线性表

什么是线性表

线性表(英语:Linear List)是由n(n≥0)个数据元素(结点)a[0],a[1],a[2]…,a[n-1]组成的有限序列。 其中: 数据元素的个数n定义为表的长度 = "list".length() ("list".length() = 0(表里没有一个元素)时称为空表) 将非空的线性表(n>=1)记作:(a[0],a[1],a[2],…,a[n-1]) * 数据元素a[i](0≤i≤n-1)只是个抽象符号,其具体含义在不同情况下可以不同

一个数据元素可以由若干个数据项组成。数据元素称为记录,含有大量记录的线性表又称为文件。这种结构具有下列特点:存在一个唯一的没有前驱的(头)数据元素;存在一个唯一的没有后继的(尾)数据元素;此外,每一个数据元素均有一个直接前驱和一个直接后继数据元素。

什么是顺序表

顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。

顺序表的实现

为了能实现顺序表的基本操作如(增,删,改,查),我们使用结构体封装一个指向一维数组的指针base,同时提供一个名字叫做length的整型变量表示顺序表中实际有用的元素个数,当插入一个元素时length++, 当删除一个元素时length--,所以length可以记录当前顺序表的长度

顺序表综合案列-学生信息管理系统

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <assert.h>#define INIT_SIZE 1
#define INCREMENT_SIZE 5
typedef struct {int id; //学号int age; //年龄char name[10]; //姓名
} Student;typedef Student ElemType;typedef struct {ElemType *base;int size; /* 顺序表的最大容量 */int length; /* 记录顺序表的元素个数 */
} SqList;/*** 初始化顺序表* @param p 指向顺序表的指针* @return 如果初始化成功返回true否则返回false*/
bool init(SqList *p) {p->base = malloc(sizeof(SqList) * INIT_SIZE);if (p->base == NULL) {return false;}p->size = INIT_SIZE;p->length = 0;return true;
}/*** 指定位置插入数据元素* @param p 指向顺序表的指针* @param index 插入的下标* @param elem 插入的元素值* @return 如果插入成功返回true,否则返回false*/
bool insert(SqList *p, int index, ElemType elem) {if (index < 0 || index > p->length) {perror("插入下标不合法");return false;}//如果顺序表满了,则重新分配更大的容量if (p->length == p->size) {int newSize = p->size + INCREMENT_SIZE;ElemType *newBase = realloc(p->base, newSize);if (newBase == NULL) {perror("顺序表已满,重新分配内存失败");return false;}p->base = newBase;p->size = newSize;}//从最后一个元素开始依次把元素复制到后面的位置for (int i = p->length - 1; i >= index; --i) {p->base[i + 1] = p->base[i];}p->base[index] = elem;p->length++;return true;
}/*** 删除指定下标的数据元素* @param p 指向顺序表的指针* @param index 删除的元素的下标* @param elem 返回删除的元素* @return 如果删除成功返回true否则返回false*/
bool del(SqList *p, int index, ElemType *elem) {if (p->length == 0) {perror("顺序是空的,无法执行删除操作");return false;}if (index < 0 || index > p->length - 1) {perror("删除位置不合法");return false;}//把删除的元素保存起来*elem = p->base[index];//从删除位置开始依次把后面的元素赋值到前面for (int i = index; i < p->length - 1; ++i) {p->base[i] = p->base[i + 1];}p->length--;return true;
}/*** 更新顺序表中特定的元素值* @param p 指向顺序表的指针* @param index 更新下标* @param elem 更改后的新元素值* @return 如果更改成功则返回true,否则返回false*/
bool update(SqList *p, int index, ElemType elem) {if (p->length == 0) {perror("顺序表是空的,无法指向更新");return false;}if (index < 0 || index > p->length - 1) {perror("更新下标不合法");return false;}p->base[index] = elem;return true;
}/*** 搜索顺序表中特定下标的元素* @param list 指定的顺序表* @param index 搜索的下标* @param elem 保存搜索到的元素* @return 如果搜索成功则返回true,否则返回false*/
bool search(SqList list, int index, ElemType *elem) {if (list.length == 0) {perror("顺序表没有任何元素,无法查找");return 0;}if (index < 0 || index > list.length - 1) {perror("查找下标不合法");return false;}*elem = list.base[index - 1];return true;
}/*** 打印顺序表* @param list 指定顺序表*/
void output(SqList list) {printf("学号t年龄t姓名n");for (int i = 0; i < list.length; ++i) {printf("%dt%dt%sn", list.base[i].id, list.base[i].age, list.base[i].name);}printf("n");
}int main() {SqList list;while (1) {printf("tt顺序表的基本操作n");printf("tt1.初始化顺序表n");printf("tt2.顺序表的插入n");printf("tt3.顺序表的删除n");printf("tt4.顺序表的查找(下标)n");printf("tt5.顺序表的修改n");printf("tt6.打印n");printf("tt0.退出n");int choice;printf("请输入功能编号:");scanf("%d", &choice);switch (choice) {case 1:if (init(&list)) {printf("初始化成功n");}assert(list.length == 0);break;case 2:;ElemType elem;printf("请输入插入的学生学号:");scanf("%d", &elem.id);printf("请输入插入的学生年龄:");scanf("%d", &elem.age);printf("请输入插入的学生姓名:");scanf("%s", elem.name);printf("请输入插入位置:");int index;scanf("%d", &index);if (insert(&list, index, elem)) {printf("插入成功n");}break;case 3:printf("请输入删除位置:");scanf("%d", &index);if (del(&list, index, &elem)) {printf("删除的学生 学号:%dt年龄:%dt姓名:%sn", elem.id, elem.age, elem.name);}break;case 4:printf("请输入要查找的位置:");scanf("%d", &index);if (search(list, index, &elem)) {printf("查找的学生 学号:%dt年龄:%dt姓名:%sn", elem.id, elem.age, elem.name);}break;case 5:printf("请输入更新位置:");scanf("%d", &index);printf("请输入更新后的学生学号:");scanf("%d", &elem.id);printf("请输入更新后的学生年龄:");scanf("%d", &elem.age);printf("请输入更新后的学生姓名:");scanf("%s", elem.name);if (update(&list, index, elem)) {printf("更新成功n");}break;case 6:output(list);break;case 0:exit(0);default:printf("输入编号有误,请重新输入n");break;}}return 0;
}

顺序表优缺点

  • 优点
    • 因为顺序表使用数组实现,可以通过下标存取,所以存取速度极快,T(n)=O(1)
    • 无需为表中元素之间的逻辑关系而增加额外的存储空间
    • 空间利用效率高
  • 缺点
    • 插入删除均需要循环移动元素,比较浪费时间 T(n)=O(n)
    • 需要提前预估顺序表的长度(INIT_SIZE),分配太大浪费,造成内存的碎片化

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

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

相关文章

hadoop安装详细步骤_推荐一个超详细的Hadoop安装教程,已有32万次阅读

安装Hadoop软件系列&#xff0c;首选Linux系统&#xff0c;比如Ubuntu。如果你的系统是Windows&#xff0c;建议再安装一个Ubuntu&#xff0c;组成双系统&#xff0c;如此可以发挥各自系统的特点。使用U盘制作一个系统&#xff0c;拿出一块分区用作新装的系统&#xff0c;开机启…

后宫佳丽三千,假如古代皇帝也懂负载均衡算法...

古代皇帝&#xff0c;后宫佳丽三千&#xff0c;没法做到雨露均沾&#xff0c;但为了繁衍后代&#xff0c;子嗣繁盛&#xff0c;弱水三千&#xff0c;只取一瓢饮显然是不行的。不同的朝代有不同的宠幸妃子的方法&#xff0c;著名的有羊车望幸、掷筛侍寝、翻牌悬灯等等。如果皇帝…

mac 配置php和mysql_Mac下配置PHP+MySql环境

由于最近需要布置mantis用来进行bug追踪&#xff0c;在此记录其过程。由于PHP apache环境在Mac OS上是自带的&#xff0c;所以不需要另处下安装包&#xff0c;只需要简单配置一下即可。首先打开终端输入命令&#xff1a;sudo vim /etc/apache2/httpd.conf其中有一行是这样的#Lo…

git使用的基本流程_git命令的基本使用

首先下载完git之后打开Git Bash配置你的邮箱和用户名&#xff08;github或gitee&#xff09;&#xff1a;$ git config --global user.name "注册时账号的名字"$ git config --global user.email "注册时使用的邮箱"获取ssh公钥&#xff1a;ssh-keygen -t …

Code Runner for VS Code 突破 2000 万下载量!支持超过 50 种语言

还记得五年前的夏天&#xff0c;我在巨硬写着世界上最好的语言&#xff0c;有时也需要带着游标卡尺写着另一门语言。然而&#xff0c;我对这两门语言都不熟悉&#xff0c;如果能在 VS Code 中方便快捷地运行各种语言&#xff0c;那岂不是很方便&#xff1f;于是&#xff0c;我就…

mysql group where_[MySQL] 测试where group by order by的索引问题

1. select * from test where axx group by b order by c 如何加索引CREATE TABLE index_test (id int(10) unsigned NOT NULL AUTO_INCREMENT,name varchar(100) NOT NULL DEFAULT ,gid int(11) NOT NULL DEFAULT 0,age int(11) NOT NULL DEFAULT 0,PRIMARY KEY (id)) ENGI…

gpl可以商用吗_一文看懂开源许可证,能不能商用再也不抓瞎

在github中闲逛&#xff0c;宝藏多福利好。不过心里或许总有小忐忑&#xff0c;这么多开源项目&#xff0c;我的产品里能不能用呀&#xff01;其实想知道项目能不能用看下项目的开源许可证就清楚了(即使是非软件产品比如数据、媒体、资料等也可以通过开源许可证知道它们的可用范…

使用 Tye 辅助开发 k8s 应用竟如此简单(一)

最近正巧在进行 Newbe.Claptrap 新版本的开发&#xff0c;其中使用到了 Tye 来辅助 k8s 应用的开发。该系列我们就来简单了解一下其用法。安装 Tye 首先&#xff0c;确保已经正确安装了 netcore 2.1 或以上版本的 dotnet SDK。Tye 目前还处于开发阶段&#xff0c;因此&#xff…

php上传文件很慢的原因_PHP编码安全:上传文件安全

一次性付费进群&#xff0c;长期免费索取教程&#xff0c;没有付费教程。进微信群回复公众号&#xff1a;微信群&#xff1b;QQ群&#xff1a;460500587教程列表 见微信公众号底部菜单 | 本文底部有推荐书籍 微信公众号&#xff1a;计算机与网络安全ID&#xff1a;Computer-net…

RabbitMQ 入门:2. Exchange 和 Queue

上文RabbitMQ 入门&#xff1a;1. Message Broker&#xff08;消息代理&#xff09;提到过 RabbitMQ 实现了 AMQP 这个协议&#xff08;RabbitMQ 所支持的 AMQP 的版本是 0.9.1&#xff09;&#xff0c;这个协议的内容很多&#xff0c;但为了构建入门级的分布式应用&#xff0c…

【组图】地震前线归来--心中的震撼

5.12号获悉家乡发生大地震&#xff0c;不放心在成都的家人朋友&#xff0c;于13日从北京赶回成都&#xff0c;再了解事态严重性&#xff0c;并确定家人情况后&#xff0c;14日与众多志愿者一起从成都出发&#xff0c;取道彭州市&#xff0c;通济镇&#xff0c;白水河镇&#xf…

前端 input怎么显示null_小猿圈WEB前端之HTML5+CSS3面试题(一)

学习是一件非常充实的过程&#xff0c;特别是把自己的乐趣变成工作的时候&#xff0c;很多朋友就喜欢学习web前端&#xff0c;所以学习前端&#xff0c;也希望从事前端的工作&#xff0c;但是因为缺少实战经验&#xff0c;所以很多都是卡在面试这关上&#xff0c;下面小猿圈总结…

聊聊Interlocked.CompareExchange吧?

【导读】私下空余时间一直在研究开源框架&#xff0c;当然也就少不了学习优秀源码&#xff0c;本文也是我查看有关源码时&#xff0c;触碰到我个人知识盲区&#xff0c;做此记录&#xff0c;分享下Interlocked.CompareExchange这玩意用法被讲的很烂了&#xff0c;为何再次被提及…

winform 统计大量数据重复的元素个数_面试系列:十个海量数据处理方法大总结...

本文将简单总结下一些处理海量数据问题的常见方法。当然这些方法可能并不能完全覆盖所有的问题&#xff0c;但是这样的一些方法也基本可以处理绝大多数遇到的问题。下面的一些问题基本直接来源于公司的面试笔试题目&#xff0c;方法不一定最优&#xff0c;如果你有更好的处理方…

java 堆栈_Java中线程与堆栈的关系

栈是线程私有的&#xff0c;每个线程都是自己的栈&#xff0c;每个线程中的每个方法在执行的同时会创建一个栈帧用于存局部变量表、操作数栈、动态链接、方法返回地址等信息。每一个方法从调用到执行完毕的过程&#xff0c;就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。其…

java怎么将前端的数据存到关联的表中_Java程序员最可能被考到的14个面试题

1. 如何只扫描一遍就找到位于一个链表正中间的元素&#xff1f; 这是最受欢迎的算法题之一&#xff0c;经常在电话面试中被问到。很多程序员会想&#xff0c;要知道链表的长度&#xff0c;就要先扫描一遍链表&#xff0c;然后在第二遍中取其正中的元素。所以被要求只扫描一遍就…

常见的几种最优化方法

阅读目录1. 梯度下降法&#xff08;Gradient Descent&#xff09;2. 牛顿法和拟牛顿法&#xff08;Newtons method & Quasi-Newton Methods&#xff09;3. 共轭梯度法&#xff08;Conjugate Gradient&#xff09;4. 启发式优化方法我们每个人都会在我们的生活或者工作中遇到…

专业的软件安装包可以这样做!

C/S客户端开发完成&#xff0c;需要将程序交付给用户&#xff0c;直接压缩发给用户是可以的&#xff08;只是有点不专业&#xff09;&#xff0c;如果能有一个比较好看的安装界面&#xff0c;那档次就不一样了。本文介绍怎么使用Adanced Installer 17.9 制作专业的Windows 客户…

IT人喝酒,不同岗位不同姿势

这是Boss们的常用套路&#xff0c;频频举杯&#xff0c;给大家鼓劲加油&#xff0c;但是自己不喝。有的销售&#xff0c;业绩好&#xff0c;酒品也好&#xff0c;不管和自己人喝酒&#xff0c;还是和客户喝酒&#xff0c;都是一副舍我其谁的霸气&#xff01;这是某些销售的写照…

国产CPU群雄逐鹿谁主沉浮

当下&#xff0c;国内&#xff08;桌面、服务器&#xff09;CPU与外商有较大差距&#xff0c;除了海光在性能上可能具有一拼之力外&#xff0c;其它国产CPU在商业市场上面对英特尔、AMD基本不具备竞争力&#xff0c;因而只能在篱笆墙内的市场角逐。而为了能够进入篱笆墙内的市场…