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

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位置的元素替换成XPtrL -> Last++;    //Last+1return
}

    ​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,sif(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位置的元素,把指向该位置的指针赋值给pif(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    //从链表中删除selse 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.mzph.cn/pingmian/1736.shtml

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

相关文章

查询效率至少提高4倍的MySQL技巧

SQL语句中IN包含的值不应过多 MySQL对于IN做了相应的优化&#xff0c;即将IN中的常量全部存储在一个数组里面&#xff0c;而且这个数组是排好序的。但是如果数值较多&#xff0c;产生的消耗也是比较大的。再例如&#xff1a;select id from t where num in(1,2,3) 对于连续的数…

【免费题库】华为OD机试 - 根据IP查找城市(Java JS Python C C++)

须知 哈喽,本题库完全免费,收费是为了防止被爬,大家订阅专栏后可以私信联系退款。感谢支持 文章目录 须知题目描述输入描述输出描述解题思路:Java代码:JS代码:Python代码:C++代码:题目描述 某业务需要根据终端的IP地址获取该终端归属的城市,可以根据公开的IP地址池信…

Uipath用计划任务启动 bat脚本语句

方法一 cd C:\Program Files\UiPath\Studio UiRobot execute --file "Uipath路径\project.json" 这种是用UiRobot.exe来启动任务的 方法二 "C:\Progra~1\UiPath\Studio\UiRobot.exe" -file "C:\Users\Documents\UiPath\se_Windows.1.0.3.nupkg&q…

【前端】掌握按钮的显示与隐藏

目录 一、前言二、实现显示与隐藏的四种方式1、CSS属性控制2、JavaScript控制3、Vue.js响应式控制 三、需求背景四、代码实现1、定义变量2、绑定事件3、监听选中的学生4、返回return 五、整体效果1、没有勾选学生2、已勾选学生 六、设置按钮显示与隐藏的优势利弊1、优势2、劣势…

计算机网络面试问题

文章目录 1.DHCP协议:动态分配IP地址2.SNMP协议3.HTTP协议4.DNS协议1.DHCP协议:动态分配IP地址 (1)作用: DHCP服务器动态地将IP池里的IP地址分配给新加入网络的主机。基于4次UDP广播。 (2)DHCP的四种报文: 报文名源IP地址目的IP地址①DHCP发现报文 Discover0.0.0.0255.25…

MySQL慢查询怎么办?需要关注Explain的哪些关键字?

目录 1-引言&#xff1a;什么是慢查询1-1 慢查询定义1-2 为什么排查慢查询 2-核心&#xff1a;慢查询排查2-1 慢查询定位2-2 慢查询解决2-2-1 Explain 排查慢查询2-2-2 Explain 重点关键字 3-总结&#xff1a;慢查询知识点小结 1-引言&#xff1a;什么是慢查询 1-1 慢查询定义…

C# 字面量null对于引用类型变量✓和值类型变量×

编译器让相同的字符串字面量共享堆中的同一内存位置以节约内存。 在C#中&#xff0c;字面量&#xff08;literal&#xff09;是指直接表示固定值的符号&#xff0c;比如数字、字符串或者布尔值。而关键字&#xff08;keyword&#xff09;则是由编程语言定义的具有特殊含义的标…

微信小程序实现腾讯地图

1、// map.js Page({ data: { latitude: 0, // 初始纬度值 longitude: 0, // 初始经度值 markers: [] }, onReady: function (e) { this.getLocation(); // 主动获取用户地理位置信息 }, getLocation: function () { wx.getLocation({ type: gcj02, success: (res) > { thi…

羊大师解读,春季羊奶VS夏季羊奶

羊大师解读&#xff0c;春季羊奶VS夏季羊奶 夏季的羊奶和春季的羊奶在营养成分上并没有本质的区别&#xff0c;都含有丰富的蛋白质、矿物质和维生素等。然而&#xff0c;由于季节和气候的变化&#xff0c;人们饮用羊奶的需求和效果可能会有所不同。 在夏季&#xff0c;天气炎热…

C语言 | Leetcode C语言题解之第35题搜索插入位置

题目&#xff1a; 题解&#xff1a; int searchInsert(int* nums, int numsSize, int target) {int left 0, right numsSize - 1, ans numsSize;while (left < right) {int mid ((right - left) >> 1) left;if (target < nums[mid]) {ans mid;right mid - …

R语言 数据的整理与清洗(第一篇)

《Cookbook for R》 Manipulating Data ~ General Sorting 排序 1、vectors 向量 # 先随机生成一组向量 v <- sample(101:110)# 排序sort() sort(v) #> [1] 101 102 103 104 105 106 107 108 109 110# 反向排序 sort(v, decreasingTRUE) #> [1] 110 109 108 107 1…

Docker容器的使用与操作

1、什么是容器 镜像和容器的关系&#xff0c;就像是面向对象程序设计中的类和实例一样&#xff0c;镜像是静态的定义&#xff0c;容器是镜像运行时的实体&#xff0c;基于同一镜像可以创建若干个不同的容器。 每个容器都有一个软件镜像。可以将容器看作一个将应用程序及其依赖环…

使用vue3+ts+vite从零开始搭建bolg(二)

二、全局变量 2.1element-ui集成 pnpm i element-plus pnpm i element-plus element-plus/icons-vue main.ts配置文件 import ElementPlus from element-plus import element-plus/dist/index.css //ts-ignore import zhCn from element-plus/dist/locale/zh-cn.mjsapp.use…

浅说深度优先搜索(中)——回溯

写在最前 相信在你们不懈的努力之下&#xff0c;基本的递归一定可以写出来了&#xff0c;那么我们现在就来看看递归的升级版——回溯怎么写吧&#xff01; 简说回溯 递归是一种特别重要的解题策略。大部分题目需要找到最优解&#xff0c;而这个求解过程可能存在一定的规律性…

用单片机的矩阵键盘选择显示什么图像

注意行数据不能二进制 #include "reg51.h"typedef unsigned int u16; //对系统默认数据类型进行重定义 typedef unsigned char u8;//定义74HC595控制管脚 sbit SRCLKP3^6; //移位寄存器时钟输入 sbit RCLKP3^5; //存储寄存器时钟输入 sbit SERP3^4; //串行数据输入…

UE5(基础动作)多人游戏制作蹲伏

1.创建输入操作&#xff0c;IA_Crouch 在输入映射中添加 IA_Crouch,在触发器中创建两个索引&#xff0c;已按下已松开来创建蹲伏输入。 蹲伏操作必须要勾选角色-角色移动-crouch勾选可蹲伏否则你的人物无法真正蹲下。 为蹲伏创建函数&#xff0c;创建布尔来判断是否蹲伏。 通过…

CodeGemma初探

什么是 CodeGemma CodeGemma是一系列强大而轻量级的模型的集合&#xff0c;可以执行各种编码任务&#xff0c;包括填充中间代码补全、代码生成、自然语言理解、数学推理和指令跟随。 版本&#xff1a; instruct&#xff1a;7B, 这个版本专门针对自然语言到代码聊天和指令跟随…

day83 AJAX

1什么是AJAX AJAX语法 AJAX Asynchronous JavaScript and XML 异步js和XML 实现页面某一部份更新&#xff0c;无需服务器转发或重定向 1 $.ajax() 语法: $.ajax( { "url" : "url&qu…

数据库主从复制

一、主从复制概述 1、介绍&#xff1a; 主从复制是指将主数据库的 DDL 和 DML 操作写入到二进制日志中&#xff0c;将二进制日志传送到从库服务器&#xff0c;然后在从库上对这些日志重新执行&#xff08;重做&#xff09;&#xff0c;从而使得从库和主库的数据保持同步。 M…