数据结构——绪论/线性表

news2024/11/30 14:48:41

文章目录

    • **一 基本概念**
    • **二 算法和算法评价**
    • **三 线性表的定义和基本操作**
    • **四 线性表的顺序表示**
      • **1 定义**
      • **2 基本操作**
    • **五 线性表的链式表示**
      • **1 单链表的定义**
      • **2 单链表的基本操作实现**
      • **3 双链表**
      • **4 循环链表**
      • **5 静态链表**

一 基本概念

数据类型:(1)原子类型:不可再分的,如int,char

(2)结构类型:可以再分解若若干成分,如

struct lnode
{
    int a;
    char C;
}LNODE;

(3)抽象数据类型:抽象数据组织及与之相关的操作,如栈(Stack)就是一种抽象数据类型。栈是一种具有后进先出(Last-In-First-Out,LIFO)特性的数据结构,它支持两个基本操作:压栈(Push)将元素添加到栈顶,弹栈(Pop)将栈顶元素移除并返回。

算法:对特定问题求解步骤的一种描述,是指令的有限序列

一个算法的设计取决于所选定的逻辑结构;算法的实现依赖于所采用的存储结构

数据结构分为两类:

(1)逻辑结构

数据元素间的逻辑关系

在这里插入图片描述

(2)存储结构

数据结构在计算机中的表示,又称物理结构

主要有顺序存储,链式存储,索引存储和散列(哈希)存储

散列存储:根据元素的关键字(散列函数)直接计算元素的存储地址

在这里插入图片描述

二 算法和算法评价

算法的特性:有穷性,确定性,可行性,输入,输出

一个好的算法:可读性,正确性,健壮性,高效率和低存储量

算法效率的度量:

(1)时间复杂度

通常考虑最坏情况

加法规则:以最大的为准

乘法规则:直接相乘

常见的时间复杂度

O(1)<O(Log2N)<O(N)<O(N*Log2N)<O(N2)<O(N3)<O(2N)<O(N!)<O(Nn)

(2)空间复杂度

算法所耗费的空间,一般是辅助空间

算法原地工作即O(1)

三 线性表的定义和基本操作

线性表是具有相同数据类型的n个元素的有限序列,是一种逻辑结构

即逻辑上每个数据是相邻的;每个元素只有一个直接前驱和直接后继

特点:个数有限,逻辑上的顺序性,每个元素都是单个数据元素,且类型相同

线性表的主要操作

Initlist(&L);       \\初始化表
Length(L);          \\求表长
LocateELem(L,e);    \\按值查找
GetElem(L,i);      \\按位查找
ListInsert(&L,i,e); \\插入操作
Listdelete(&L.i,&e);\\删除操作
PrintList(L);       \\输出操作
Empty(L);           \\判空操作
DestroyList(&L);    \\销毁操作

采用的存储结构不同,存储结构也不同,算法的实现也不同;&在C++中表示引用调用

四 线性表的顺序表示

1 定义

线性表的顺序存储又称顺序表,用一组地址连续的存储单元依次存储线性表中的元素,常称为数组

#define MaxSize 50
typedef struct
{
    ElemType data[MaxSize];
    int length;
}Sqlist;

空间的静态分配:事先固定大小,空间占满时会发生溢出

动态分配:程序执行过程中通过动态存储分配语句分配的,占满后就开辟一块新的空间,不需要一次性划分

#define InitSize 100
typedef struct
{
    Elemtype *data;         \\指示动态分配数组的指针
    int maxsize,length;     \\数组的最大容量和当前个数
}seqlist;

L.data = (elemtype)malloc(sizeof(elemtypr)*Initsize);    \\C的动态分配
L.data = new elemtype(Initsize);                         \\C++的动态分配

\\动态分配不是链表,只是运行时决定分配的空间大小

顺序表的特点:随机访问,存储密度高,物理上相邻,插入删除需要移动大量数据

2 基本操作

(1)插入

bool ListInsert(sqlist &L,int i , elemtype e)  \\位置i插入e
{
     if(i < 1 || i > L.length+1)               \\i有效
         return false;
     if(L.length >= Maxsize)                   \\空间是否满
         return false;
     for(int j = L.length; j >=i ;j--)
            L.data[j]=L.data[j-1];             \\逐个移动数据直到位置i  
     L.data[i-1]=e;                            \\插入e
     L.length++;
     return true;                  
}

时间复杂度O(n)

(2)删除

bool Listdelete(sqlist &L,int i , elemtype e)  \\位置i删除并返回为e
{ 
     if(i < 1 || i > L.length)                 \\i有效
         return false;
     e = L.data[i-1];
     for(int j =i;j<L.length;j++)
          L.data[j-1]=L.data[j];
     L.length--;
     return true;
}

(3)按值查找

int LocateElem(sqlist &L,Elemtype e)
{ 
    int i;
    for(i=0;i<L.length;i++)
    {
        if(L.data == e)
            return i;       \\返回下标   
    }
    return -1;              \\表示查找失败
}

五 线性表的链式表示

1 单链表的定义

typedef struct Lnode
{
     ELemtype data;          \\数据
     struct Lnode * next;    \\指针,指向下一个节点
}Lnode, *Linklist;

解决了需要大量连续存储单元的缺点,但是也存在浪费空间;是非随机存取的,必须从头开始遍历查找

头指针来标识一个单链表

在第一个节点之前加一个头结点,不存入信息,方便操作;不管带不带头结点,头指针L都指向第一个结点

在这里插入图片描述

2 单链表的基本操作实现

(1)头插法建立单链表

Linklist List_Headinsert(Linklist &L)
{ 
    Lnode *s;int x;
    L=(Linklist)malloc(sizeof(Lnode));   \\创建头结点
    L->next = NULL;                      \\初始为空结点
    scanf("%d",&x);
    while(x!=9999)
    {
        s = (Lnode *)malloc(sizeof(Lnode));    \\Lnode* 和 Linklist 是一样的  都是创建新结点
        s->data =x;
        s->next = L->next;
        L->next =s;
        scanf("%d",x);
    }
    return L;
}

在这里插入图片描述

(2)尾插法建立单链表

Linklist List_Tailinsert(Linklist &L)
{ 
    int x;
    L=(Linklist)malloc(sizeof(Lnode));   \\创建头结点
    Lnode *s ,*r =L;                       
    scanf("%d",&x);
    while(x!=9999)
    {
        s = (Lnode *)malloc(sizeof(Lnode));
        s->data =x;
        r->next =s;
        r =s ;
        scanf("%d",x);
    }
    r->next=NULL;
    return L;
}

在这里插入图片描述

(3)按序号查找结点

Lnode *Getelem(Linklist &L,int i)
{
    if(i<1)
       return NULL;
    int j =i;
    Lnode *p=L->next;
    while(p!=NULL&&j<i)
    {
        p = p->next;
        j++;
    }
    return p;
}

(4)按值查找表结点

Lnode *Locateelem(Linklist &L,elemtype e)
{
     Lnode *p=L->next;
     while(p!= NULL&&p->data!=e)
     {
        p=p->next;
     }
     return p;
}

(5)插入结点

p=Getelem(L,i-1);
s->next=p->next;
p->next=s;

\\对某一结点进行前插
s->next=p->next;
p->next=s;
temp = p->data;
p->data=s->data;
s->data=temp;

在这里插入图片描述

(6)删除结点

p=Getelem(L,i-1);
q=p->next;
p->next=q->next;
free(q);

\\删除结点*p
q=p->next;
p->data=p->next->data;
p->next=q->next;
free(q);

在这里插入图片描述

3 双链表

typedef struct Dnode
{
   Elemtype data;
   struct Dnode * pri,*next;
}Dnode, *Dlinklist;

在这里插入图片描述

(1)插入操作

s->next=p->next;
p->next->pri=s;
s->pri =p;
p->next=s;

在这里插入图片描述

(2)删除操作

p->next=q->next;
q->next->pri=p;c
free(q);

在这里插入图片描述

4 循环链表

(1)循环单链表

即最后个结点的指针指向头结点

在这里插入图片描述

(2)循环双链表

空表时,pri和next都指向L

在这里插入图片描述

5 静态链表

借助数组来面熟线性表的链式存储结构,这里的指针是结点的相对地址(数组下标),要预先分配空间

#define Maxsize 100
typedef struct
{
   Elemtype data;
   int next;
}SLinklist[Maxsize];

以next==-1作为结束

在这里插入图片描述

6 顺序表与链表的比较

顺序表链表
存取方式顺序、随机顺序
逻辑/物理结构物理上也相邻物理上不一定相邻
查找/插入和删除时间复杂度O(N)或者O(log2n)O(n)
空间分配静态会溢出,动态效率低需要时动态申请,操作灵活

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

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

相关文章

使用pycharm入门python的一些注意点

今儿在帮别人跑一段python代码&#xff0c;实际上我对python并不熟悉&#xff0c;只能边摸索边尝试。选择了pycharm这个工具。 一.怎么安装python使用的库文件 能用来安装python的库文件的&#xff0c;有很多种办法&#xff0c;这里只介绍pip和pip3。因为pip和pip3的优势是能…

SpringCloud第一篇:服务的注册与发现Eureka

一、spring cloud简介 spring cloud 为开发人员提供了快速构建分布式系统的一些工具&#xff0c;包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单&#xff0c;可以在开发人员的电脑上跑。 二、创建服务注册中心 …

oracle细节、经验锦集

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131054454 出自【进步*于辰的博客】> 由于是随兴记录&#xff0c;因此阐述的比较多而乱&…

详解Eureka服务注册和调用

目录 1.概述 2.环境 2.1.项目结构 2.2.项目架构 2.3.依赖 3.注册中心 3.1.配置使用 3.2.管理页 3.3.集群 4.服务注册 5.服务调用 5.2.Ribbon 5.3.Feign 5.4.OpenFeign 1.概述 我们把从外部进入到微服务集群里的流量称为“南北流量”、微服务集群节点间流转的流量…

HTML type=“radio“ 不显示按钮

问题 HTML中type&#xff1d;"radio" 但是在界面中不显示按钮。 详细问题 HTML中type&#xff1d;"radio" 但是在界面中不显示按钮。 笔者html核心代码 <div>性别<input type"radio" id"male" name"gender" va…

chatgpt赋能python:Python中的中文分词神器——jieba

Python中的中文分词神器——jieba 介绍 如果你曾经在处理中文文本时&#xff0c;也许会遇到中文分词的需求&#xff0c;jieba就是一款不可错过的工具。 jieba 是目前最好的 Python 中文分词库&#xff0c;它具有高效、简单和可定制等优点&#xff0c;适合各种规模的文本分词…

Linux学习之vim四种模式初探

vim是一个多模式&#xff0c;有vim /所在目录/文件名&#xff0c;若是已经有了文件&#xff0c;可以打开文件进行编辑&#xff0c;若是没有文件&#xff0c;在vim中保存之后就会有一个文件&#xff0c;相当于记事本里边新建一个文件。我现在就使用vim新建一个文件&#xff0c;然…

C# .NET EF框架 webapi 安装使用sqlite

文章目录 Sqlite安装使用Sqlite特点环境安装EF 是什么&#xff1f;EF使用举例 Nuget控制台 Sqlite安装使用 Sqlite特点 Sqlite是轻量级数据库&#xff0c;不需要安装&#xff0c;跨平台使用。是用来做小软件&#xff0c;小项目&#xff0c;快速移植的最优解。不需要像mysql和…

Verilog基础:表达式中的整数常量(integer)

相关文章 Verilog基础&#xff1a;表达式位宽的确定&#xff08;位宽拓展&#xff09; Verilog基础&#xff1a;表达式符号的确定 Verilog基础&#xff1a;数据类型 Verilog基础&#xff1a;位宽拓展和有符号数运算的联系 Verilog基础&#xff1a;case、casex、ca…

chatgpt赋能python:Python如何Input一个字典:详细教程

Python 如何 Input 一个字典&#xff1a;详细教程 在 Python 中&#xff0c;字典是一种非常有用的数据结构。它可以存储键值对&#xff0c;让我们能够通过键访问值。Python 中没有固定的语法来创建字典&#xff0c;因此本文将教你如何输入一个字典。 什么是字典&#xff1f; …

chatgpt赋能python:Python语言中的Pandas库介绍

Python语言中的Pandas库介绍 Python语言是一种十分流行的编程语言&#xff0c;以其易读易写等特点而受到工程师和数据科学家的青睐。在Python语言中&#xff0c;有一款非常流行的数据处理和分析库&#xff0c;也就是Pandas库。Pandas库在数据处理和分析方面有着出色的表现&…

iOS开发最佳实践|集成声网SDK实现语音聊天室

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c; 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;不想当开发的测试&#xff0c;不是一个好…

初探Sharding-JDBC订单表分片实现

设计订单系统有两个数据库db_order_01和db_order_02。每个数据库分别有t_order_0和t_order_1两张订单表。 订单表设计有订单ID(order_id)&#xff0c;用户ID(user_id)&#xff0c;商户ID(merchant_id)。假设商户查看订单操作要比用户查看订单的操作更加频繁。避免商户查询订单时…

NLP学习笔记五-simple RNN

NLP学习笔记五-simple RNN 我这个学习笔记&#xff0c;感兴趣的小伙伴&#xff0c;看的时候尽量从头开始看&#xff0c;这样更好理解&#xff0c;也更有收获。 simple RNN的单元结构图如下&#xff1a; 其中A就是我们需要学习的参数矩阵&#xff0c; h t − 1 h_{t-1} ht−1​…

【MySQL数据库 | 第十五篇】事务

目录 前言&#xff1a; 介绍事务&#xff1a; 控制事务&#xff1a; 事务四大特性&#xff1a; 并发事务问题&#xff1a; 事务隔离级别&#xff1a; 总结: 前言&#xff1a; 这章我们将进入到MySQL基础篇的最后一章&#xff1a;事务&#xff0c;希望大家可以坚持下去&#xf…

车间如何做好“生产计划”,打造高效运营的智能工厂

新形势下&#xff0c;面对外部不断变化的市场需求、供应链下游企业管理升级需求以及持续上涨的人力成本&#xff0c;传统工厂模式必须要变革才能更好地发展。热潮之下&#xff0c;企业纷纷规划建设智能工厂。那么&#xff0c;新工厂规划如何避免投入浪费&#xff0c;少走弯路&a…

Linux——进程间通信,信号量的使用+小demo(C语言)

一.什么是信号量呢&#xff1f;用途又是什么呢&#xff1f; 信号量就是解决进程之间竞争资源的情况&#xff0c;比如&#xff1a;我们在宿舍用的公共洗衣机&#xff0c;我们只有当它空闲的时候&#xff0c;我们才可以去使用它&#xff0c;当别人看到洗衣机在使用的时候&#xf…

LVS负载均衡群集部署(DR模式)

一.DR模式 LVS负载均衡群集部署 ipvsadm 工具选项说明&#xff1a; 工具选项作用-A添加虚拟服务器-D删除整个虚拟服务器-s指定负载调度算法&#xff08;轮询&#xff1a;rr、加权轮询&#xff1a;wrr、最少连接&#xff1a;lc、加权最少连接&#xff1a;wlc&#xff09;-a表示…

clickhouse-MergeTree

创建建表语句 create table t_order_mt(id UInt32,sku_id String,total_amount Decimal(16,2),create_time Datetime ) engine MergeTreepartition by toYYYYMMDD(create_time)primary key (id)order by (id,sku_id); 插入测试数据 insert into t_order_mt(id,sku_id,total_…

chatgpt赋能python:Python数据分析必备工具:Pandas

Python数据分析必备工具&#xff1a;Pandas Python作为一门流行的编程语言&#xff0c;广泛应用于数据科学领域。而Pandas作为Python语言下的数据分析库&#xff0c;被广泛地应用于数据处理、数据分析、数据可视化等方面。本文将介绍如何快速地入门Pandas并进行数据分析。 什…