数据结构PT1——线性表/链表

news2025/1/13 15:58:25

1:顺序存储实现(数组实现)

Data: a1 a2 .....ai ai+1 .... an ....

typedef struct LNode *List; //指向LNode的指针,这是typedef的,你可以随时声明,而不加typedef只是创建一个
struct LNode{    //结构体成员
    ElementType Data[MAXSIZE];    //数组
    int Last;  
};
struct LNode L;    //声明实例
List PtrL;    //声明PtrL指针变量

访问第i个元素:L.Data[i]或者Ptr->Data[i]

线性表长度:L.Last+1或者PtrL->Last+1

    ​1>初始化

List MakeEmpty()    //返回List指针
{
    List Ptrl;
    Ptrl = (List)malloc(sizeof(struct LNode));    //动态创建LNode,需要指向该结构的指针
    Ptrl->Last = -1;    //通常通过判断或者使得Last = -1,来使得一个新的空链表时初始化
    return Ptrl;
}

    ​2>查找

int Find(ElementType X, List PtrL)
{
    int i = 0;
    while(i <= PtrL->Last    &&    PtrL -> Data[i] != X)    //Last 是链表中最后一个元素的索引而不是元素个数,因为结构体中的Last声明过
        i++;
    if(i > PtrL -> Last)
    return -1;
    else return i;
 }

    ​3>插入

    ​先移动、再插入,比如在i位置插入x元素,要把i-1后面的元素全部向右移动一位

void Insert(ElementType X,int i,List Ptrl)
{
    int j;
    if(PtrL -> Last == MAXSIZE -1){
        print("表满");
        return;
    }
    if(i < 1 || i > PtrL ->Last + 2){
        printf("位置不合法");
        return;
    }
    for(j = Ptrl -> Last;j >= i-1;j- -)
        PtrL -> Data[j+1] = PrL -> Data[j];    //循环把j位置的元素给到j+1位置的元素
    PtrL -> Data[i-1] = X;    //把i-1位置的元素替换成X
    PtrL -> Last++;    //Last+1
    return
}

    ​4>删除

    ​先删除、再移动

void Delete(int i ,List PtrL)
{
    int j;
    if(i < 1 || i > PtrL -> Last + 1){
        printf("不存在第%d个元素",i);
        return;
    }
    for(j=i ; j <= PtrL -> Last; j++)
        PtrL-> Data[j-1] = PtrL -> Data[j];    //循环把i+1位置的元素向左移动
    PtrL -> Last- -;
    return;
}

2:链式存储实现

不要求逻辑相邻的两个元素物理上也相邻,通过“链”建立起元素上的逻辑关系

它的元素定义如下:它不再使用数组和int类型的末尾元素,而是Data和Next

typedef struct LNode *List;
struct LNode{
    ElementType Data;
    List Next;
};
struct LNode L;
List PtrL;

链表由多个这样的“元素”连接而成,PtrL是指向该元素的指针,Next是指向下一个元素的指针,简单来说,Ptrl就是头指针,Next是尾指针

    ​1>求表长

int Lenth(List PtrL)    //只知道链表的头指针,单向链表
{
    List p = PtrL;    //临时指针P指向链表头
    int j = 0;
    while(p){        //p指针不结束
        p = p -> Next;    //指向下一个
        j++;
    }
    return j;
}

    ​2>查找

    按序号查找:FindKth;    ​(查找位于第K号的元素)

List FindKth(int K,List PtrL)
​{
​    List p = PtrL;
​    int i = 1;
    while(p != NULL && i < K){
        p = p-> Next;
        i++;
    }
    if(i == K) return p;    //找到第K个,返回指针
    else return NULL;    //没找到返回空
}

    ​3->插入

    ​①s指向新节点

    ​②p指向链表的第i-1个节点

image.png

    ​找到修改指针,插入节点

    ③​把s指针赋给p指针的下一位,p -> Next = s;

    ​④把p的下一位赋值给s的下一位

List Insert(ElementaType X ,int i , List PtrL)    //在i位置插入元素X
{
    List p ,s;    //两个临时指针p,s
    if(i == 1){  //如果在表头插入
        s = (List)malloc(sizeof(struct LNode));    //(List) 将 malloc 返回的指针转换为 List 类型的指针,指向struct的指针
        s -> Data = X;
        s -> Next = PtrL;    //    把原来的头指针给新元素的尾指针
        return s;
    }
    p = FindKth(i-1 , PtrL);    //查找位于i-1位置的元素,把指向该位置的指针赋值给p
    if(p == NULL){
        printf("参数i错误");
        return NULL;
    }
    else{
        s = (List)malloc(sizeof(struct LNode));    
        s -> Data = X;        
        s -> Next = p -> Next;    //s是新元素
        p -> Next = s;
        return PtrL;
}

    ​4->删除

    ​①找到i-1个节点,用p指向

    ​②用s指向要被删除的节点(p的next)

    ​③修改指针,删除s指向节点

    ​④释放s空间

List Delete(int i ,List PtrL)
{
    List s, p;
    if( i == 1){
        s = PtrL;
        if(PtrL != NULL) PtrL = PtrL -> Next    //从链表中删除s
        else return NULL;
        free(s);    //释放s空间
        return PtrL;
        }
        p = FindKth(i-1 , PtrL);    //查找i-1个节点
        if(p = = NULL){
            printf("第%d个节点不存在",i-1);return NULL;
        }else if( p -> Next == NULL){
            printf("第%d个节点不存在",i);return NULL;
        }else{
            s = p -> Next;
            p -> Next = s -> Next;
            free(s);
            return PtrL;
}

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

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

相关文章

Sentinel 流控注解使用

大概原理&#xff1a;通过反射解析注解 SentinelResource信息完成调用&#xff0c;处理方法&#xff0c;类似AOP编程 处理方法的返回类型要保持一致&#xff0c;参数和顺序保持一致&#xff0c; 可以在参数列表最后加 com.alibaba.csp.sentinel.slots.block.BlockException; …

【leetcode面试经典150题】62. K 个一组翻转链表(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

OpenHarmony音视频—opus

简介 Opus是一种用于在互联网上进行交互式语音和音频传输的编解码器。它可以从低比特率窄带语音扩展到非常高的高品质立体声音乐。 下载安装 直接在OpenHarmony-SIG仓中搜索opus并下载。 使用说明 以OpenHarmony 3.1 Beta的rk3568版本为例 将下载的opus库代码存在以下路径&a…

视觉slam14讲-大纲-持续更新

视觉slam入门太难 数学理论编程知识计算机视觉知识 缺一不可&#xff0c;大家一起加油

ACL的基本配置

已经启用&#xff52;&#xff49;&#xff50;实现了全网可达。 这时我们要拒绝R1与R4的路由通信&#xff0c;做标准ACL过滤关注源IP需要尽量靠近目标。则在R4的物理接口G0/0/1的&#xff49;&#xff4e;接口上做&#xff0c;不能在R4的环回接口上做&#xff0c;因为ACL列表…

网络管理和文件传输的工具推荐

在Hadoop及以后的相关学习中 我给大家推荐两款好用的软件 Xshell和Xftp是两款常用于网络管理和文件传输的工具。 首先&#xff0c;让我来介绍一下Xshell。Xshell是一款功能强大的SSH&#xff08;Secure Shell&#xff09;客户端&#xff0c;它允许用户通过安全加密的方式远程…

【web网页制作】html+css旅游家乡山西主题网页制作(3页面)【附源码】

山西旅游网页目录 涉及知识写在前面一、网页主题二、网页效果Page1、景点介绍Page2、酒店精选|出行攻略Page3、景色欣赏 三、网页架构与技术3.1 脑海构思3.2 整体布局3.3 技术说明书 四、网页源码4.1 主页模块源码4.2 源码获取方式 作者寄语 涉及知识 山西旅游主题网页制作&am…

idea显示maven或者gradle无法从仓库获取到项目中的jar包,jar包所在仓库无法访问解决方法,百试百灵

**idea显示maven或者gradle无法从仓库获取到项目中的jar包&#xff0c;jar包所在仓库无法访问解决方法&#xff0c;百试百灵** 直接上图&#xff0c;大概的故障问题就是&#xff1a;idea导入新的项目&#xff0c;因为项目中很多的jar需要从远程仓库下载&#xff0c;但是远程仓库…

跟着Carl大佬学leetcode之844 比较含退格的字符串

来点强调&#xff0c;刷题是按照代码随想录的顺序进行的&#xff0c;链接如下https://www.programmercarl.com/本系列是记录一些刷题心得和学习过程&#xff0c;就看到题目自己先上手试试&#xff0c;然后看程序员Carl大佬的解释&#xff0c;自己再敲一遍修修补补&#xff0c;练…

IDM的实用功能介绍+下载地址

下载地址 &#xff1a; 下载到idm 互联网下载管理器&#xff08;IDM&#xff09;实用功能概述 1. 多线程下载 IDM使用多线程技术&#xff0c;将文件分割成多个部分同时下载&#xff0c;显著提高下载速度。 2. 计划任务 用户可以设定下载任务的开始时间&#xff0c;甚至在特…

SSDReporter for Mac:全面检测SSD健康,预防数据丢失,让您的Mac运行更稳定

SSDReporter for Mac是一款专为Mac用户设计的固态硬盘&#xff08;SSD&#xff09;健康状况检测工具&#xff0c;旨在帮助用户全面了解并监控其Mac设备中SSD的工作状态&#xff0c;从而确保数据的完整性和设备的稳定性。 这款软件具有多种强大的功能。首先&#xff0c;它能够定…

DevOps流程的简单总结

DevOps流程图&#xff1a; DevOps流程包含&#xff1a;计划&#xff08;plan&#xff09;、编码(code)、编译(build)、测试(test)、发布(release)、部署(deploy)、运营(operate)、监控&#xff08;monitor&#xff09;&#xff0c;这是一个循环的过程。DevOps是依托容器、自动化…

数据赋能(62)——要求:数据管理部门能力

“要求&#xff1a;数据管理部门能力”是作为标准的参考内容编写的。 在实施数据赋能中&#xff0c;数据管理部门的能力体现在多个方面&#xff0c;关键能力如下图所示。 在实施数据赋能的过程中&#xff0c;数据管理部门应具备的关键能力如下。 数据治理与标准化能力 数据管…

python爬虫-----深入了解 requests 库(第二十五天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

C#控制台相关方法

控制台相关方法 文章目录 控制台输入1、清空2、设置控制台3、设置光标位置&#xff0c;1y 2x4、设置颜色相关5、光标显隐6、关闭控制台思考 移动方块 控制台输入 //如果ReadKey(true)不会把输入的内容显示再控制台上 char c Console.ReadKey(true).KeyChar;1、清空 ​ Cons…

Golang | Leetcode Golang题解之第40题组合总和II

题目&#xff1a; 题解&#xff1a; func combinationSum2(candidates []int, target int) (ans [][]int) {sort.Ints(candidates)var freq [][2]intfor _, num : range candidates {if freq nil || num ! freq[len(freq)-1][0] {freq append(freq, [2]int{num, 1})} else {…

免费高效无广告!开源的跨平台文件下载器:FileCentipede

FileCentipede&#xff1a;高速、全能、零广告的开源跨平台下载神器&#xff0c;汇聚多种协议&#xff0c;为您带来前所未有的免费下载体验&#xff01;- 精选真开源&#xff0c;释放新价值。 概览 在这个数字数据几乎构成一切的时代&#xff0c;从最终用户的角度来看&#xf…

2.4 Web容器配置:Tomcat

2.4 Web容器配置 2.4.1Tomcat配置1.常规配置2. HTTPS配置 *********** 2.4.1Tomcat配置 1.常规配置 在SpringBoot项目中&#xff0c;可以内置Tomcat、Jetly、Undertow、Netty等容器。 当开发者添加了spring-boot-starter-web依赖之后&#xff0c;默认会使用Tomcat作为Web容器…

微软 SDL 安全研发生命周期详解

微软SDL&#xff08;Security Development Lifecycle&#xff09;是一种安全软件开发的方法论&#xff0c;它强调在整个产品开发过程中融入安全考虑因素。SDL 是一个动态的过程&#xff0c;包括多个阶段和活动&#xff0c;以确保产品的安全开发、测试、部署和运行。Microsoft 要…

深入理解数据结构第五弹——排序(2)——快速排序

排序&#xff08;1&#xff09;&#xff1a;深入了解数据结构第四弹——排序&#xff08;1&#xff09;——插入排序和希尔排序-CSDN博客 前言&#xff1a; 在前面我们已经讲过了几种排序方式&#xff0c;他们的效率有快有慢&#xff0c;今天我们来学习一种非常高效的排序方式…