基于C语言的数据结构--顺序表讲解及代码函数实现展示

        本篇文章是数据结构的开篇,所以我们先来了解一下什么是数据结构。

什么是数据结构

        数据结构是由“数据”和“结构”两个词组合而来,自然要以两个词分别去阐述。

        首先,什么是数据?数据(data)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的原始素材。 数据可以是连续的值,比如声音、图像,称为模拟数据;也可以是离散的,如符号、文字,称为数字数据。 在计算机系统中,数据以二进制信息单元0、1的形式表示。

        什么是结构?当我们想要使用大量同一类型数据的时候,通过手动定义大量的独立的变量对程序来说可读性非常差,我们可以借助数组这样的数据结构将大量的数据组织在一起,结构也可以理解为组织数据的方式。这样的结构可以大大提高我们寻找数据的效率。

        由此我们引出数据结构的概念:数据结构是计算机储存、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。数据结构反应的是数据的内部构成,即数据由哪一部分构成,以什么方式构成,以及数据元素之间呈现的结构。

总结:
1)能够存储数据(如顺序表、链表等结构)
2)存储的数据能够⽅便查找

为什么需要数据结构

        在如今时代化的商业餐饮总是人山人海,不借助排队的方式来管理客户,会导致客户的就餐感受差、等餐时间长、餐厅营业混乱等情况。同理,程序中如果不对数据进行管理,可能导致数据丢失、操作数据困难、野指针等情况。通过数据结构,我们能够有效地将数据组织和管理在一起。按照我们的方式任意地对数据进行增删查改等操作。

        我们之前在C语言中讲到的数组就是最基础的数据结构,尽管有了数组,但是最基础的数据结构已经不能完全满足复杂算法的实现,因此慢慢发展出了数据结构。

        示例:假定数组有10个空间,已经使⽤了5个,向数组中插⼊数据步骤:求数组的⻓度,求数组的有效数据个数,向下标为数据有效个数的位置插⼊数据(注意:这⾥是否要判断数组是否满了,满了还能继续插⼊吗).....假设数据量⾮常庞⼤,频繁的获取数组有效数据个数会影响程序执⾏效率。

线性表的概念及结构

        线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中⼴泛使⽤的数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串...线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

注意:本章只讲顺序表,后续会继续讲解其他线性结构。

顺序表

        顺序表的底层结构其实就是数组,是通过对数组的封装,实现了常⽤的增删改查等接⼝。

        顺序表分为静态顺序表和动态顺序表,两者的区别在于它们的空间容量是否固定。静态顺序表使用的是定长数组储存元素,动态顺序表则是通过动态内存管理的方式对空间容量进行按需申请,因为静态顺序表存在致命缺陷(空间给少了不够用,给多了又造成空间浪费),因此我们通常使用动态顺序表。

下面我将附上函数声明和函数实现代码,测试代码请各位按自己喜好自主补充:

        注意:typedef int sqDataType的意义是方便后期更换类型时快速便捷,并且不会影响到其他无关的相同类型。

sqlist.h#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>typedef int sqDataType;
//定义结构体
typedef struct SQlist 
{sqDataType* arr;int size;int capacity;
}SQL;//初始化声明
void InitSQL(SQL* s);
//动态开辟内存声明
void Dyopen(SQL* s);
//动态扩容
void check_Dyexpand(SQL* s);
//打印函数
void SQLprint(SQL* s);
//头插函数声明
void HeadInsert(SQL* s, sqDataType num);
//尾插函数声明
void TailInsert(SQL* s, sqDataType num);
//任意位置插入的函数声明
void SQLinsert(SQL* s, int pos, sqDataType num);//头删函数声明
void HeadDelete(SQL* s);
//尾删函数声明
void TailDelete(SQL* s);
//任意位置删除的函数声明
void SQLdelete(SQL* s, int pos, sqDataType num);//查找函数声明
int SQLsearch(SQL* s, sqDataType num);
//修改函数声明
void SQLedit(SQL* s,int pos,sqDataType num);//顺序表销毁函数
void SQLdestroy(SQL* s);
sqlist.c#include "sqlist.h"//初始化
void InitSQL(SQL* s)
{s->arr = NULL;s->capacity = s->size = 0;printf("初始化完成\n");
}//动态开辟内存
void Dyopen(SQL* s)
{assert(s);sqDataType* ps = (sqDataType*)malloc(sizeof(sqDataType) * 1);if (ps == NULL){perror("malloc");return 1;}s->arr = ps;s->capacity = 1;printf("开辟成功\n");
}//动态扩容判断函数
void check_Dyexpand(SQL* s)
{assert(s);if (s->size == s->capacity){int newcapacity = (s->capacity == 0) ? 1 : (2 * s->capacity);sqDataType* ps = (sqDataType*)realloc(s->arr, sizeof(sqDataType) * newcapacity);s->capacity = newcapacity;printf("扩容成功\n");}else{printf("本次无需扩容\n");}
}//顺序表打印函数
void SQLprint(SQL* s)
{assert(s);for (int i = 0; i < s->size; i++){printf("%d ", s->arr[i]);}
}//头插函数
void HeadInsert(SQL *s,sqDataType num)
{assert(s);check_Dyexpand(&s);for (int i = s->size; i > 0; i--){s->arr[s->size] = s->arr[s->size - 1];}s->arr[0] = num;++(s->size);
}//尾插函数
void TailInsert(SQL* s,sqDataType num)
{assert(s);check_Dyexpand(&s);s->arr[s->size++] = num;
}//任意位置插入的函数
void SQLinsert(SQL* s, int pos, sqDataType num)
{assert(s);assert(pos >= 0 && pos <= s->size);check_Dyexpand(&s);for (int i = s->size - 1; i >= pos; i--){s->arr[i + 1] = s->arr[i];}s->arr[pos] = num;s->size++;printf("插入成功\n");
}//头删函数
void HeadDelete(SQL* s)
{assert(s);assert(s->size);if (s->size > 0){int i = 0;for (i = 1; i < s->size; i++){s->arr[i - 1] = s->arr[i];}--(s->size);printf("删除成功\n");}else{printf("顺序表为空,删除失败");return 1;}}//尾删函数
void TailDelete(SQL* s)
{assert(s);assert(s->size);if (s->size > 0){s->size--;printf("删除成功\n");}else{printf("顺序表为空,删除失败");return 1;}
}//任意位置删除的函数
void SQLdelete(SQL* s, int pos, sqDataType num)
{assert(s);assert(pos >= 0 && pos < s->size);//访问s->size位置是越界的check_Dyexpand(&s);for (int i = pos-1; i < s->size - 1; i++){s->arr[i] = s->arr[i + 1];}s->size--;printf("删除成功\n");
}//查找函数
int SQLsearch(SQL* s, sqDataType num)
{assert(s);for (int i = 0; i < s->size; i++){if (s->arr[i] == num){return i;}else{return -1;}}
}//修改函数
void SQLedit(SQL* s, int pos, sqDataType num)
{assert(s);assert(pos >= 0 && pos < s->size);s->arr[pos - 1] = num;printf("修改成功\n");
}//顺序表销毁函数
void SQLdestroy(SQL* s)
{if (s->arr != NULL){free(s->arr);s->arr = NULL;}s->capacity = s->size = 0;printf("销毁成功\n");
}

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

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

相关文章

golang实现定时监控 CLOSE_WAIT 连接的数量

文章目录 go实现定时检查大量的 CLOSE_WAIT 连接背景&#xff1a;为什么监控指定端口上的 CLOSE_WAIT 连接数量原因&#xff1a;什么是CLOSE_WAITgo实现定时检查大量的 CLOSE_WAIT 连接参考 go实现定时检查大量的 CLOSE_WAIT 连接 监控指定端口的连接状态&#xff0c;特别是关…

环境变量设置

环境变量具有用户属性&#xff0c;设置环境变量有四种方式 1、暂时的添加环境变量PATH_NAME&#xff1a;仅对当前进程有用&#xff0c;进程结束后自动释放 可通过export命令&#xff0c;如 export PATH_NAME/usr/local/nginx/sbin/:$PATH_NAME&#xff0c;将/usr/local/ngin…

C++中的string设计成模板的原因

查看string的文档可以发现&#xff0c;string被设计成模板&#xff0c;为什么这样设计呢&#xff1f; string文档链接&#xff1a;<string> - C Reference (cplusplus.com) 随着计算机的发展&#xff0c;出现了很多编码&#xff08;用于管理字符&#xff09;&#xff0c…

K8S容器空间不足问题分析和解决

如上图&#xff0c;今天测试环境的K8S平台出现了一个问题&#xff0c;其中的一个容器报错&#xff1a;Free disk space below threshold. Available: 3223552 bytes (threshold: 10485760B)&#xff0c;意思服务器硬盘空间不够了。这个问题怎么产生的&#xff0c;又怎么解决的呢…

十六进制颜色值对应的百分比

例如#ED242E这个颜色的30%的色值是多少? #ED242E4D 原来的色值HEX 百分比:0% HEX:00百分比:1% HEX:30百分比:2% HEX:50百分比:3% HEX:80百分比:4% HEX:A0百分比:5% HEX:D0百分比:6% HEX:F0百分比:7% HEX:12百分比:8% HEX:14百分比:9% HEX:17百分比:10% HEX:1A百分比:11% HEX:1…

力扣LCR143---子结构判定(先序递归、Java、中等题)

题目描述&#xff1a; 给定两棵二叉树 tree1 和 tree2&#xff0c;判断 tree2 是否以 tree1 的某个节点为根的子树具有 相同的结构和节点值 。 注意&#xff0c;空树 不会是以 tree1 的某个节点为根的子树具有 相同的结构和节点值 。 示例 1&#xff1a; 输入&#xff1a;tree…

抖店商家必看:“违规操作”扣除保证金2000块!这些细节要避免!

哈喽~我是电商月月 很多没经验的新手朋友开抖店都会遇到一个问题&#xff1a; 那就是开抖音小店时&#xff0c;因操作不当被扣除保证金的该怎么办&#xff1f; 实话实说&#xff0c;被判违规扣除保证金是能申诉的。但通过几率几乎是没有的 所以想要继续开店&#xff0c;只能…

蓝桥杯每日一题:日期差值(日期问题)

题目描述&#xff1a; 有两个日期&#xff0c;求两个日期之间的天数&#xff0c;如果两个日期是连续的我们规定他们之间的天数为两天。 输入格式 输入包含多组测试数据。 每组数据占两行&#xff0c;分别表示两个日期&#xff0c;形式为 YYYYMMDD。 输出格式 每组数据输出…

eclipse .project

.project <?xml version"1.0" encoding"UTF-8"?> <projectDescription> <name>scrm-web</name> <comment></comment> <projects> </projects> <buildSpec> <buil…

HarmonyOS 开发-短视频切换实现案例

介绍 短视频切换在应用开发中是一种常见场景&#xff0c;上下滑动可以切换视频&#xff0c;十分方便。本模块基于Swiper组件和Video组件实现短视频切换功能。 效果图预览 使用说明 上下滑动可以切换视频。点击屏幕暂停视频&#xff0c;再次点击继续播放。 实现思路 使用Sw…

Linux锁的使用

一、临界资源与临界区 多线程会共享例如全局变量等资源&#xff0c;我们把会被多个执行流访问的资源称为临界资源&#xff0c;我们是通过代码访问临界资源的&#xff0c;而我们访问临界资源的那部分代码称为临界区。 实现一个抢票系统 只有一个线程抢票时 #include <ios…

Docker速成:新手变专家!

Docker介绍 容器历史 1、Chroot Jail 就是常见的chroot命令的用法。它在1979年的时候就出现了&#xff0c;被认为是最早的容器化技术之一。它可以把一个进程的文件系统隔离起来。 2、The FreeBSD Jail &#xff08;监狱&#xff09;实现了操作系统级别的虚拟化&#xff0c;他…

外包干了25天,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入杭州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

Jeesite开源项目中ECharts折线图MarkPoint无法绘制问题的解决方案

Jeesite开源项目中ECharts折线图MarkPoint无法绘制问题的解决方案 在Jeesite开源项目的开发中&#xff0c;数据可视化是一个不可或缺的环节。ECharts作为一个功能强大的数据可视化库&#xff0c;在项目中经常被用来绘制各种图表。然而&#xff0c;在绘制折线图时&#xff0c;有…

【python】python的选择语句的三个题目

1.乘坐飞机时&#xff0c;有些航班没有行李额度&#xff0c;当乘客的行李小于等于20公斤时&#xff0c;按每公斤1.68元收费&#xff1b;大于20公斤时&#xff0c;按每公斤1.98元收费&#xff0c;编写程序计算收费情况&#xff08;保留两位小数&#xff09; air_bagfloat(input…

ubuntu如何限制系统日志大小?

ubuntu中的系统日志文件件如不及时清理&#xff0c;时间长了会占用硬盘的空间&#xff0c;如下所示&#xff1a; /var/log/journal/4321d62ad63d44cbbc4dff3b6e282b26/system9f5b4d5081d24b319f8b4677cf673a97-0000000000184ca6-00061412655a5a79.journal: 128M /var/log/journ…

swiftUI macOS使用webview加载外部网址

import SwiftUI import WebKitstruct ContentView: View {var body: some View {VStack {Text("测试")WebView(urlString: "https://aweb123.com").frame(maxWidth: .infinity, maxHeight: .infinity) // 让 WebView 占据整个可用空间}.frame(minWidth: 20…

欧拉回路算法

1 基本概念 1.1 欧拉路径和欧拉回路 欧拉回路&#xff1a; 在一个图中&#xff0c;由i点出发&#xff0c;将每个边遍历一次最终回到出发点i的一条路径。具有欧拉回路的图称为欧拉图。 无向图 存在欧拉回路的充要条件是所有的点的度数均为偶数 因为每个点的度数为偶数&#xf…

OpenHarmony实战:轻量系统STM32F407芯片移植案例

介绍基于STM32F407IGT6芯片在拓维信息Niobe407开发板上移植OpenHarmony LiteOS-M轻量系统&#xff0c;提供交通、工业领域开发板解决方案。 移植架构采用Board与SoC分离方案&#xff0c;使用arm gcc工具链Newlib C库&#xff0c;实现了lwip、littlefs、hdf等子系统及组件的适配…