数据结构(学习)2024.8.6(顺序表)

news2024/11/13 17:58:49

        今天开始学习数据结构的相关知识,大概分为了解数据结构、算法;学习线性表:顺序表、链表、栈、队列的相关知识和树:二叉树、遍历、创建,查询方法、排序方式等。

目录

一、数据结构

数据

逻辑结构

1.线性结构

2.树形结构

3.图状结构

存储结构

1.顺序存储结构

2.链式存储结构

3.索引存储结构

4.散列存储

操作(数据的运算)

二、算法

算法与程序

算法与数据结构

算法的特性

判断算法好坏的标准

时间复杂度

计算大O的方法 

空间复杂度

算法占用的存储空间包括

三、线性表

顺序表

特点

函数名命名规则

顺序表的相关操作案例

顺序表总结

一、数据结构

        数据的逻辑结构、存储结构及操作(数据运算)

数据

数据:不再是单一的数值,而是类似于集合的概念  
数据元素:是数据的基本单位,由若干个数据项组成 
数据项:是数据的最小单位,描述数据元素信息     

节点:就是数据元素

逻辑结构

        逻辑结构:元素与元素之间的关系

1.线性结构

线性关系 -------> 线性结构 -------> 一对一 -------> 线性表:顺序表、链表、栈、队列

2.树形结构

层次关系 -------> 树形结构 -------> 一对多 -------> 树

3.图状结构

网状关系 -------> 图状结构 -------> 多对多 -------> 图

存储结构

        存储结构:数据的逻辑结构在计算机中的具体实现    

1.顺序存储结构

        数组:在内存当中一段连续的内存空间中保存数据(如c语言中的一维数组) 

2.链式存储结构

        特点:数据在内存中是不连续的,通过指针进行连接

链表结构体:
struct  node_t
{
    int data;        //数据域
    struct  node_t *next;        //指针域, 指向自身结构体类型的指针
};

3.索引存储结构

        提高查找速度                    

        索引表  +    数据文件 
        姓氏 + 地址  名字 + 电话号码 

4.散列存储

        数据在存储的时候与关键码之间存在某种对应关系            

        按照对应关系存取

操作(数据的运算)

        增、删、改、查

二、算法

        解决问题的思想方法

算法与程序

        程序:用计算机语言对算法的具体实现

算法与数据结构

        算法 + 数据结构 = 程序

算法的设计:取决于选定的逻辑结构
算法的实现:依赖于采用的存储结构(顺序存储、链式存储)

算法的特性

1.有穷性         //算法的执行步骤是有限的
2.确定性         //每一个步骤都有明确含义,无二义性
3.可行性         //能够在有限的时间内完成
4.输入

5.输出

判断算法好坏的标准

正确性        //保证算法可以正确的实现想要的功能

易读性        //容易被解读

健壮性        //要有容错处理

高效性        //可执行语句重复的次数(时间复杂度)

低存储性        //占用空间越少越好

时间复杂度

        算法的可重复执行语句执行的次数

        通常时间复杂度用一个问题规模函数来表达    

        T(n) = O(f(n))

T(n)        //问题规模的时间函数
n        //问题规模,输入量的大小
O        //时间数量级
f(n)        //算法的可执行语句重复执行的次数  用问题规模n的某个函数f(n)来表达

计算大O的方法 

(1)根据问题规模n写出表达式 f(n)
(2)只保留最高项,其它项舍去
(3)如果最高项系数不为1,除以最高项系数
(4)如果有常数项,将其置为1 //当f(n)的表达式中只有常数项的时候时有意义的

例如:如果f(n)=8        则O(f(n))----->O(1)

           如果f(n) = 3*n^5 + 2*n^3 + 6*n^6 + 10        则O(f(n))----->O(n^6)

空间复杂度

        算法占用的空间大小。一般将算法的辅助空间作为衡量空间复杂度的标准。

算法占用的存储空间包括

1.输入输出数据所占空间
2.算法本身所占空间
3.额外需要的辅助空间

三、线性表

顺序表、单向链表、单向循环链表、顺序栈、链式栈、循环队列、链式队列、双向链表、双向循环链表

逻辑结构:线性结构
存储结构:顺序、链式
特点:一对一、每一个节点最多有一个前驱和一个后继,首节点无前驱,尾节点无后继

顺序表

特点

        内存连续(数组)

1.逻辑结构:线性结构
2.存储结构:顺序存储
3.操作:增删改查

函数名命名规则

下滑线法:create_empty_seqlist
小驼峰法:createEmptySeqList
大驼峰法:CreateEmptySeqList

顺序表的相关操作案例

头文件seqlist.h:

#ifndef _SEQLIST_H__
#define _SEQLIST_H__
#include <stdio.h>
#include <stdlib.h>
#define N 5
typedef struct seq
{
    int data[N];
    int last;
} seqlist_t;

// 1.创建一个空的顺序表
seqlist_t *CreateEpSeqlist(); // 返回的是申请空间的首地址
// 2.向顺序表的指定位置插入数据
int InsertIntoSeqlist(seqlist_t *p, int post, int data); // post第几个位置,data插入的数据
// 3.遍历顺序表sequence 顺序 list 表
void ShowSeqlist(seqlist_t *p);
// 4.判断顺序表是否为满,满返回1 未满返回0
int IsFullSeqlist(seqlist_t *p);
// 5.判断顺序表是否为空
int IsEpSeqlist(seqlist_t *p);
// 6.删除顺序表中指定位置的数据post删除位置
int DeletePostSeqlist(seqlist_t *p, int post);
// 7.清空顺序表
void ClearSeqList(seqlist_t *p);
// 8.修改指定位置的数据
int ChangePostSeqList(seqlist_t *p, int post, int data); // post被修改的位置,data修改成的数据
// 9.查找指定数据出现的位置
int SearchDataSeqList(seqlist_t *p, int data); // data代表被查找的数据

#endif

顺序表函数seqlist.c:

#include "seqlist.h"
// 1.创建一个空的顺序表
seqlist_t *CreateEpSeqlist() // 返回的是申请空间的首地址
{
    // 1.动态申请一个结构体大小的空间
    seqlist_t *p = (seqlist_t *)malloc(sizeof(seqlist_t));
    if (p == NULL)
    {
        perror("CreateEpSeqlist函数出错");
        return NULL;
    }

    // 2.对last初始化
    p->last = -1; // 表示当前数组为空,有效元素个数为0
    return p;
}

// 2.向顺序表的指定位置插入数据
int InsertIntoSeqlist(seqlist_t *p, int post, int data) // post第几个位置,data插入的数据
{
    // 0.容错判断
    if (post > (p->last + 1) || post < 0 || IsFullSeqlist(p) == 1)
    {
        perror("InsertIntoSeqlist函数出错");
        return -1;
    }

    // 1.将last--->post位置整体向后移动一个单位
    for (int i = p->last; i >= post; i--)
    {
        p->data[i + 1] = p->data[i];
    }

    // 2.将数据插入顺序表
    p->data[post] = data;

    // 3.最后一个有效元素下标++
    p->last++;
    return 0;
}

// 3.遍历顺序表sequence 顺序 list 表
void ShowSeqlist(seqlist_t *p)
{
    for (int i = 0; i <= p->last; i++)
    {
        printf("%d ", p->data[i]);
    }
    printf("\n");
}

// 4.判断顺序表是否为满,满返回1 未满返回0
int IsFullSeqlist(seqlist_t *p)
{
    return p->last == N - 1;
}

// 5.判断顺序表是否为空
int IsEpSeqlist(seqlist_t *p)
{
    return p->last == -1;
}

// 6.删除顺序表中指定位置的数据post删除位置
int DeletePostSeqlist(seqlist_t *p, int post)
{
    // 0.容错判断
    if (post >= p->last + 1 || post < 0 || IsEpSeqlist(p))
    {
        perror("DeletePostSeqlist函数出错");
        return -1;
    }

    // 1.将post+1--->last位置整体向前移动一个单位
    for (int i = post + 1; i <= p->last; i++)
    {
        p->data[i - 1] = p->data[i];
    }
    // 2.最后一个有效元素下标--
    p->last--;
    return 0;
}

// 7.清空顺序表
void ClearSeqList(seqlist_t *p)
{
    p->last = -1;
}

// 8.修改指定位置的数据
int ChangePostSeqList(seqlist_t *p, int post, int data) // post被修改的位置,data修改成的数据
{
    if (post >= (p->last + 1) || post < 0 || IsEpSeqlist(p))
    {
        perror("ChangePostSeqList函数出错");
        return -1;
    }
    p->data[post] = data;
    return 0;
}

// 9.查找指定数据出现的位置
int SearchDataSeqList(seqlist_t *p, int data) // data代表被查找的数据
{
    int n = -1; // 初始化为-1,表示未找到该数据
    for (int i = 0; i <= p->last; i++)
    {
        if (data == p->data[i])
        {
            n = i; // 找到数据,记录下标
            printf("该数据的下标为:%d\n", n);
            break; // 找到即可跳出循环
        }
    }
    if (n == -1)
    {
        printf("数组没有该数据\n");
    }
    return 0;
}

主函数:main.c:

#include "seqlist.h"
int main()
{
    seqlist_t *s = CreateEpSeqlist();
    InsertIntoSeqlist(s, 0, 1);
    InsertIntoSeqlist(s, 1, 2);
    InsertIntoSeqlist(s, 2, 3);
    InsertIntoSeqlist(s, 3, 4);
    printf("原始数组为:\n");
    ShowSeqlist(s);

    int post;
    int data;

    printf("请输入你要插入的位置和数据\n");
    scanf("%d %d", &post, &data);
    InsertIntoSeqlist(s, post, data);
    printf("插入以后的数组为:\n");
    ShowSeqlist(s);

    printf("请输入你要删除的位置\n");
    scanf("%d", &post);
    DeletePostSeqlist(s, post);
    printf("删除以后的数组为:\n");
    ShowSeqlist(s);

    printf("请输入你要修改的位置和数据\n");
    scanf("%d %d", &post, &data);
    ChangePostSeqList(s, post, data);
    printf("修改以后的数组为:\n");
    ShowSeqlist(s);

    printf("请输入你要查找的数据\n");
    scanf("%d", &post);
    SearchDataSeqList(s, post);

    printf("清空数据表\n");
    ClearSeqList(s);
    printf("清空以后的数据表为:\n");
    ShowSeqlist(s);
    printf("释放*s的空间\n");
    free(s);

    return 0;
}

makefile:

CC=gcc
CFLAGS=-c -g -Wall
OBJS=main.o seqlist.o
 
seqlist:$(OBJS)
	$(CC) $^ -o $@
%.o:%.c
	$(CC) $(CFLAGS) $< -o $@
 
.PHONY:clean
clean:
	$(RM) *.o seqlist

顺序表总结

1.顺序表在内存中是连续存储的

2.顺序表的长度是固定的

3.顺序表查找和修改数据操作比较方便,插入和删除操作比较麻烦

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

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

相关文章

土压力计的基本工作原理:振弦式土压力计的奥秘

在土木工程、地质勘探及地下结构工程中&#xff0c;土压力计作为一种重要的监测设备&#xff0c;扮演着至关重要的角色。它能够实时、准确地测量土体内部的压力变化&#xff0c;为工程的安全性和稳定性提供可靠的数据支持。其中&#xff0c;振弦式土压力计以其高精度、稳定性好…

20-导线及NetLabel的添加

1.放置电气导线&#xff1a;ctrlw 2.放置网络标签

FCBFormer复现

表1 Kvasir-SEG复现结果&#xff1a;mDice&#xff1a;0.93846&#xff0c;mIoU&#xff1a;0.890299&#xff0c;mPrec.&#xff1a;0.945872&#xff0c;mRec.&#xff1a;0.940086 CVC-ClinicDB复现结果&#xff1a;mDice&#xff1a;0.946874&#xff0c;mIoU&#xff1a;0…

【Math.NET】使用Fit.Polynomial多项式拟合(直线、抛物线)的示例代码与示意图

介绍 Math.NET是一个开源项目&#xff1a;https://www.mathdotnet.com/&#xff0c;旨在构建和维护涵盖基础数学的工具箱&#xff0c;以满足 .NET开发人员的高级需求和日常需求。 关于Math.NET用法的参考博客&#xff1a; https://www.cnblogs.com/dino623/p/curve_fitting_a…

Canvas-Editor 基于canvas/svg的富文本编辑器

前言 哎&#xff0c;最近逛论坛&#xff0c;看的文章&#xff0c;真是水的一批&#xff0c;且不说水平咋样&#xff0c;有些结论、方法都是错的&#xff0c;不符合前端模块化、工程化规范&#xff0c;自己写写demo&#xff0c;觉得成功了&#xff0c;恨不得马上分享写博客&…

我的JavaScript异常监控策略:保护前端应用免受错误的困扰!

在上一篇文章如何及时发现网页的隐形错误中我们讲了&#xff0c;前端有哪些常见的异常&#xff0c;以及如今监控获取这些异常的方法&#xff0c;今天我们就来讲讲我是如何来监控我的JavaScript异常的。 背景 浏览器侧的异常分为两种类型 JavaScript 错误&#xff0c;一般来自…

为什么在网页编辑文字时键盘输入换行要停顿一下 网页才显示

事情的起因&#xff1a; 不知道从什么时候开始&#xff0c;在浏览器上编辑文字时&#xff0c;换行操作总是延迟响应&#xff0c;但点击空格网页响应速度正常。时间长了也习惯了&#xff0c;可能觉得本来就是这样吧&#xff0c;网页编辑可能不稳定&#xff0c;加上自己使用的是蓝…

结构体structure、共用体union

结构体 结构体类型——用来描述复杂数据的一种数据类型 构造类型&#xff08;用户自定义类型&#xff09; struct 结构体类型名 { 成员列表; }; struct关键字&#xff1a;表明是在构造一个结构体的类型 结构体名&#xff1a;用来描述结构体这个类型的一个名称 成员列表&…

JavaWeb系列十一: Web 开发会话技术Session

Web 开发会话技术Session Session有什么用session基本原理session原理示意图session可以做什么如何理解Session Session常用方法Session底层实现机制原理分析图应用实例session实现原理动画 Session生命周期Session生命周期说明Session生命周期实例 作业布置 Session有什么用 …

8.9 C++

1.思维导图 2. 搭建一个货币的场景&#xff0c;创建一个名为 RMB 的类&#xff0c;该类具有整型私有成员变量 yuan&#xff08;元&#xff09;、jiao&#xff08;角&#xff09;和 fen&#xff08;分&#xff09;&#xff0c;并且具有以下功能&#xff1a; (1)重载算术运算符…

书生大模型实战营第三期_L2-LMDeploy 量化部署进阶实践(81班1101作业)

大模型的痛点 大模型的计算量是非常大的 2. 显存的相应区域是非常大的 3.访存瓶颈 GPU的大部分时间都花在数据交换上面不断拉高batchsize&#xff0c;不断地提高计算的访存比是不是会有较好的效果呢&#xff1f;这是一个很好的想法&#xff0c;但是显存不够就会很尴尬为了能…

【youcans动手学模型】YOLO5 实战(中)训练目标检测模型

欢迎关注『youcans动手学模型』系列 本专栏内容和资源同步到 GitHub/youcans YOLO5 实战 &#xff08;上&#xff09;环境配置与测试 【youcans动手学模型】YOLO5 实战&#xff08;中&#xff09;使用自己的数据集训练目标检测模型 1. 准备训练数据集1.1 开源数据集1.2 YOLOv5 …

k8s1.18.0完整部署教程

k8s的官网地址&#xff1a;https://kubernetes.io/docs Kubernetes 也称为 K8s&#xff0c;是一个开源系统&#xff0c;用于自动化容器化应用程序的部署、扩展和管理。 K8s通过各种资源对象来管理pod相关的功能&#xff0c;借助pod本身的功能实现大规模容器应用的自动化管理&…

享界S9+问界M9,华为智选车的高端局

作者 |老缅 编辑 |德新 8月6日&#xff0c;鸿蒙智行在北京发布D级纯电旗舰轿车&#xff0c;也是北汽 - 华为智选车合作的第一款车型&#xff0c;享界S9。 享界S9搭载了包括华为乾崑ADS 3.0在内的多项首发技术&#xff0c;全系标配100kWh华为800V巨鲸电池。 而在价格上&#…

mysql⑥:约束

一&#xff0c;概念 例子&#xff1a; 外键约束 例子&#xff1a; 外键的删除和更新

从商业角度分析,充电桩还能赚钱吗?

一、投入与产出 1、投入 是建设成本&#xff0c;包括设备&#xff08;箱变、充电设备、电缆等&#xff09;、土建和配套&#xff08;雨棚、照明、监控等&#xff09;。二是运营成本&#xff0c;包括租金、人工、电损等。 2、产出 充电手续费以及增值服务&#xff08;停车费…

力扣高频SQL 50题(基础版)第三十八题之1484.按日期分组销售产品

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第三十八题1484.按日期分组销售产品题目说明实现过程准备数据实现方式结果截图总结 力扣高频SQL 50题&#xff08;基础版&#xff09;第三十八题 1484.按日期分组销售产品 题目说明 表 Activities&#xff1a; ---…

shell的条件测试

为了能够正确处理Shell程序运行过程中遇到的各种情况&#xff0c;Linux Shell提供了一组测试运算符。 通过这些运算符&#xff0c;Shell程序能够判断某种或者几个条件是否成立。 条件测试在各种流程控制语句&#xff0c;例如判断语句和循环语句中发挥了重要的作用&#xff0c;所…

算法训练.

一.扩散 题解&#xff1a; 计算点之间的距离&#xff0c;然后对图进行处理即可&#xff0c;这个数据规模较小&#xff0c;因此我使用了floyd,还有最小生成树和二份答案加并查集的写法&#xff1b; 代码&#xff1a; #include <iostream> #include <cstring> #in…

微信小程序流量主收益

小程序流量主已经开通三天了,目前收益1.42,,,,,,,,,,,,,,,不过确实点击量不怎么多 再附上我的流量主小程序 点击量如果上去的话,收益应该还是可观的,有想开流量主的任何问题都可以骚扰我,,对小程序有任何意见也欢迎反馈~ 一起进步,一起学习~