《数据结构:C语言实现顺序表》

文章目录

    • 一、顺序表
        • 1、静态顺序表
        • 2、动态顺序表
    • 二、动态顺序表实现
        • 1、创建自定义类型
        • 2、完成顺序表的创建,测试功能需求
        • 3、完成顺序表的初始化和销毁功能
        • 4、顺序表插入数据和打印数据
        • 5、删除数据
    • 三、顺序表完成最终的代码
        • test.c文件中的代码:用来测试程序的可行性
        • sequence_list.h头文件:
        • sequence_list.c文件:

一、顺序表

顺序表是线性表的一种,是一种数据结构,用来存放n个具有相同特性的数据元素的有限序列。
顺序表的存储形式的逻辑结构是连续的,物理结构也是连续的底层是数组来完成数据的存放。

1、静态顺序表

静态顺序表的空间是固定的,数组的大小是固定的,存放数据的个数有限,所以给静态数据设置空间会往大了给,给小了不够用,但给大了会产生空间浪费。

2、动态顺序表

动态顺序表根据内存空间需要调整空间大小,很大程度上减少了空间的浪费,所以实现顺序表用动态顺序顺序的形式实现。

二、动态顺序表实现

实现动态顺序表将创建三个文件来完成:

  • 1、squence_list.h 的头文件,声明函数,定义
  • 2、sequence_list.c的源文件实现函数的功能
  • 3、test.c 的源文件用来测试顺序表的功能

在这里插入图片描述

1、创建自定义类型

创建完成就一步步实现
1、在squence_list.h的文件,首先要创建顺序表所要用到的结构体自定义类型

#pragma once
//sequence_list.h文件中#include<stdio.h>//顺序表存放数据的类型
typedef int SLDATETYPE;//顺序表的类型创建
typedef struct SequenceList
{//存放指定类型数据的指针SLDATETYPE* a;//存放数据的有效个数int count;//属性表空间大小int size;
}SL;//重命名一个简单的名字
2、完成顺序表的创建,测试功能需求

2、在test.c文件中创建一个顺序表,然后在看需要什么功能,再来实现个个对应功能的函数。

//在test.c文件中//1、首先包含头文件
#include"sequence_list.h"//3、测试函数test1的任务
void test1()
{//4、创建一个顺序表SL s;//5、顺序表没有初始化需要初始化SLInitialize(&s);//传址调用//6、最后不使用时要完成销毁SLDestroy(&s);
}//2、创建主函数
int main()
{//调用测试函数test1();return 0;
}
3、完成顺序表的初始化和销毁功能

3、根据需求需要对squence_list.h和squence_list.c的头文件完成对应的函数声明和实现

  • (1)顺序表初始化
  • (2)顺序表销毁
#pragma once
//sequence_list.h文件中
//包含检查头文件
#include<assert.h>//动态内存开辟函数对应的头文件
#include<stdlib.h>//顺序表的初始化
void SLInitialize(SL* ps);//顺序表的销毁
void SLDestroy(SL* ps);
//在squence_list.c文件中//包含头文件
#include"sequence_list.h"//顺序表的初始化
void SLInitialize(SL* ps)
{//对顺序表检查//要添加对应的<assert.h>头文件//在sequence_list.h头文件包含就可以了assert(ps != NULL);ps->a = NULL;ps->count = ps->size = 0;
}//顺序表的销毁
void SLDestroy(SL* ps)
{assert(ps != NULL);//动态内存开辟的空间要free//动态内存开辟函数要添加头文件<stdlib.h>free(ps->a);ps->a = NULL;ps->count = ps->size = 0;
}
4、顺序表插入数据和打印数据

4、继续对test.c文件进行测试
需要的功能是添加数据的函数
添加数据的方式有三种:

  • (1)末尾添加
  • (2)头部添加
  • (3)任意位置添加

需要观察数据,使用打印函数实现

//在test.c文件中//1、首先包含头文件
#include"sequence_list.h"//3、测试函数test1的任务
void test1()
{//4、创建一个顺序表SL s;//5、顺序表没有初始化需要初始化SLInitialize(&s);//传址调用//添加数据//7、尾部添加数据SLPutEnd(&s, 1);SLPutEnd(&s, 2);SLPutEnd(&s, 3);//8、打印数据SLPrint(&s);//9、头部插入SLPutFirst(&s, 5);SLPutFirst(&s, 4);SLPrint(&s);//10、任意位置前插入数据SLInsert(&s, 0, 3);SLInsert(&s, s.count-1, 6);SLInsert(&s, 1, 6);SLPrint(&s);//6、最后不使用时要完成销毁SLDestroy(&s);
}//2、创建主函数
int main()
{//调用测试函数test1();return 0;
}
//sequence_list.h文件中//判断空间是否足够
void SLEnough(SL* ps)
{//空间满了申请空间if (ps->count == ps->size){int n;n = (ps->size == 0 ? 4 : ps->size * 2);SLDATETYPE* tmp = (SLDATETYPE*)realloc(ps->a,n * sizeof(SLDATETYPE));if (tmp == NULL){//开辟失败退出exit(1);}ps->a = tmp;tmp = NULL;ps->size = n;}
}

//顺序表末尾放置数据
void SLPutEnd(SL* ps, SLDATETYPE x)
{assert(ps != NULL);//判断空间是否足够容纳数据SLEnough(ps);ps->a[ps->count++] = x;
}//打印顺序表中的数据
void SLPrint(SL* ps)
{assert(ps != NULL);int i = 0;for (i = 0; i < ps->count; i++){printf("%d", ps->a[i]);}printf("\n");
}//顺序表头部插入数据
void SLPutFirst(SL* ps, SLDATETYPE x)
{assert(ps != NULL);SLEnough(ps);for (int i = ps->count; i > 0; i--){ps->a[i] = ps->a[i - 1];}ps->a[0] = x;ps->count++;
}//顺序表任意位置前插入数据
void SLInsert(SL* ps, int pos, SLDATETYPE x)
{assert(ps != NULL);assert(pos >= 0 && pos <= ps->count);SLEnough(ps);for (int i = ps->count; i > pos; i--){ps->a[i] = ps->a[i - 1];}ps->a[pos] = x;ps->count++;
}
5、删除数据

(1)尾部删除
(2)头部删除
(3)任意位置删除
(4)寻找对应数据下标

三、顺序表完成最终的代码

test.c文件中的代码:用来测试程序的可行性
//在test.c文件中//1、首先包含头文件
#include"sequence_list.h"//3、测试函数test1的任务
void test1()
{//4、创建一个顺序表SL s;//5、顺序表没有初始化需要初始化SLInitialize(&s);//传址调用//添加数据//7、尾部添加数据SLPutEnd(&s, 1);SLPutEnd(&s, 2);SLPutEnd(&s, 3);//8、打印数据//SLPrint(&s);//9、头部插入SLPutFirst(&s, 4);//SLPrint(&s);//10、任意位置前插入数据SLInsert(&s, 0, 5);SLInsert(&s, 0, 6);SLPrint(&s);//11、尾部删除数据SLDeleteEnd(&s);//l2、头部删除数据SLDeleteFirst(&s);//13、任意位置删除数据SLDelete(&s, 0);SLPrint(&s);//14、查找数据对应下标int ret=SLFind(&s, 6);if (ret >= 0){printf("找到了,下标为%d\n",ret);}elseprintf("没有找到");//6、最后不使用时要完成销毁SLDestroy(&s);
}//2、创建主函数
int main()
{//调用测试函数test1();return 0;
}
sequence_list.h头文件:
#pragma once
//sequence_list.h文件中#include<stdio.h>//包含检查头文件
#include<assert.h>//动态内存开辟函数对应的头文件
#include<stdlib.h>//顺序表存放数据的类型
typedef int SLDATETYPE;//顺序表的类型创建
typedef struct SequenceList
{//存放指定类型数据的指针SLDATETYPE* a;//存放数据的有效个数int count;//属性表空间大小int size;
}SL;//重命名一个简单的名字//顺序表的初始化
void SLInitialize(SL* ps);//顺序表的销毁
void SLDestroy(SL* ps);//判断空间是否足够
void SLEnough(SL* ps);//顺序表末尾放置数据
void SLPutEnd(SL* ps, SLDATETYPE x);//打印顺序表中的数据
void SLPrint(SL* ps);//顺序表头部插入数据
void SLPutFirst(SL* ps, SLDATETYPE x);//顺序表任意位置前插入数据
void SLInsert(SL* ps, int pos, SLDATETYPE x);//顺序表尾删
void SLDeleteEnd(SL* ps);//顺序表头删
void SLDeleteFirst(SL* ps);//顺序表任意位置删除数据
void SLDelete(SL* ps, int pos);//顺序表中寻找对应数据下标
int SLFind(SL* ps, SLDATETYPE x);
sequence_list.c文件:
#define _CRT_SECURE_NO_WARNINGS 1//在squence_list.c文件中//包含头文件
#include"sequence_list.h"//顺序表的初始化
void SLInitialize(SL* ps)
{//对顺序表检查//要添加对应的<assert.h>头文件//在sequence_list.h头文件包含就可以了assert(ps != NULL);ps->a = NULL;ps->count = ps->size = 0;
}//顺序表的销毁
void SLDestroy(SL* ps)
{assert(ps != NULL);//动态内存开辟的空间要free//动态内存开辟函数要添加头文件<stdlib.h>free(ps->a);ps->a = NULL;ps->count = ps->size = 0;
}//判断空间是否足够
void SLEnough(SL* ps)
{//空间满了申请空间if (ps->count == ps->size){int n;n = (ps->size == 0 ? 4 : ps->size * 2);SLDATETYPE* tmp = (SLDATETYPE*)realloc(ps->a,n * sizeof(SLDATETYPE));if (tmp == NULL){//开辟失败退出exit(1);}ps->a = tmp;tmp = NULL;ps->size = n;}
}//顺序表末尾放置数据
void SLPutEnd(SL* ps, SLDATETYPE x)
{assert(ps != NULL);//判断空间是否足够容纳数据SLEnough(ps);ps->a[ps->count++] = x;
}//打印顺序表中的数据
void SLPrint(SL* ps)
{assert(ps != NULL);int i = 0;for (i = 0; i < ps->count; i++){printf("%d", ps->a[i]);}printf("\n");
}//顺序表头部插入数据
void SLPutFirst(SL* ps, SLDATETYPE x)
{assert(ps != NULL);SLEnough(ps);for (int i = ps->count; i > 0; i--){ps->a[i] = ps->a[i - 1];}ps->a[0] = x;ps->count++;
}//顺序表任意位置前插入数据
void SLInsert(SL* ps, int pos, SLDATETYPE x)
{assert(ps != NULL);assert(pos >= 0 && pos <= ps->count);SLEnough(ps);for (int i = ps->count; i > pos; i--){ps->a[i] = ps->a[i - 1];}ps->a[pos] = x;ps->count++;
}//顺序表尾删
void SLDeleteEnd(SL* ps)
{assert(ps != NULL);if (ps->count == 0){printf("数据已经删完了\n");}else{ps->count--;printf("删除成功\n");}
}//顺序表头删
void SLDeleteFirst(SL* ps)
{assert(ps != NULL);if (ps->count == 0){printf("数据已经删完了\n");}else{for (int i = 0; i < ps->count - 1; i++){ps->a[i] = ps->a[i + 1];}ps->count--;printf("删除成功\n");}
}//顺序表任意位置删除数据
void SLDelete(SL* ps, int pos)
{assert(ps != NULL);assert(pos >= 0 && pos <= ps->count);if (ps->count == 0){printf("数据已经删完了\n");}else{for (int i = pos; i < ps->count - 1; i++){ps->a[i] = ps->a[i + 1];}ps->count--;printf("删除成功\n");}
}//顺序表中寻找对应数据下标
int SLFind(SL* ps, SLDATETYPE x)
{assert(ps != NULL&&ps->a != NULL);for (int i = 0; i < ps->count; i++){if (ps->a[i] == x){return 1;}}return -1;
}

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

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

相关文章

新手教学系列——MongoDB聚合查询的进阶用法

引言 MongoDB的聚合查询是其最强大的功能之一。无论是汇总、平均值、计数等标准操作,还是处理复杂的数据集合,MongoDB的聚合框架都能提供高效且灵活的解决方案。本文将通过几个实例,详细讲解如何在实际项目中使用MongoDB进行聚合查询。 标准应用:汇总、平均值、计数等 在…

k8s集群部署mysql8主备

一、搜索mysql8版本 # helm search repo mysql# helm pull bitnami/mysql --version:11.1.2# tar -zxf mysql-11.1.2.tgz# cd mysql 二、修改value.ysqml文件 动态存储类自己提前搭建。 # helm install mysql8 -n mysql-cluster ./ -f values.yaml NAME: mysql8 LAST DEPLOYED…

Neo4j安装

下载地址&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 1.安装jdk&#xff0c;Neo4j 3.0需要jdk8&#xff0c;2.3.0之前的版本建议jdk7。Neo4j最新版本5.21.2&#xff0c;对应jdk版本17 2.将下载的zip文件解压到合适路径。 3.设置环境变量NEO4J_H…

【机器学习】朴素贝叶斯算法详解与实战扩展

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 引言 朴素贝叶斯算法是一种基于概率统计的分类方法&#xff0c;它利用贝叶斯定理和特征条件独立假设来预测样本的类别。尽管其假设特征之间相互独立在现实中往往不成立&#xff0c;但朴素贝叶斯分类器因其计算…

卤味江湖中,周黑鸭究竟该抓住什么赛点?

近年来&#xff0c;卤味江湖的决斗从未停止。 随着休闲卤味、佐餐卤味等细分赛道逐渐形成&#xff0c;“卤味三巨头”&#xff08;周黑鸭、绝味食品、煌上煌&#xff09;的牌桌上有了更多新对手&#xff0c;赛道变挤了&#xff0c;“周黑鸭们”也到了转型关键期。 这个夏天&a…

linux系统操作/基本命令/vim/权限修改/用户建立

Linux的目录结构&#xff1a; 一&#xff1a;在Linux系统中&#xff0c;路径之间的层级关系&#xff0c;使用:/来表示 注意:1、开头的/表示根目录 2、后面的/表示层级关系 二&#xff1a;在windows系统中&#xff0c;路径之间的层级关系&#xff0c;使用:\来表示 注意:1、D:表示…

【web前端HTML+CSS+JS】--- JS学习笔记03

一、JS介绍 可以在前端页面上进行逻辑处理&#xff0c;来解决表单的验证等问题&#xff0c;提升效率&#xff0c;直接在前端提示问题&#xff0c;减少服务器压力 应用1&#xff1a;可以做静态验证和动态验证&#xff08;进行异步请求&#xff09; 应用2&#xff1a;可以解析后…

Postgresql - 用户权限数据库

1、综述 在实际的软件项目开发过程中&#xff0c;用户权限控制可以说是所有运营系统中必不可少的一个重点功能&#xff0c;根据业务的复杂度&#xff0c;设计的时候可深可浅&#xff0c;但无论怎么变化&#xff0c;设计的思路基本都是围绕着用户、部门、角色、菜单这几个部分展…

电脑数据恢复篇:如何从电脑中恢复已删除的照片

按下 Shift Delete 后后悔了&#xff1f;想要恢复已删除的照片&#xff1f;好吧&#xff0c;如果是这样的话&#xff0c;你来对地方了。在本文中&#xff0c;我们将讨论如何从 PC 中恢复已删除的文件。 自从摄影的概念被提出以来&#xff0c;人们就对它着迷。以前&#xff0c…

【SQL】DML、DDL、ROLLBACK 、COMMIT详解

DML DML&#xff08;Data Manipulation Language&#xff09;数据操作语言&#xff0c;是用于对数据库中的数据进行基本操作的一种编程语言。DML是数据库管理系统&#xff08;DBMS&#xff09;中的一个重要部分&#xff0c;它允许用户或应用程序对数据库中的数据进行增、删、改…

【鸿蒙学习笔记】文件管理

官方文档&#xff1a;Core File Kit简介 目录标题 文件分类什么是应用沙箱&#xff1f; 文件分类 应用文件&#xff0c;比如应用的安装包&#xff0c;自己的资源文件等。用户文件&#xff0c;比如用户自己的照片&#xff0c;录制的音视频等。 什么是应用沙箱&#xff1f; 应…

Socks5代理为何比HTTP代理快?

在网络世界中&#xff0c;代理服务器扮演着重要的角色&#xff0c;它们能够帮助我们访问被限制的网站、提高网络安全性以及优化网络性能。其中&#xff0c;Socks5代理和HTTP代理是两种常见的代理类型。然而&#xff0c;很多用户发现&#xff0c;相较于HTTP代理&#xff0c;Sock…

ctfshow-web入门-文件上传(web164、web165)图片二次渲染绕过

web164 和 web165 的利用点都是二次渲染&#xff0c;一个是 png&#xff0c;一个是 jpg 目录 1、web164 2、web165 二次渲染&#xff1a; 网站服务器会对上传的图片进行二次处理&#xff0c;对文件内容进行替换更新&#xff0c;根据原有图片生成一个新的图片&#xff0c;这样…

3D互动+AR试戴,赋能珠宝品牌线上营销!

随着电商浪潮的汹涌而至&#xff0c;珠宝这一传统上依赖实体店铺销售的行业&#xff0c;正积极拥抱线上转型的浪潮。然而&#xff0c;面对珠宝商品高客单价及消费者对于亲身体验的强烈需求&#xff0c;线上销售面临诸多挑战&#xff0c;尤其是图片展示难以全面展现珠宝魅力&…

Git 操作总结

1. 安装、Git 环境配置 1.1 安装 Git 官方版本可以在 Git 官方网站下载&#xff1a;打开 https://git-scm.com/download/win&#xff0c;选择相应版本即可。 Git 安装完成后&#xff0c;可以在开始菜单中看到 Git 的三个启动图标&#xff08;Git Bash、Git CMD、Git GUI&…

交叉熵损失函数的使用目的(很肤浅的理解)

第一种使用方法 import torch from torch import nn # Example of target with class indices loss nn.CrossEntropyLoss() input torch.randn(3, 5, requires_gradTrue) target torch.empty(3, dtypetorch.long).random_(5) output loss(input, target) output.backward(…

keepalived高可用集群

一、keepalived&#xff1a; 1.keepalive是lvs集群中的高可用架构&#xff0c;只是针对调度器的高可用&#xff0c;基于vrrp来实现调度器的主和备&#xff0c;也就是高可用的HA架构&#xff1b;设置一台主调度器和一台备调度器&#xff0c;在主调度器正常工作的时候&#xff0…

阿里云操作系统智能助手OS Copilot实验测评报告

阿里云操作系统智能助手OS Copilot产品说明 阿里云操作系统智能助手 OS copilot 是一款基于云原生技术的操作系统&#xff0c;具有智能化、自动化和可扩展性等特点。它可以帮助用户快速构建、部署和管理云上应用&#xff0c;提高运维效率和系统稳定性。OS copilot 支持多种主流…

【踩坑】解决undetected-chromedriver报错cannot connect to-chrome

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 更新&#xff1a; 发现一个非常好用的项目&#xff0c;直接内置uc&#xff1a; GitHub - seleniumbase/SeleniumBase: &#x1f4ca; Pythons all-in…

int类型变量表示范围的计算原理

文章目录 1. 了解2. 为什么通常情况下int类型整数的取值范围是-2147483648 ~ 21474836473. int类型究竟占几个字节4. 推荐 1. 了解 通常情况下int类型变量占4个字节&#xff0c;1个字节有8位&#xff0c;每位都有0和1两种状态&#xff0c;所以int类型变量一共可以表示 2^32 种状…