数据结构(1)(顺序表)

数据结构

数据结构
    相互之间存在一种或多种特定关系的数据元素的集合

逻辑结构
        集合,所有数据在同一个集合中,关系平等。(数组中的每一个int)
        线性,数据和数据之间是一对一的关系(队列,链表,数组(线性表的一种体现))
        树, 一对多(高效)
        图,多对多        

物理结构(在内存当中的存储关系)
        顺序存储,数据存放在连续的存储单位中。逻辑关系和物理关系一致
        链式,数据存放的存储单位是随机或任意的,可以连续也可以不连续。

struct Per 数据元素
    {
        char name;//数据项(变量)
        int age;
        char phone;
    }    
            
    struct Per list[100]; //数据对象(数据元素的集合)

数据的类型,ADT    abstract datatype(抽象数据类型) 
        是指一组性质相同的值的集合及定义在此集合上的一些操作的总称。
        原子类型,int,char,float
        结构类型,sturct, union,

        抽象数据类型, 数学模型 + 操作。(相当于c语言.h的内容,=变量+函数)
        
        程序 =  数据 + 算法

算法:
    是解决特定问题求解步骤的描述,计算机中表现为指令的有限序列,每条指令

 算法的特征,
    1,输入,输出特性,输入是可选的,输出是必须的。(输出-->内存上必须要发生变化)
    2,有穷性,执行的步骤会自动结束,不能是死循环,并且每一步是在可以接受的时间内完成。
    3,确定性,同一个输入,会得到唯一的输出。
    4,可行性,每一个步骤都是可以实现的。

算法的设计,
    1,正确性,
        语法正确
        合法的输入能得到合理的结果。
        对非法的输入,给出满足要求的规格说明
        对精心选择,甚至刁难的测试都能正常运行,结果正确
    2,可读性,便于交流,阅读,理解
    3,健壮性,输入非法数据,能进行相应的处理,而不是产生异常
    4,高效,存储低,效率高 

时间复杂度

      一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。也就是执行这个算法所花时间的度量。

(大O阶方法)
        1,用常数1 取代运行时间中的所有加法常数(不论输入数据的大小如何变化,
                                                 执行时间都是一个常数)
        2,在修改后的运行函数中,只保留最高阶项。(An²,Bn³)
        3,如果最高阶存在且不是1,则忽略这个项相乘的常数。(-->n²,n³)

常见的时间复杂度:

O(1) - 常数时间复杂度:算法的执行时间不随输入数据规模变化,如数组访问某个元素。
O(log n) - 对数时间复杂度:二分查找就是一个典型的例子,每一步都将问题规模减半。
O(n) - 线性时间复杂度:遍历数组或列表中的每个元素。
O(n log n) - 线性对数时间复杂度:快速排序、归并排序等高效排序算法。                                  (n体现在拿数的过程需要n次,logn表现在把数放在固定位置上)
O(n^2) - 平方时间复杂度:冒泡排序、选择排序,插入排序等简单排序算法。
O(n^3)、O(2^n)、O(n!) - 随着问题规模的增长,所需时间急剧增加,分别对应立方、指数、阶乘复杂度。

空间复杂度

空间复杂度是衡量算法在运行过程中所需存储空间的度量。

常见空间复杂度:

 O(1):算法使用的额外空间不随输入数据规模改变,如原地排序算法。

 O(n):额外空间正比于输入数据规模,如某些动态规划问题中需要的数组。

 O(n^2):随着输入规模增大,所需空间平方增长,例如某些矩阵运算。数组:整型数组arr的长度为5,因此其空间复杂度为O(5),即O(n

    int arr[5] = {1, 2, 3, 4, 5};

链表:定义了一个包含一个节点的单向链表,其空间复杂度为O(1)。

struct Node {int data;struct Node* next;
};

栈:随着MAX_SIZE线性增长,其空间复杂度为O(n)

#define MAX_SIZE 100
struct Stack {int data[MAX_SIZE];int top;
};

线性表:

     顺序表是物理地址连续的存储单元依次存储数据的线性结构,一般情况下采用数组存储,在数组上完成数据的增删查改。
    当线性表元素的个数n(n>=0)定义为线性表的长度,当n=0时,为空表。
    在非空的表中每个元素都有一个确定的位置,如果a1是第一个元素,那么an就是第n个元素。

顺序表基本操作:

#ifndef SEQLIST_H
#define SEQLIST_Htypedef struct{char name[32];char sex;int age;int score;
}DATATYPE;
//typedef int Datatype;
typedef struct list {DATATYPE *head; //开辟的空间首地址int tlen;  //总长度int clen;  //当前长度
}SeqList;SeqList* CreateSeqList(int size); //创建
int DestroySeqList(SeqList*sl);  /销毁
int InsertTailSeqList(SeqList *list, DATATYPE *data); //尾插
int IsFullSeqList(SeqList *list);  //顺序表是否满
int IsEmptySeqList(SeqList *list); //顺序表是否为空
int ShowSeqList(SeqList* list);  //打印全部节点数据
int GetSizeSeqList(SeqList* list);  //获取当前长度
int FindSeqList(SeqList *list, char *name);  //根据名字获取节点下标
DATATYPE* GetSeqListItem(SeqList *list,int ind);  //根据下标查询节点
int InsertPosSeqList(SeqList *list, DATATYPE *data, int pos);  //指定位置插入
int ModifySeqList(SeqList *list, char *old, DATATYPE *newdata); //修改及诶带你
int DeleteSeqList(SeqList *list, char *name);  //删除顺序表
int ClearSeqList(SeqList *list);  //删除该表所有元素
#endif // SEQLIST_H

操作实现:

#include "seqlist.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
SeqList *CreateSeqList(int size)
{if(size<=0){fprintf(stderr,"size is error,range >1");return NULL;}SeqList* sl = ( SeqList*)malloc(sizeof(SeqList));if(NULL == sl){perror("CreateSeqList malloc");exit(1);}sl->head = (DATATYPE*)malloc(sizeof(DATATYPE)*size);if(NULL == sl->head){perror("CreateSeqList malloc");exit(1);}sl->tlen = size;sl->clen = 0;return sl;
}int DestroySeqList(SeqList *sl)
{if(NULL == sl){fprintf(stderr,"SeqList point not NULL");return 1;}if(sl->head)free(sl->head);free(sl);return 0;
}int InsertTailSeqList(SeqList *list, DATATYPE *data)
{if(NULL == list){fprintf(stderr,"InsertTailSeqList error,list is null\n");return -1;}if(IsFullSeqList(list)){fprintf(stderr,"InsertTailSeqList error ,seqlist is full\n");return 1;}//list->head[list->clen] = *data;memcpy(&list->head[list->clen] , data,sizeof(DATATYPE));list->clen++;return 0;
}int IsFullSeqList(SeqList *list)
{if(NULL == list){fprintf(stderr,"IsFullSeqList error,list is null\n");return -1;}return list->clen == list->tlen;
}int IsEmptySeqList(SeqList *list)
{return 0==list->clen;
}int ShowSeqList(SeqList *list)
{if(NULL == list){fprintf(stderr,"list error,list is null\n");return -1;}int i = 0 ;int len = GetSizeSeqList(list);for(i=0;i<len;i++){printf("name:%s sex:%c age:%d score:%d\n",list->head[i].name,list->head[i].sex,list->head[i].age,list->head[i].score);}return 0;
}int GetSizeSeqList(SeqList *list)
{if(NULL == list){fprintf(stderr,"GetSizeSeqList error,list is null\n");return -1;}return list->clen;
}int FindSeqList(SeqList *list, char *name)
{if(NULL == list){fprintf(stderr,"FindSeqList error,list is null\n");return 1;}if(IsEmptySeqList(list)){fprintf(stderr,"FindSeqList error,seqlist is empty\n");return -1;}int len = GetSizeSeqList(list);int i = 0 ;for(i=0;i<len;i++){if(0==strcmp(list->head[i].name,name)){return i;}}return -1;}DATATYPE *GetSeqListItem(SeqList *list, int ind)
{if(NULL == list){fprintf(stderr,"seqlist is NULL\n");return NULL;}if(ind<0 || ind>GetSizeSeqList(list)){fprintf(stderr,"index is error . range>0  && <size\n");return NULL;}return &list->head[ind];
}int InsertPosSeqList(SeqList *list, DATATYPE *data, int pos)
{if(NULL == list){fprintf(stderr,"list is null\n");return 1;}if(IsFullSeqList(list)){fprintf(stderr,"list is full\n");return 1;}if(pos<0 ||pos>GetSizeSeqList(list)){fprintf(stderr,"pos is error\n");return 1;}int i = 0 ;for(i =GetSizeSeqList(list); i>=pos ; i-- ){memcpy(&list->head[i],&list->head[i-1],sizeof(DATATYPE));}memcpy(&list->head[pos],data,sizeof(DATATYPE));list->clen++;return 0;
}int ModifySeqList(SeqList *list, char *old, DATATYPE *newdata)
{if(NULL == list){fprintf(stderr,"ModifySeqList error,list is null\n");return 1;}int ret = FindSeqList(list,old);if(-1 == ret){fprintf(stderr,"modify error,can't find\n");return 1;}DATATYPE* tmp = GetSeqListItem(list,ret);memcpy(tmp,newdata,sizeof(DATATYPE));return 0;
}int DeleteSeqList(SeqList *list, char *name)
{if(NULL == list){fprintf(stderr,"DeleteSeqList error,list is null\n");return 1;}int ret = FindSeqList(list,name);if(-1 == ret){return 1;}else{int i = 0 ;for(i =ret; i <GetSizeSeqList(list)-1 ; i++){memcpy(&list->head[i] ,&list->head[i+1],sizeof(DATATYPE));}}list->clen--;return 0 ;
}int CleanSeqList(SeqList *list)
{if(NULL == list){fprintf(stderr,"CleanSeqList error,list is null\n");return 1;}list->clen = 0 ;return 0;}

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

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

相关文章

函数的介绍

目录 一、函数介绍 1、函数的介绍 2、自定义函数 3、函数的好处 二、函数的定义 1、函数的定义 2、函数的调用 3、快速入门案例 三、函数-调用机制 1、函数-调用过程 2、return语句 一、函数介绍 1、函数的介绍 1&#xff09;为了完成某一功能的程序指令(语句)的集…

【Postgres实战】Postgres的角色权限本地/在线不一致?

背景 Gin-Vue-Admin是开源的全栈开发平台&#xff0c;可以担任企业内部后台管理的职责。官网地址是&#xff1a;gin-vue-admin | GVA 文档站。上图为在线demo展示页面。 它的后台使用Golang&#xff08;The Go Programming Language (google.cn)&#xff09;&#xff0c;基于…

JSON 文件第一段飘红

问题 原因 这个问题通常发生在尝试用 ESLint 去解析 JSON 文件时。ESLint 主要设计用于检查 JavaScript 代码的语法和风格&#xff0c;而JSON是一种数据交换格式&#xff0c;不包含 JavaScript 的逻辑结构&#xff0c;如函数、变量声明等。 解释报错原因 当ESLint遇到它不能识…

让 AI 开发更高效、低成本,DigitalOcean 公布 GPU Droplet 云主机产品

全球知名云服务供应商 DigitalOcean 在近期举行的 Deploy 大会上公布了全新的 GPU Droplet 云主机服务&#xff0c;这标志着DigitalOcean 在支持AI和机器学习工作负载方面迈出了重要一步。 DigitalOcean 的 GPU Droplet&#xff08;云主机&#xff09; DigitalOcean 自 2023 …

【STM32嵌入式系统设计与开发拓展】——12_Timer(定时器中断实验)

目录 1、什么是定时器&#xff1f;定时器用于测量时间间隔&#xff0c;而计数器用于计数外部事件的次数 2、定时器的主要功能和用途&#xff1f;3、定时器类型&#xff1f;4、定时器的编写过程5、代码分析定时器计算&#xff1f; 1、什么是定时器&#xff1f; 定时器就是计数器…

正点原子STM32(基于HAL库)6

目录 TFTLCD&#xff08;MCU 屏&#xff09;实验TFTLCD 简介TFTLCD 简介液晶显示控制器FSMC 简介FSMC 关联寄存器简介 硬件设计程序设计FSMC 和SRAM 的HAL 库驱动程序流程图程序解析 下载验证 LTDC LCD&#xff08;RGB 屏&#xff09;实验RGBLCD<DC 简介RGBLCD 简介LTDC 简介…

力扣高频SQL 50题(基础版)第九题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第九题197. 上升的温度题目说明思路分析实现过程准备数据实现方式结果截图总结 力扣高频SQL 50题&#xff08;基础版&#xff09;第九题 197. 上升的温度 题目说明 Weather ---------------------- | Column Name…

深度学习实战笔记2实战Kaggle比赛:预测房价

此数据集由Bart de Cock于2011年收集 :cite:De-Cock.2011&#xff0c; 涵盖了2006-2010年期间亚利桑那州埃姆斯市的房价。 这个数据集是相当通用的&#xff0c;不会需要使用复杂模型架构。 它比哈里森和鲁宾菲尔德的波士顿房价 数据集要大得多&#xff0c;也有更多的特征。 1下…

数据结构之深入理解简单选择排序:原理、实现与示例(C,C++)

文章目录 一、简单选择排序原理二、C/C代码实现总结&#xff1a; 在计算机科学中&#xff0c;排序算法是一种非常基础且重要的算法。简单选择排序&#xff08;Selection Sort&#xff09;作为其中的一种&#xff0c;因其实现简单、易于理解而受到许多初学者的喜爱。本文将详细介…

El-Table 表格的表头字段切换

最近写了一个小功能&#xff0c;比较有意思&#xff0c;特此博客记录。 提出需求&#xff1a;需要表头字段变化&#xff0c;但是我在官网上的表格相关上查找&#xff0c;没有发现便捷方法。 于是我有两个想法&#xff1a;1.做三个不同的表格。2.做一个表格使用不同的表头字段。…

python如何调用matlab python package库matlab转python安装包调用使用简单示例

说明(废话) 之前没有进行python调用过matlab&#xff0c;前面用matlab engine for python可以通过调用matlab的源码文件的形式可以调用工程&#xff0c;但是这又有一个问题&#xff0c;就是在运行的时候必须提供python和matlab的全部源码 该文章是通过matlab源码转python pack…

cdp碳信息披露

在全球化日益加深的今天&#xff0c;环境保护和可持续发展已成为全球共识。企业作为经济社会的主体&#xff0c;其在环保领域的行动和决策不仅影响着自身的发展&#xff0c;更对整个社会乃至全球的生态环境产生深远影响。CDP&#xff08;Carbon Disclosure Project&#xff0c;…

很酷的仿真翻页书HTML源码,书本页面是加载的图片,基于JQuery实现的翻页特效,结合一些js插件,看起来很酷,在实现在线翻书项目。

仿真翻页书HTML源码https://www.bootstrapmb.com/item/14742 创建一个仿真的翻页书效果在HTML和CSS中可以通过多种方式实现&#xff0c;但通常这也会涉及到JavaScript&#xff08;或jQuery&#xff09;来处理交互和动画。以下是一个简单的示例&#xff0c;展示如何使用HTML、…

【Leetcode】十八、动态规划:不同路径 + 全1的最大正方形

文章目录 1、动态规划2、leetcode509&#xff1a;斐波那契数列3、leetcode62&#xff1a;不同路径4、leetcode121&#xff1a;买卖股票的最佳时机5、leetcode70&#xff1a;爬楼梯6、leetcode279&#xff1a;完全平方数7、leetcode221&#xff1a;最大正方形 1、动态规划 只能…

10KW级电机电流特性曲线推导及校验

1.首先进行数据拟合 2.拟合曲线依照电机参数标准化 30A处转差率应为6.6%。 3.全域电流对照表&#xff1a; 4.实际的电流年变化曲线&#xff08;因为电压不稳定&#xff09; 4.1 以日为单位的电流起伏 蓝色的部分标出了工作日的切换。 4.2 某个月的电流趋势图&#xff1a;

argon主题调整日记

前言 argon主题是一款由solstice23开发的一款简洁美观的WordPress主题&#xff0c;在使用过程中也发现了几个可以优化的点&#xff0c;在查阅主题文档无果后对其进行以下几点修改。 1、使用子主题 为了避免修改源文件而引起主题更新后修改丢失的问题&#xff0c;还是尽量使用子…

解决前端和后端时间不一致问题的实践指南

目录 前言为什么会出现时间不一致的问题通过配置解决时区问题 配置示例 示例代码实现 实体类控制器主程序应用类 验证配置效果总结 前言 造成前端和后端时间不一致的常见原因是时区差异。在后端代码中生成的时间可能是以系统默认时区&#xff08;如 UTC&#xff09;为基础的…

sqlalchemy获取数据模型类所有字段

sqlalchemy获取数据模型类所有字段 在 SQLAlchemy 中,要获取数据模型类(即声明模型类)的所有字段,可以通过以下方式进行: 使用 __table__ 属性: SQLAlchemy 的每个模型类都有一个 __table__ 属性,它表示与该模型类关联的数据库表。通过这个属性,可以获取表的所有列信息…

C# yaml 配置文件的用法(一)

目录 一、简介 二、yaml 的符号 1.冒号 2.短横杆 3.文档分隔符 4.保留换行符 5.注释 6.锚点 7.NULL值 8.合并 一、简介 YAML&#xff08;YAML Aint Markup Language&#xff09;是一种数据序列化标准&#xff0c;广泛用于配置文件、数据交换和存储。YAML的设计目标是…

【Java 数据结构】ArrayList类介绍

ArrayList类介绍 初识List接口ArrayList类ArrayList类是什么顺序表的模拟实现初始化增加元素删除元素查找元素修改元素 ArrayList类使用构造方法ArrayList源码阅读常用方法及其注意事项 初识List接口 List 是集合框架中的一个接口, 它的里面包含了一些方法, 例如add(), remove…