[数据结构]动态顺序表制作源码分享

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存 储。在数组上完成数据的增删查改。 顺序表一般可以分为:

1. 静态顺序表:使用定长数组存储元素

2. 动态顺序表:使用动态开辟的数组存储。

静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空 间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间 大小,所以下面我们实现动态顺序表

实现的接口如下

typedef struct Seqlist
{datatype* data; //动态内存首地址int sz;  //实际存储数据大小int capacity;  //数据表容量
}SL;
//顺序表初始化
void seqlist_init(SL* seqlist);
//顺序表打印
void seqlist_Print(SL* seqlist);
//动态内存空间检查
void seqlist_capacity_check(SL* seqlist);
//顺序表插入的位置
int seqlist_location(SL* seqlist);
//选定位置插入值
void seqlist_insert(SL* seqlist, int input, datatype value);
//前向插入
void seqlist_front_push(SL* seqlist,datatype value);
//后向插入
void seqlist_back_push(SL* seqlist, datatype value);
//选定位置删除值
void seqlist_erase(SL* seqlist, int input);
//前向删除
void seqlist_front_pop(SL* seqlist);
//后向删除
void seqlist_back_pop(SL* seqlist);
//搜索值
int seqlist_search(SL* seqlist,datatype value);
//修改值
void seqlist_modify(SL* seqlist,int location, datatype value);
//销毁动态内存
void seqlist_destory(SL* seqlist);

具体接口代码以及菜单代码如下

test.c文件代码

#include "SeqList.h"void menu()
{printf("*********************************\n");printf("**1.Front_ADD        2.Back_ADD**\n");printf("**3.Front_DEL        4.Back_DEL**\n");printf("**5.Modify           6.Search  **\n");printf("**7.Insert           8.DEL     **\n");printf("**9.Print            0.Exit    **\n");printf("*********************************\n");
}
enum Some_option
{Exit = 0,Front_ADD,Back_ADD,Front_DEL,Back_DEL,Modify,Search,Insert,DEL,Print
};void main()
{SL s;seqlist_init(&s);int option;datatype val;int loca;do {menu();printf("请输入:");scanf("%d", &option);switch (option){case Front_ADD:printf("请输入需要输入的值:");scanf(datainput, &val);seqlist_front_push(&s, val);break;case Back_ADD:printf("请输入需要输入的值:");scanf(datainput, &val);seqlist_back_push(&s, val);break;case Front_DEL:seqlist_front_pop(&s);break;case Back_DEL:seqlist_back_pop(&s);break;case Modify:loca = seqlist_location(&s);if(loca){printf("请输入需要修改的值:");scanf(datainput, &val);seqlist_modify(&s, loca, val);}break;case Search:printf("请输入需要搜索的值:");scanf(datainput, &val);break;case Insert:loca = seqlist_location(&s);if (loca){printf("请输入需要插入的值:");scanf(datainput, &val);seqlist_insert(&s, loca - 1, val);}break;case DEL:loca = seqlist_location(&s);if (loca){seqlist_erase(&s, loca);}break;case Print:seqlist_Print(&s);break;case Exit:seqlist_destory(&s);break;default:printf("输入错误请重新输入\n");}} while (option);return;
}

SeqList.c代码

#include "SeqList.h"void seqlist_init(SL* seqlist)
{datatype* temp = (datatype*)malloc(sizeof(datatype) * 5);if (temp == NULL){perror("seqlist_init:");return;}seqlist->data = temp;seqlist->sz = 0;seqlist->capacity = 5;
}
void seqlist_Print(const SL* seqlist)
{int start;printf("Index:");for (start = 0; start < seqlist->sz; start++){printf(datashow, start + 1);}printf("\n");printf("Value:");for (start = 0; start < seqlist->sz; start++){printf(datashow, seqlist->data[start]);}printf("\n");
}
void seqlist_capacity_check(SL* seqlist)
{if (seqlist->sz == seqlist->capacity){seqlist->capacity *= 2;datatype* temp = (datatype*)(realloc(seqlist->data,seqlist->capacity*sizeof(datatype)));if (temp == NULL){perror("realloc:");return;}seqlist->data = temp;}
}
int seqlist_location(SL* seqlist)
{int input;seqlist_Print(seqlist);do{printf("请输入位置:");scanf("%d", &input);if (input<0 || input > seqlist->sz){printf("输入越界\n");return 0;}} while (input<0 || input > seqlist->sz);return input;
}
void seqlist_insert(SL* seqlist,int input,datatype value)
{seqlist_capacity_check(seqlist);int end;for (end = seqlist->sz ; end >= input; end--){seqlist->data[end] = seqlist->data[end-1];}seqlist->data[input] = value;seqlist->sz++;
}
void seqlist_front_push(SL* seqlist,datatype value)
{seqlist_insert(seqlist, 0, value);
}
void seqlist_back_push(SL* seqlist, datatype value)
{seqlist_insert(seqlist, seqlist->sz, value);
}
void seqlist_erase(SL* seqlist, int input)
{int start;for (start = input; start < seqlist->sz; start++){seqlist->data[start - 1] = seqlist->data[start];}seqlist->sz--;
}
void seqlist_front_pop(SL* seqlist)
{seqlist_erase(seqlist, 1);
}
void seqlist_back_pop(SL* seqlist)
{seqlist_erase(seqlist, seqlist->sz);
}
int seqlist_search(const SL* seqlist, datatype value)
{int index;for (index = 0; index < seqlist->sz; index++){if (seqlist->data[index] == value){return index;}}printf("value doesn't exist");return -1;
}
void seqlist_modify(SL* seqlist, int location, datatype value)
{seqlist->data[location-1] = value;
}
void seqlist_destory(SL* seqlist)
{free(seqlist->data);seqlist->data = NULL;
}

SeqList.h代码

//顺序数据表
// 完成头删\头插\尾删\尾插\自定义位置删除插入\搜索\修改\显示
//内存采用动态内存开辟
#define _CRT_SECURE_NO_WARNINGS
#ifndef __SEQLIST__H__
#define __SEQLIST__H__
#endif
#define datatype int
#define datashow "%-3d "
#define datainput "%d"
#include <stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
typedef struct Seqlist
{datatype* data; //动态内存首地址int sz;  //实际存储数据大小int capacity;  //数据表容量
}SL;
//顺序表初始化
void seqlist_init(SL* seqlist);
//顺序表打印
void seqlist_Print(SL* seqlist);
//动态内存空间检查
void seqlist_capacity_check(SL* seqlist);
//顺序表插入的位置
int seqlist_location(SL* seqlist);
//选定位置插入值
void seqlist_insert(SL* seqlist, int input, datatype value);
//前向插入
void seqlist_front_push(SL* seqlist,datatype value);
//后向插入
void seqlist_back_push(SL* seqlist, datatype value);
//选定位置删除值
void seqlist_erase(SL* seqlist, int input);
//前向删除
void seqlist_front_pop(SL* seqlist);
//后向删除
void seqlist_back_pop(SL* seqlist);
//搜索值
int seqlist_search(SL* seqlist,datatype value);
//修改值
void seqlist_modify(SL* seqlist,int location, datatype value);
//销毁动态内存
void seqlist_destory(SL* seqlist);

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

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

相关文章

bugku-web-速度要快

发现phpsessid 从上述提示 提示发送post请求&#xff0c;并且带有参数margin 发送后发现报文头部有一个字段叫flag&#xff0c;但好像每一次flag都不一样 构建Python脚本 request requests.Session()data {margin:find, } for i in range(50):html request.post(urlhttp:/…

2024年04月在线IDE流行度最新排名

点击查看最新在线IDE流行度最新排名&#xff08;每月更新&#xff09; 2024年04月在线IDE流行度最新排名 TOP 在线IDE排名是通过分析在线ide名称在谷歌上被搜索的频率而创建的 在线IDE被搜索的次数越多&#xff0c;人们就会认为它越受欢迎。原始数据来自谷歌Trends 如果您相…

websocket多级nginx代理

在使用多层Nginx代理时&#xff0c;WebSocket的连接可能会遇到一些问题&#xff0c;因为WebSocket连接是持久化的&#xff0c;它需要Upgrade头部来确认升级到WebSocket协议。在多层代理的情况下&#xff0c;每层代理可能会修改或丢失这个Upgrade头部信息。 为了确保WebSocket能…

深度学习训练过程中,常见的关键参数和概念讲解

深度学习训练过程中的关键参数和概念对于构建、理解和优化模型至关重要。以下是一些最常见的参数和概念&#xff0c;以及它们的简要解释&#xff1a; 1. 学习率&#xff08;Learning Rate&#xff09; 学习率是优化算法中最重要的参数之一&#xff0c;它控制着权重调整的幅度…

如何借助Idea创建多模块的SpringBoot项目

目录 1.1、前言1.2、开发环境1.3、项目多模块结构1.4、新建父工程1.5、创建子模块1.6、编辑父工程的pom.xml文件 1.1、前言 springmvc项目&#xff0c;一般会把项目分成多个包:controler、service、dao、utl等&#xff0c;但是随着项目的复杂性提高&#xff0c;想复用其他一个模…

mkcert生成ssl证书+nginx部署局域网内的https服务访问问题

文章目录 mkcert生成ssl证书nginx部署局域网内的https服务访问问题1、下载mkcert查看自己的电脑是arm还是amd架构 2、安装mkcert3、测试mkcert是否安装成功4、查看CA证书存放位置5、打开windows的证书控制台6、生成自签证书,可供局域网内使用其他主机访问以下是nginx部署https服…

项目导出为jar遇到java.io.IOException: Problem reading font data

Maven项目导出为jar后运行测试&#xff0c;发现本地IDE可以运行的项目使用jar无法运行&#xff0c;出现 java.io.IOException: Problem reading font data网上搜索发现问题大都由于找不到对应的资源&#xff0c;经过最终调试问题解决&#xff0c;附代码&#xff1a; 【修改前…

阿里云效codeup如何执行github flow工作流

在阿里云效中执行 GitHub 工作流&#xff0c;实质上是在使用 Git 进行版本控制的过程中遵循 GitHub Flow 的原则。GitHub Flow 是一种简洁高效的工作流程&#xff0c;特别适用于追求快速迭代的团队。下面是在阿里云效中执行 GitHub 工作流的基本步骤&#xff1a; 1. 准备工作 …

交叉编译openssh

目录 交叉编译openssh网上资料很多,整理成了一个makefile文件,其中有一步发生错误,需要手动修改一下Makefile,还不能完全自动化编译. .PHONY:all prepare build cleanCROSS:arm-himix200-linuxCUR_DIR:$(shell pwd) OPENSSH_SRC_DIR:$(CUR_DIR)/openssh-9.7p1 OPENSSH_INSTALL_…

【ELK+Kafka+filebeat分布式日志收集】部署filebeat和Kibana(三)

filebeat下载 官网:https://www.elastic.co/cn/downloads/beats/filebeat 或者 cd /opt wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.8.1-linux-x86_64.tar.gz依次执行如下命令

idea Springboot 电影推荐系统LayUI框架开发协同过滤算法web结构java编程计算机网页

一、源码特点 springboot 电影推荐系统是一套完善的完整信息系统&#xff0c;结合mvc框架和LayUI框架完成本系统springboot dao bean 采用协同过滤算法进行推荐 &#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&…

书生·浦语大模型-第二节课笔记/作业

笔记 实验一 cli-demo import torch from transformers import AutoTokenizer, AutoModelForCausalLMmodel_name_or_path "../models"tokenizer AutoTokenizer.from_pretrained(model_name_or_path, trust_remote_codeTrue, device_mapcuda:0) model AutoModelF…

【Cadence Allegro】如何差分对走线

一、创建espice模型 shift+F2或者“Analyze-Model Assigment”创建espice模型,这个操作是为了让差分线路里的串接电阻(或电感电容)变为xnet类型方便准确等长走线。 Cadence Allegro Xnet的创建详细教程 - 知乎Cadence Allegro Xnet的创建详细教程Xnet是指在无源器件的两端,…

【Go】十四、封装、继承

文章目录 1、封装2、继承3、继承的注意点 1、封装 隐藏实现细节保证数据安全&#xff08;控制变量或方法的访问范围&#xff0c;private&#xff09; Go中实现封装&#xff1a; 结构体、字段的首字母小写&#xff08;Java的private&#xff09;提供一个工厂模式函数&#xf…

微服务管理(完整)

前言&#xff1a; 分享一篇学微服务管理的过程 一&#xff0c;etcd入门 1&#xff0c;简介 1.1&#xff0c;etcd是什么 etcd是CoreOS团队于2013年6月发起的开源项目&#xff0c;它的目标是构建一个高可用的分布式键值(key-value)数据库。 官网上的一段描述&#xff1a; A…

Tomcat调优总结(Tomcat自身优化、Linux内核优化、JVM优化)

Tomcat自身的调优是针对conf/server.xml中的几个参数的调优设置。首先是对这几个参数的含义要有深刻而清楚的理解。以tomcat8.5为例&#xff0c;讲解参数。 同时也得认识到一点&#xff0c;tomcat调优也受制于linux内核。linux内核对tcp连接也有几个参数可以调优。 因此我们可…

java数据结构与算法刷题-----LeetCode695. 岛屿的最大面积

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 深度优先遍历2. 广度优先 1. 深度优先遍历 这不是找最短路径&…

蓝桥杯刷题第七天

这道题一开始看真的有点简单&#xff0c;但一开始跟着案例先入为主了&#xff0c;误以为是只有两个项目想着穷举完n个人&#xff0c;&#xff08;n1&#xff09;*&#xff08;n2&#xff09;/2种情况但后面发现项目不止两个&#xff0c;用链表来好像我也不会&#xff0c;用二维…

linux编辑器——vim使用方法

文章目录 linux编辑器——vim使用方法1. vim的基本概念2. vim的基本操作3. vim正常模式命令集4. vim末行模式命令集5. vim操作总结6.简单vim配置7.参考资料 linux编辑器——vim使用方法 vi/vim的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是vim是vi的…

泛域名站群,泛域名程序

泛域名站群是一种利用大量类似的泛域名来建立多个网站&#xff0c;并通过这些网站链接到主网站&#xff0c;以提升主网站的排名和流量的策略。泛域名站群通常包含大量的子域名&#xff0c;这些子域名指向不同的页面&#xff0c;但它们的内容大部分是重复或相似的&#xff0c;目…