链式存储表

数据结构写代码(51) 广义的头尾链式存储 广义是一种非线性的数据结构。但如果广义的每个元素都是原子,它就变成了线性。广义广泛地用于人工智能等领域的LISP语言。 广义一般记作 LS = (a1, a2, ···, an), n是它的长度,ai可以是单个元素(原子),也可以是广义(子),当广义非空时,称第一个元素a1为LS的头,称其余元素组成的为LS的尾。注意:头是元素(可以是原子,也可以是广),尾一定是广 阅读详情

链式存储的特点和核心操作逻辑

        逻辑上连续

顺序存储                连续物理内存

链式                        物理上不连续 增加 元素逻辑的关系

        存储结构特点

元素里面包含        数据+关系

顺序存储维护        整个表的首地址

        存储密度        高

链式存储维护        表内容的首结点,首结点逐个寻找其他节点

        存储密度        不高

//链式结点

//单链表

struct node{

        int data;

        struct node *next;

}

//双链表

struct node{

        int data;

        struct node *left;

        struct node *right;

}

 

 操作算法

在第二个位置上,进行插入操作时,如果索引指针指向第二个节点,无法进行后续操作

单链表中,一旦索引指针往前走一步,之前的元素就再也找不到

一旦把节点的next赋新值,之前的下一个元素的关系,就断开

1.插入操作

node->next=p->next;

p->next=node;

先处理新结点,再处理老结点

 

2.删除操作

删除A元素,站在A元素的前一个元素上,才能删除A元素

备份        备份A

                tmp=p->next;

                p->next=tmp->next;(p->next=p->next->next;)

                free(tmp);

3.遍历

找到某个结点的next等于null

        p

        while(p){

                //处理p所指向的值

                p=p->next;

        }

单链表找最大值

    int max = 0;
    p = xxx;
    while (p) {
        if (p->value > max) {
            max = p->value;
        }
        p = p->next;
    }
    max ?

第二种遍历,看下一个元素情况

        p=xxx;

        while(p->next){

                if(p->next->value==2){

                        break;

                 }

                p=p->next;

        }

 

单链表的实现

结构操作:

        申请一个结构的头        存储数据的首地址,以及这个结构的其他参数

结构头里面包含一个区域,指向真实的数据

带头结点(推荐)

 

 

//linkList.h
#ifndef DATA_STRUCTURE_LINKLIST_H
#define DATA_STRUCTURE_LINKLIST_H
//单链表,带头结点的标头
//节点
typedef int Element;
typedef struct node{
    Element ele;                //结点中的数据
    node *next;
}Node;
//表头
typedef struct{
    Node head;
    int len;        //记录表的长度
}LinkList;

//创建一个表头
LinkList *createLinkList();
//删除表头
void releaseLinkList(LinkList *linkList);

//插入结点
int InsertLinkList(LinkList *linkList,int pos,Element e);
//删除结点
int deleteLinkList(LinkList *linkList,Element e);

// 打印链表
void showLinkList(LinkList *linkList);

#endif //DATA_STRUCTURE_LINKLIST_H
//linkList.cpp
#include "linkList.h"
#include<iostream>
LinkList *createLinkList(){
    LinkList *link=new LinkList ;           //创建表头
    link->head.ele=0x00;                    //初始化表头里面的内容
    link->head.next= nullptr;
    link->len=0;
    return link;                            //返回指向表头的指针
}
void releaseLinkList(LinkList *linkList){
    int cnt=0;                              //用来统计被删除的结点数
    if(linkList){
        Node *node = &linkList->head;       //用一个结点指针指向表头里的头结点
        while (node->next) {                //当有下一个结点存在使,一直循环
            Node *tmp = node->next;         //以下是删除结点操作
            node->next = tmp->next;
            delete tmp;
            cnt++;
        }
        std::cout<<"释放了"<<cnt<<"个结点"<<std::endl;
        delete linkList;                    //释放表头
    }
}

int InsertLinkList(LinkList *linkList,int pos,Element e){
    if(pos<1&&pos>linkList->len){           //判断插入结点的位置是否为有效
        std::cout<<"插入位置pos无效"<<std::endl;
        return -1;
    }
    int cnt=0;                              //用来和判断结点位置pos是否到达
    Node *tmp=&linkList->head;              //指向表头的节点指针
    while(tmp&&cnt<(pos-1)){                //将节点指针tmp,移动到指向pos位置前一个节点
        tmp=tmp->next;
        cnt++;
    }
    Node *new_node=new  Node ;              //创建新结点,后面是给新结点赋值,和完成插入新结点的具体操作
    new_node->ele=e;
    new_node->next=tmp->next;
    tmp->next=new_node;
    linkList->len++;
}

int deleteLinkList(LinkList *linkList,Element e){
    //找到e元素的前一个位置
    Node *node=&linkList->head;
    while(node->next&&node->next->ele!=e){          //判断当前结点的下一个结点的值是否为要删除的值
        node=node->next;
    }
    if(node->next== nullptr){                 //找不到要删除的值,退出函数
        std::cout<<"找不到"<<std::endl;
        return -1;
    }
    //利用删除备份思想
    Node *tmp=node->next;               //执行删除操作
    node->next=tmp->next;
    delete tmp;
    linkList->len--;
    return 0;
}
void showLinkList(LinkList *linkList){
    Node *node=linkList->head.next;
    while(node){
        std::cout<<node->ele<<' ';
        node=node->next;
    }
    std::cout<<std::endl;
}
#include "linkList.h"
#include <iostream>
int main(){
    LinkList *link=createLinkList();
    if(link== nullptr){
        return -1;
    }
    // 插入节点
    for (int i = 0; i < 5; ++i) {	// 链表的倒序
        InsertLinkList(link, 1, i+100);
    }
    showLinkList(link);
    std::cout<<"============================="<<std::endl;
    deleteLinkList(link, 102);
    showLinkList(link);
    releaseLinkList(link);
    return 0;
}

8-线程链式存储结构 链式存储结构 在C语言中可以用结构体来定义链表中的指针域 链表中的头节点也可以用结构体实现 //1.结点指针定义 typedef void LinkList; typedef struct _tag_LinkListNode LinkListNode; struct _tag_LinkListNode { LinkListNode* next; }; //2.头结点定义 ty... 阅读详情

相关推荐

滑模控制实战:用Python从零实现SMC算法(附完整代码)

本文通过Python实战,从零详解滑模控制(SMC)算法的核心原理与代码实现。文章聚焦于一阶系统,使用NumPy和Matplotlib逐步构建控制器,并针对SMC固有的抖振问题,详细讲解了边界层法的原理与实现,提供了完整的代码和参数调优指南,帮助读者直观理解并掌握这一鲁棒性极强的非线性控制方法。

weixin_29285605的博客 434

数据结构链式存储链表

链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。 而链表分为单向或双向、带头或不带头、循环或非循环,组合起来就有8种链表结构。 接下来我们会学习:单向不带头非循环链表(笔试、面试都是这个结构)和双向不带头非循环链表(集合类底层这样操作)

m0_72161237的博客 2265

线性链表链式存储结构的线性

在顺序存储结构中,元素在内存中连续存储,而在链式存储结构中,元素通过节点和指针的连接来存储。通过指针的连接,线性链表可以动态地分配内存来存储数据,并且可以在运行时灵活地插入、删除和修改节点。类则是链表的主要实现,包含了一系列操作方法,如初始化链表、判断链表是否为空、追加元素、在指定位置插入元素、删除元素、查找元素、获取链表长度和显示链表元素等。使用示例部分展示了如何使用链表,包括判断链表是否为空、追加元素、在指定位置插入元素、删除元素、查找元素、获取链表长度以及显示链表元素。和一个指向下一个节点的指针。

PixelNinja的博客 92

线性链式存储——链表

链式存储是常用的动态存储方式,相对于顺序,可以更好的任意插入与删除,而采用链式存储的结构叫做链表链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。 从链接方式的角度:链表分为单链表、双链表及循环链表; 从实现方式的角度:链表分为动态链表和静态链表

是小辰 835

链表(线性的一种存储结构)

链表一、单链表1.代码定义单链表2.两种实现带头结点不带头结点3.单链表的操作插入按位序插入指定结点的后插操作指定结点的前插操作删除按位序删除指定结点的删除查找 链表分为 单链表链表 循环链表 静态链表 一、单链表 顺序(顺序存储): 每个节点中只存放数据元素。优点:可随机存取,存储密度高;缺点:要求大片连续空间,改变容量较为麻烦。 单链表链式存储): 每个结点除了存放数据元素外,还要存储指向下一个节点的指针。优点:不要求大量连续空间,可以很方便地拓展容量;缺点:不可随机存取,要耗费一定空间存放

Mafia的博客 4373

05 |「链表」简析

链表简析

小Y的博客 1944

链式存储结构的特点

链式存储结构的特点 1.优点 1.存储空间动态分配,可以根据实际需要使用 2.不需要地址连续的存储空间 3.插入/删除操作只须通过修改指针实现,不必移动数据元素,操作时间效率高 (无论位于链表何处无论链表长度如何,插入和删除操作的时间都是O(1)) 2.缺点 1.每个链结点需要设置指针域(存储密度小) 2.是一种非随机存储结构,查找、定位等操作要通过

FIGHTING的专栏 1万+

链式存储单向

环境:gcc目的:链式存储单向练习功能如下:1. 创建一个空顺序存储2. 中插入数据分3种情况1)头插入2)尾插入3)在指定位置插入4 在指定位置删除一个元素5 将中的数据元素倒序6 遍历顺序存储7. 释放链表内存 /*************************************************************************  @Author: ...

朝辞暮见的博客 282

线性-two~链式存储、广义

每个结点包括两个部分,一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。双向链表链表的一种,它的每个数据结点都有两个指针,分别指向直接后继(结点的后一个结点)和直接前驱(结点的前一个结点)。步骤:先找到链表的第i-1个结点,用p指向。再找到链表的第i-1个结点,用p指向。(2)多重链表中结点的指针域会有多个,如上面例子包含了Next和Sublist两个指针域。(3)包含两个指针域的链表并不一定是多重链表(双向链表不是多重链表)。删除链表的第i(1

m0_73374328的博客 1246

广义(C语言代码链式存储结构)

【代码】广义(C语言代码链式存储结构)

2305_78057683的博客 344

C++学习总结——顺序存储链式存储,索引存储,哈希存储的优缺点,以及vector数组,list链表,十字链表,索引结构,hash的实现

1.顺序存储   平均时间复杂度为O(n)   空间复杂度为O(0)查找,删除,增加的时间复杂度为O(0),修改的时间复杂度为O(1)优点:存储空间紧凑,容易进行查找缺点:插入删除需要移动大量元素。需要分配大量空间2.索引存储元素个数为M 索引数为N   查找的时间复杂度为O(M/N)  插入删除增加的时间复杂度为O(1) 本质为一个指针数组,数组的每一个元素可以是动态数组,链表,树或者图#pra...

IM_GD 2748

广义头尾链表存储结构_C语言:数据结构-广义存储结构

广义相对于线性﹑数组﹑串等线性结构是较为复杂的结构,其元素可以具有不同的结构(可以是原子,也可以是列),通常采用链式结构存储广义。(1)头、链式存储链式结构中用结点储存列中的数据元素,用指针的链接体现数据元素间的关系。由于数据元素可能是列或原子,所以必须设置两类结点。结点示,如图5-15所示。列的第一种链式结构的结点(a)结点;(b)原子结点结点包含3个域:1.标志域:t...

weixin_36082346的博客 8159

数据结构】广义链式存储结构

参考资料:《数据结构(C语言版)严蔚敏著》 版权说明:未经作者允许,禁止转载。如引用本文内容,需标明作者及出处。如本文侵犯了您的权益,请联系我删除并致歉。 文章说明:如文章中出现错误,请联系我更改。如您对文章的内容有任何疑问,也欢迎来与我讨论。 本文正在施工中...请稍等... typedef enum{ATOM, LIST} ElemTag; //ATOM==0:原子, List==1...

WINGREZ‘S BLOG 3702

C语言 简单易懂的链式存储操作

文章目录链表建栈的原理 栈详细定义请移步至C语言 一分钟看懂的顺序栈操作本文只讲解链表建栈以及操作 链表建栈的原理 我们都知道栈只能在一端进行操作,因此造成元素先进后出(First In Last Out),通常都是采用单链表的形式实现,并且规定所有的操作都在头进行操作,因此我们才有头插法进行创建,建栈过程如图所示 链表建栈的有优点是便于多个栈共享存储空间,且不存在栈满上溢的情况 ...

qq_41740162的博客 705

大话数据结构(四)线性相关概念——(链式存储结构之单链表的读取、插入、删除以及整创建、整删除)

之前我们说过,顺序存储结构的缺点就是插入和删除操作需要移动的数据元素非常的多,显然需要消耗掉大量的时间,有没有什么办法可以解决这种问题呢?我们的前辈算法师就很好地解决了这个问题——链式存储结构。 目录 链式存储结构 单链表的定义 单链表的读取、插入和删除 单链表的读取 单链表的插入 单链表的删除 单链表的整创建 单链表的整删除 链式存储结构 我们可以脑补一下链子的形状,我...

苞米地里捉小鸡的博客 540

链式存储_拉链表存储方法及存储系统与流程

本发明涉及计算机技术领域,特别涉及一种拉链表存储方法及存储系统。背景技术:随着大数据技术的普及,越来越多的传统数据库数据被移到HIVE(一种数据仓库工具)中存储。现有技术中,将每天获得的拉链表存储在对应的分区中,虽然这样可以查询到历史上任意一天的数据,但是会带来巨大的存储空间的浪费。技术实现要素:本发明要解决的技术问题是为了克服现有技术中的拉链表存储方式会造成巨大的存储空间浪费的缺陷,提供一种...

weixin_39721009的博客 920

链式存储_极限存储之拉链表

在数据仓库的数据模型设计过程中,经常会遇到这样的需求:1. 数据量比较大;2. 中的部分字段会被update,如用户的地址,产品的描述信息,订单的状态等等;3. 需要查看某一个时间点或者时间段的历史快照信息,比如,查看某一个订单在历史某一个时间点的状态,比如,查看某一个用户在过去某一段时间内,更新过几次等等;4. 变化的比例和频率不是很大,比如,总共有1000万的会员,每天新增和发生变化的有10...

weixin_39537049的博客 364

【线性结构之链式存储】广义、多重链表与矩阵基础

矩阵是一种数学概念,它是由数字或其他数学对象按照矩形阵列排列而成的。在计算机科学中,矩阵通常用于示和解决各种问题,如线性方程组、图像处理等。广义和多重链表与矩阵的关系在于它们都可以用来示矩阵。

2302_80050680的博客 990

线性链表链式存储结构

数据结构之线性 2.线性链式存储结构 线性链式存储结构的特点是用一组任意的存储单元存储线性的数据元素,这组存储单元可以是连续的,也可以是不连续的。 在链式结构中,除了要存储数据元素信息外,还要存储它的后继元素的存储地址。 为了示每个数据元素ai与其直接后继数据元素ai+1之间的逻辑关系,对数据元素ai来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的存储位置。把存储数据元素...

weixin_42164310的博客 732

【入坑存内计算一键指南】存内计算运算原理:算法优化、存储介质探究

本文探讨了存内计算及其面向的架构优化,尤其侧重于图算法优化和存内计算存储介质。文章介绍了存内计算的概念和意义,着重强调了存内计算解决了内存墙问题,提高了计算效率。针对图算法的优化,提出了基于位运算的创新方法,重塑了单源最短路径算法,并介绍了基于局部重叠度的链路预测算法优化设计。接着,文章详细讨论了存内计算存储介质,特别是非易失性存储器,比较了不同类型存储器的性能,并重点介绍了基于ReRAM的存内计算技术,包括其物理模型和交叉阵列结构。

一键难忘的博客 7008

基于峰岹FU6812L的11W高速电机无感驱动系统实现及源码分享

基于峰岹FU6812L控制芯片和吉林华微IPM SPE05M50T实现的11W高速电机驱动系统。该系统采用无感电机驱动算法,支持AC 90-250V宽电压输入,并提供完整的源代码、AD原理图和PCB设计文件。文章涵盖了项目的背景、核心组件解析、软硬件结合的具体方法以及关键代码片段展示,帮助读者全面了解和实现这一高效电机驱动系统。适合人群:从事电机控制系统开发的技术人员、电子工程师、嵌入式开发者。使用场景及目标:适用于需要高效、高性能电机驱动系统的应用场景,如无人机、智能家居、智能车辆等。目标是实现高转速、低功耗的电机驱动,提升系统的性能和稳定性。其他说明:文中提供的源代码可以在Keil5环境下编译,并通过峰岹专用下载器烧录到控制芯片中。硬件设计文件可用于指导实际电路板的设计和制作。

上一篇: 数据结构基础概念和表的代码
下一篇: 高精度算法
Z5433523
博客等级 码龄4年 2粉丝 · 36原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值