当前位置: 首页 > news >正文

【C语言数据结构】模拟·顺序表·总项目实现

在这里插入图片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

前言

我在上一篇博客中,详细讲解啦每一个函数的实现思路和代码展现,在这一篇博客中,我将像是做项目一样,去实现顺序表的总体实现。

一、项目源文件构成

该项目由三部分组成
1️⃣ 用来存放库函数,宏定义,函数申明等的一个头文件:SqList.h
2️⃣ 主函数的所在文件 test.c
3️⃣各个函数的实现,我们主要在此完成函数的代码编写:SqList.c

二、菜单

建立一个菜单是很重要的,菜单能够实现和用户的交互,以便于用户的操作。

代码如下:

void meun()
{printf("**************************************************\n");printf("*    1.顺序表尾插            2.顺序表尾删        *\n");printf("*    3.顺序表头插            4.顺序表头删        *\n");printf("*    5.顺序表的查找          6.在pos位置插入x    *\n");printf("*    7.删除pos位置的值       8.顺序表的打印      *\n");printf("*    0.退出                                      *\n");printf("**************************************************\n");
}

三、顺序表结构体

typedef int SLDataType;typedef struct SeqList
{SLDataType* array;int size;//当前存储个数int capacity;//空间大小}SL;

四、源文件展示

下面是整个项目的代码:

1.SqList.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>#define INT_SIZE 2typedef int SLDataType;typedef struct SeqList
{SLDataType* array;int size;//当前存储个数int capacity;//空间大小}SL;//顺序表的初始化
void SeqListInit(SL* ps);// 顺序表尾插
void SeqListPushBack(SL* ps, SLDataType x);// 顺序表尾删
void SeqListPopBack(SL* ps);// 顺序表头插
void SeqListPushFront(SL* p, SLDataType x);// 顺序表头删
void SeqListPopFront(SL* p);// 顺序表查找
int SeqListFind(SL* p, SLDataType x);// 顺序表在pos位置插入x
void SeqListInsert(SL* p, size_t pos, SLDataType x);// 顺序表删除pos位置的值
void SeqListErase(SL* p, size_t pos);// 顺序表销毁
void SeqListDestory(SL* p);// 顺序表打印
void SeqListPrint(SL* p);

2.SqList.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"SqList.h"
//顺序表的初始化
void SeqListInit(SL* ps)
{ps->array = (SLDataType*)malloc(sizeof(SLDataType)*4);if (ps->array == NULL){perror("malloc failed\n");exit(-1);}ps->size = 0;ps->capacity = 4;
}// 检查空间,如果满了,进行增容
int CheckCapacity(SL* ps)
{if (ps->size == ps->capacity){SLDataType* tmp = (SLDataType*)realloc(ps->array, (ps->capacity + INT_SIZE)*sizeof(SLDataType));if (tmp == NULL){perror("扩容失败!\n");return 0;}else{ps->array = tmp;ps->capacity += INT_SIZE;printf("扩容成功\n");return 1;}	}return 1;
}// 顺序表销毁
void SeqListDestory(SL* ps)
{free(ps->array);ps->array = NULL;ps->capacity = 0;ps->size = 0;
}// 顺序表尾插
void SeqListPushBack(SL* ps, SLDataType x)
{if (CheckCapacity(ps) == 0){printf("空间已满,插入失败!\n");}if (CheckCapacity(ps) == 1){ps->array[ps->size] = x;ps->size ++;}
}// 顺序表尾删
void SeqListPopBack(SL* ps)
{if (ps->size < 1){printf("已经为空,无元素可删除\n");return;}ps->array[ps->size - 1] = 0;ps->size--;
}// 顺序表头插
void SeqListPushFront(SL* ps, SLDataType x)
{//判断空间是否够。//先挪动if (CheckCapacity(ps) == 0){printf("空间已满,头插入失败!\n");}if (CheckCapacity(ps) == 1){int end = ps->size - 1;while (end>=0){ps->array[end + 1] = ps->array[end];end--;}ps->array[0] = x;ps->size++;}
}// 顺序表头删
void SeqListPopFront(SL* ps)
{int n = 1;while (n < ps->size){ps->array[n - 1] = ps->array[n];n++;}ps->size--;
}// 顺序表打印
void SeqListPrint(SL* ps)
{for (int i = 0; i < ps->size; i++){printf("%d ", ps->array[i]);}printf("\n");
}// 顺序表查找
int SeqListFind(SL* ps, SLDataType x)
{int i = 0,count=0;for (i = 0; i < ps->size - 1; i++){if (x == ps->array[i]){printf("找到啦!下标是%d\n",i);count++;return i;}}if (count == 0){printf("没找到!\n");return;}
}// 顺序表在pos位置插入x
void SeqListInsert(SL* ps, size_t pos, SLDataType x)
{assert(pos>=0&&pos<ps->size);if (CheckCapacity(ps) == 0){printf("空间已满,插入失败!\n"); }if (CheckCapacity(ps) == 1){int end = ps->size - 1 ;while (end >= pos){ps->array[end + 1] = ps->array[end];end--;}ps->array[pos] = x;ps->size++;}
}// 顺序表删除pos位置的值
void SeqListErase(SL* ps, size_t pos)
{assert(pos >= 0 && pos < ps->size);int n = pos + 1;while (n <= ps->size - 1){ps->array[n - 1] = ps->array[n];n++;}ps->size--;
}

3.test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"SqList.h"void meun()
{printf("**************************************************\n");printf("*    1.顺序表尾插            2.顺序表尾删        *\n");printf("*    3.顺序表头插            4.顺序表头删        *\n");printf("*    5.顺序表的查找          6.在pos位置插入x    *\n");printf("*    7.删除pos位置的值       8.顺序表的打印      *\n");printf("*    0.退出                                      *\n");printf("**************************************************\n");
}
int main()
{int x,pos;SL s;//初始化SeqListInit(&s);int input = 0;do{meun();printf("请输入你的选择:\n");scanf("%d", &input);switch (input){case 1:printf("请输入要尾插的值:");scanf("%d", &x);SeqListPushBack(&s, x);break;case 2:SeqListPopBack(&s);break;case 3:printf("请输入要头插的值:");scanf("%d", &x);SeqListPushFront(&s,x);break;case 4:SeqListPopFront(&s);break;case 5:printf("请输入要查找的值:");scanf("%d", &x);SeqListFind(&s,x); break;case 6:{printf("请输入要插入的位置和数据(空格分开):");scanf("%d %d", &pos,&x);SeqListInsert(&s, pos, x);break;}case 7:printf("请输入要删除的位置:");scanf("%d", &pos);SeqListErase(&s,pos); break;case 8:SeqListPrint(&s);break;case 0:SeqListDestory(&s);break;default:printf("输入有误,请重新输入:\n");}}while (input);
}

五、运行截图

1.顺序表尾插,头插展示

在这里插入图片描述

2.顺序表的头删

在这里插入图片描述

3.顺序表的尾删

在这里插入图片描述

4.顺序表的查找

在这里插入图片描述

5.在pos位置插入x

在这里插入图片描述

6.在pos位置删除元素

在这里插入图片描述

总结:

本次项目当中遇到许多之气没有注意到的问题,尤其是数组越界问题等等,在接下来学习数据结构预算法是非常重要的,🌈相信自己,踏踏实实走好每一步,梦想终会成为现实! ⛵️

相关文章:

【C语言数据结构】模拟·顺序表·总项目实现

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …...

自然语言处理从入门到应用——LangChain:模型(Models)-[文本嵌入模型Ⅰ]

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 本文将介绍如何在LangChain中使用Embedding类。Embedding类是一种与嵌入交互的类。有很多嵌入提供商&#xff0c;如&#xff1a;OpenAI、Cohere、Hugging Face等&#xff0c;这个类旨在为所有这些提供一个标准接口。 …...

使用Gradio构建生成式AI应用程序; Stability AI推出Stable Diffusion XL 1.0

&#x1f989; AI新闻 &#x1f680; Stability AI推出最先进的AI工具Stable Diffusion XL 1.0 摘要&#xff1a;Stability AI宣布推出Stable Diffusion XL 1.0&#xff0c;该版本是其迄今为止最先进的AI工具。Stable Diffusion XL 1.0提供更鲜艳、更准确的图片生成&#xff…...

Java 递归计算斐波那契数列指定位置上的数字

Java 递归计算斐波那契数列指定位置上的数字 一、原理二、代码实现三、运行结果 一、原理 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列&#xff0c;因数学家莱昂纳多斐波那契&#xff08;Leonardo Fibonacci&#xff09;以兔子繁殖为…...

ai数字人透明屏的应用场景有哪些?

AI数字人透明屏的应用场景&#xff1a; 银行、保险、售楼处等接待场景&#xff1a;AI数字人透明屏可以作为接待员&#xff0c;提供详细的信息和导航&#xff0c;提高客户体验和服务效率。 商业街、购物中心等场所&#xff1a;AI数字人透明屏可以作为导购员&#xff0c;提供商品…...

一、1、Hadoop的安装与环境配置

安装JDK&#xff1a; 首先检查Java是否已经安装&#xff1a; java -version 如果没有安装&#xff0c;点击链接https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 并选择相应系统以及位数下载&#xff08;本文选择jdk-8u381-linux-x64…...

剑指YOLOv7改进最新MPDIoU损失函数(23年7月首发论文):论文实测YOLOv7模型涨点,超越现有多种G/D/C/EIoU,高效准确的边界框回归的损失

💡本篇内容:剑指YOLOv7改进最新MPDIoU损失函数(23年7月首发论文):论文实测YOLOv7模型涨点,超越现有多种G/D/C/EIoU,高效准确的边界框回归的损失 💡🚀🚀🚀本博客 改进源代码改进 适用于 YOLOv7 按步骤操作运行改进后的代码即可 💡:重点:该专栏《剑指YOLOv7原…...

前端JavaScript面试100问(上)

1、解释一下什么是闭包 ? 闭包&#xff1a;就是能够读取外层函数内部变量的函数。闭包需要满足三个条件&#xff1a; 访问所在作用域&#xff1b;函数嵌套&#xff1b;在所在作用域外被调用 。 优点&#xff1a; 可以重复使用变量&#xff0c;并且不会造成变量污染 。缺点&am…...

C语言第九课------------------数组----------------C中之将

作者前言 作者介绍&#xff1a; 作者id&#xff1a;老秦包你会&#xff0c; 简单介绍&#xff1a; 喜欢学习C语言和python等编程语言&#xff0c;是一位爱分享的博主&#xff0c;有兴趣的小可爱可以来互讨 个人主页::小小页面 gitee页面:秦大大 一个爱分享的小博主 欢迎小可爱…...

MySQL的安装

掌握在Windows系统中安装MySQL数据库 MySQL的介绍 MySQL数据库管理系统由瑞典的DataKonsultAB公司研发&#xff0c;该公司被Sun公司收购&#xff0c;现在Sun公司又被Oracle公司收购&#xff0c;因此MySQL目前属于 Oracle 旗下产品。MySQL 软件采用了双授权政策&#xff0c;分…...

在Chrome(谷歌浏览器)中安装Vue.js devtools开发者工具及解决Vue.js not detected报错

文章目录 一、Vue.js devtools开发者工具安装1.打开谷歌浏览器——点击扩展程序——选择管理扩展程序2.先下载添加一个谷歌助手到扩展程序中&#xff08;根据提示进行永久激活&#xff09;3.点击谷歌浏览器的应用商店4.输入Vue.js devtools——搜索——选择下载 二、解决Vue.js…...

用Python实现概率矩阵分解(PMF)算法在MovieLens ml-100k数据集上构建精确的推荐系统:深入理解GroupLens数据的操作

第一部分:推荐系统的重要性以及概率矩阵分解的介绍 在如今的数字化时代,推荐系统在我们的日常生活中起着重要的作用。无论我们在哪个电商网站上购物,哪个音乐平台听歌,或者在哪个电影网站看电影,都会看到推荐系统的身影。它们根据我们的喜好和行为,向我们推荐可能喜欢的…...

WPF icon的设置

想给控件设置个圆形图片&#xff0c;代码如下&#xff1a; ​<Setter Property"Icon"><Setter.Value><Image Source"/WpfApp1;component/Resource/1.ico" Width"16" Height"16"/></Setter.Value></Setter&…...

使用frp中的xtcp映射穿透指定服务实现不依赖公网ip网速的内网穿透p2p

使用frp中的xtcp映射穿透指定服务实现不依赖公网ip网速的内网穿透p2p 管理员Ubuntu配置公网服务端frps配置service自启(可选) 配置内网服务端frpc配置service自启(可选) 使用者配置service自启(可选) 效果 通过frp实现内网client访问另外一个内网服务器 管理员 1&#xff09;…...

2023-07-28 LeetCode每日一题(并行课程 III)

2023-07-28每日一题 一、题目编号 2050. 并行课程 III二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数 n &#xff0c;表示有 n 节课&#xff0c;课程编号从 1 到 n 。同时给你一个二维整数数组 relations &#xff0c;其中 relations[j] [prevCoursej, next…...

8.11 PowerBI系列之DAX函数专题-TopN中实现N的动态

需求 实现 1 ranking by amount rankx(allselected(order_2[产品名称]),[total amount]) 2 rowshowing_boolean var v_ranking [ranking by amount] var v_topN-no [topN参数 值] var v_result int( v_ranking < v_topN_no) return v_result 3 将度量值2放入视觉对象筛…...

后端性能测试的类型

目录 性能测试的类型 负载测试(load testing) 压力测试(Stress Testing) 可扩展性测试( 尖峰测试(Spike Testing) 耐久性测试(Endurance Testing) 并发测试(Concurrency Testing) 容量测试(Capacity Testing) 资料获取方法 性能测试的类型 性能测试&#xff1a;确定软…...

关闭Tomcat的日志输出

要关闭Tomcat的日志输出&#xff0c;您可以在Tomcat的配置文件中进行相应的调整。具体地说&#xff0c;您可以通过修改logging.properties文件来关闭Tomcat的日志输出。这个文件通常位于Tomcat的conf目录下。请按照以下步骤进行&#xff1a; 打开Tomcat安装目录&#xff0c;找…...

express 路由匹配和数据获取

express配置路由只需要通过app.method(url,func)来配置&#xff0c;其中url配置和其中的参数获取方法不同 直接写全路径 路由中允许存在. get请求传入的参数 router.get("/home", (req, res) > {res.status(200).send(req.query); });通过/home?a1会收到对象…...

62 | Python 操作 PDF

文章目录 Python 操作 PDF 教程1. 安装 PyPDF22. 读取 PDF 文件3. 创建 PDF 文件4. 修改 PDF 文件练习题1. 创建一个新的 PDF 文件,其中包含两个页面。第一个页面包含一段文本和一张图片,第二个页面包含一个表格。2. 打开练习题中创建的 PDF 文件,并将第一个页面中的文本修改…...

[SQL挖掘机] - 左连接: left join

介绍: 左连接是一种多表连接方式&#xff0c;它以左侧的表为基础&#xff0c;并返回满足连接条件的匹配行以及左侧表中的所有行&#xff0c;即使右侧的表中没有匹配的行。左连接将左表的每一行与右表进行比较&#xff0c;并根据连接条件返回结果集。 左连接的工作原理如下&am…...

Android 之 使用 SoundPool 播放音效

本节引言&#xff1a; 第九章给大家带来的是Android中的多媒体开发&#xff0c;与其说是多媒体开发还不如是多媒体相关API的 的使用&#xff0c;说下实际开发中我们做了一些和多媒体搭边的东西&#xff1a;拍照&#xff0c;录音&#xff0c;播放音乐&#xff0c;播放视频... 嗯…...

防火墙的ALG、NAT、双机热备知识点详解

具体的NAT和双机热备实验请到&#xff1a;NAT与双机热备实验 目录 1、ALG 2、NAT ALG 3、NAT域间双向转换 4、NAT域内双向转换 5、双出口NAT 6、防火墙的双机热备 解决方案1&#xff1a;VGMP 6.1 双机热备份技术产生的背景&#xff1a; 6.2 VRRP在多区域防火墙组网中的…...

传染病模型

title: 传染病模型 date: 2023-7-24 10:55:00 updated: 2023-7-24 10:55:00 tags: 算法数学建模传染病模型matlab categories: 数学建模 传染病模型中的符号表示 SI模型&#xff08;艾滋传染模型&#xff09; %% 直接求微分方程的解析解 dsolve(Dx1 -0.1 * x1 * x2 / 1000, D…...

一百三十七、Hive——HQL运行报错(持续更新中)

一、timestamp字段与int字段相加 &#xff08;一&#xff09;场景 change_time字段是timestamp字段&#xff0c;代表一个红绿灯周期的开始时间&#xff08;先是绿灯、再是黄灯、最后红灯&#xff09;&#xff0c;而green是int字段&#xff0c;代表绿灯的秒数&#xff0c;现在…...

Spring Boot配置加密实践

Spring Boot配置加密实践 使用Java技术栈的时候&#xff0c;Spring Boot几乎已经成为了标配。Spring Boot帮助我们简化了各种技术的整合&#xff0c;我们只需要在application.yml配置文件中增加一点点的配置即可。 虽然Spring Boot简化了我们的工作&#xff0c;但是也隐藏了底…...

SwiftUI-基础

应用入口 Main函数与App结构体的绑定&#xff0c;遵循App协议 main struct BaseApp: App {var body: some Scene {WindowGroup {ContentView()}} } 兼容UIApplicationDelegate main struct BasicApp: App {UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate…...

vue。cli怎么使用自定义组件,会有哪些问题

在Vue CLI中使用自定义组件的步骤如下&#xff1a; 通过仔细检查以上问题并按照正确的步骤使用自定义组件&#xff0c;大多数问题都可以解决。此外&#xff0c;查看开发者工具的控制台输出和Vue警告信息&#xff0c;可以帮助你进一步调试和解决可能出现的问题 创建自定义组件&a…...

linux----vim的使用

vi和vim是Linux下的一个文本编辑工具&#xff0c;最小化安装只有vi vim&#xff0c;需要额外安装&#xff0c;比vi更强大一些 # vim 操作文件&#xff0c;有三种模式&#xff1a;普通模式&#xff0c;编辑模式&#xff0c;命令模式 -vim 文件名刚进来----》普通模式--》只…...

95. Python基础教程:异常处理try...except语句

【目录】 文章目录 1. try...except语法解析2. 程序异常3. except的4种使用方式3.1 单独的except3.2 except 异常名称3.3 except 异常类型 as 别名3.4 except (异常类型1,异常类型2) as 别名 4. 总结 【正文】 1. try…except语法解析 try[traɪ]&#xff1a;尝试。 except[…...