【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 2

typedef 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位置删除元素

在这里插入图片描述

总结:

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

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

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

相关文章

leetcode 376. 摆动序列

2023.7.28 本题思路是定义一个 direct变量记录上一次摆动是上坡还是下坡 。 然后在一个for循环中循环判断当前摆动和上一次摆动是否一致&#xff0c;如果不一致则视为一次摆动。 如果前后元素值相等得话&#xff0c;直接continue进入下一次循环。 下面看代码&#xff1a; clas…

leaftjs实现全国温度降水气压风速等值面风场洋流效果

实现内容 数据爬取、地图marker聚合、鼠标移动显示pop&#xff0c;风场&#xff0c;洋流&#xff0c;温度等值面、降水等值面、气压等值面、风速等值面&#xff0c;洋流方向、洋流流速展示、风场方向、风场风速展示&#xff0c;后期扩展小时预报&#xff0c;分钟预报、7天预报…

Matplotlib_概述_绘制图象

⛳绘制基础 在使用 Matplotlib 绘制图形时&#xff0c;其中有两个最为常用的场景。一个是画点&#xff0c;一个是画线。 pyplot 基本方法的使用如下表所示 方法名说明title()设置图表的名称xlabel()设置 x 轴名称ylabel()设置 y 轴名称xticks(x, ticks, rotation)设置 x 轴的…

(el-radio)操作:Element-plus 中 Radio 单选框改成垂直排列的样式操作与使用

Ⅰ、Element-plus 提供的Radio单选框组件与想要目标情况的对比&#xff1a; 1、Element-plus 提供 Radio 组件情况&#xff1a; 其一、Element-ui 自提供的Radio代码情况为(示例的代码)&#xff1a; // Element-plus 自提供的代码&#xff1a; // 此时是使用了 ts 语言环境&a…

4.操作元素属性

4.1操作元素常用属性 ●通过 JS 设置/修改 标签元素属性&#xff0c;比如通过src更换图片 ●最常见的属性比如&#xff1a;href、 title、 src 等 ●语法: 对象.属性 值【示例】 // 1.获取元素 const pic document.querySelector( img ) // 2.操作元素 pic.src ./images/b…

商品库存管理系统设计与实现(Vue+SpringBoot+MySQL)

一、项目背景 当今&#xff0c;我国科技发展日新月异&#xff0c;各类企业迅速崛起&#xff0c;商品类型日益繁多&#xff0c;产品数量急剧增加&#xff0c;企业经营模式越来越多样&#xff0c;信息处理量不断加大&#xff0c;对库存管理提出了更高的要求。通过本系统&#xff…

LayUi 树形组件tree 实现懒加载模式,展开父节点时异步加载子节点数据

如题。 效果图&#xff1a; //lazy属性为true&#xff0c;点开时才加载 引用代码&#xff1a; <link href"~/Content/layui-new/css/layui.css" rel"stylesheet" /><form id"form" class"layui-form" style"margin-to…

数据库索引优化与查询优化——醍醐灌顶

索引优化与查询优化 哪些维度可以进行数据库调优 索引失效、没有充分利用到索引-一索引建立关联查询太多JOIN (设计缺陷或不得已的需求) --SQL优化服务器调优及各个参数设置 (缓冲、线程数等)–调整my.cnf数据过多–分库分表 关于数据库调优的知识点非常分散。不同的 DBMS&a…

YOLOv5:使用7.0版本训练自己的实例分割模型(车辆、行人、路标、车道线等实例分割)

YOLOv5&#xff1a;使用7.0版本训练自己的实例分割模型&#xff08;车辆、行人、路标、车道线等实例分割&#xff09; 前言前提条件相关介绍使用YOLOv5-7.0版本训练自己的实例分割模型YOLOv5项目官方源地址下载yolov5-7.0版源码解压目录结构 准备实例分割数据集在./data目录下&…

Rust vs Go:常用语法对比(七)

题图来自 Go vs Rust: Which will be the top pick in programming?[1] 121. UDP listen and read Listen UDP traffic on port p and read 1024 bytes into buffer b. 听端口p上的UDP流量&#xff0c;并将1024字节读入缓冲区b。 import ( "fmt" "net&qu…

vue+leaflet笔记之地图聚合

vueleaflet笔记之地图聚合 文章目录 vueleaflet笔记之地图聚合开发环境代码简介插件简介与安装使用简介 详细源码(Vue3) 本文介绍了Web端使用Leaflet开发库进行地图聚合查询的一种方法 (底图来源:中科星图)&#xff0c;结合Leaflet.markercluster插件能够快速的实现地图聚合查询…

数据库数据恢复-Syabse数据库存储页底层数据杂乱的数据恢复案例

数据库恢复环境&#xff1a; Sybase版本&#xff1a;SQL Anywhere 8.0。 数据库故障&#xff1a; 数据库所在的设备意外断电后&#xff0c;数据库无法启动。 错误提示&#xff1a; 使用Sybase Central连接后报错&#xff1a; 数据库故障分析&#xff1a; 经过北亚企安数据恢复…

内存函数讲解

&#x1f495;"痛苦难以避免&#xff0c;而磨难可以选择。"-->村上春树&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;数据在内存中的存储 内存函数就是管理内存数据的函数&#xff0c;包含于头文件<string.h>中 1.memcpy函数-->内存…

机器学习——异常检测

异常点检测(Outlier detection)&#xff0c;⼜称为离群点检测&#xff0c;是找出与预期对象的⾏为差异较⼤的对象的⼀个检测过程。这些被检测出的对象被称为异常点或者离群点。异常点&#xff08;outlier&#xff09;是⼀个数据对象&#xff0c;它明显不同于其他的数据对象。异…

soft ip与hard ip

ip分soft和hard两种&#xff0c;soft就是纯代码&#xff0c;买过来要自己综合自己pr。hard ip如mem和analog与工艺有关。 mem的lib和lef是memory compiler产生的&#xff0c;基于bitcell&#xff0c;是foundry给的。 我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起…

pyspark 笔记 cast 转换列的类型

1 不借助 pyspark.sql.types from pyspark.sql.functions import coldata [("Alice", "28"), ("Bob", "22"), ("Charlie", "30")] columns ["name", "age_str"] df spark.createDataFram…

第一章 计算机网络概述

第一章 计算机网络概述 1.1 计算机网络在信息时代的作用 1.2 因特网概述 网络分类&#xff1a; 网络&#xff1a;许多计算机连接在一起的的局域网&#xff1b; 互联网&#xff1a;internet许多网络连接在一起&#xff1b; 因特网&#xff1a;Internet 全球最大的互联网&…

15.Netty源码之EventLoop

highlight: arduino-light Netty配置主从Reactor模式 通过将NioServerSocketChannel绑定到了bossGroup。 将NioServerSocketChannel接收到请求创建的SocketChannel放入workerGroup。 将2个不同的SocketChannel绑定到2个不同的Group完成了主从 Reactor 模式。 分配NIOEventLoop的…

【java安全】RMI

文章目录 【java安全】RMI前言RMI的组成RMI实现Server0x01 编写一个远程接口0x02 实现该远程接口0x03 Registry注册远程对象 Client 小疑问RMI攻击 【java安全】RMI 前言 RMI全称为&#xff1a;Remote Method Invocation 远程方法调用&#xff0c;是java独立的一种机制。 RM…

Mnist分类与气温预测任务

目录 传统机器学习与深度学习的特征工程特征向量pytorch实现minist代码解析归一化损失函数计算图Mnist分类获取Mnist数据集&#xff0c;预处理&#xff0c;输出一张图像面向工具包编程使用TensorDataset和DataLoader来简化数据预处理计算验证集准确率 气温预测回归构建神经网络…