数据结构——线性表

 逻辑结构——线性表

1.线性表的定义(逻辑结构)

要点:

  • 相同数据类型
  • 有限
  • 序列

几个概念: 

  • a_i是线性表中的“第i个”元素线性表中的位序
  • a_1是表头元素;a_n是表尾元素。
  • 除第一个元素外,每个元素有且仅有一个直接前驱;除最后一个元素外,每个元素有且仅有一个直接后继
  • ⭐注意:位序从1开始,数组下标从0开始

物理结构——顺序表

顺序表,按数组理解即可。 

2.顺序表 (物理结构)

顺序表:用顺序存储的方式实现线性表。

逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。

 


物理结构——链表 

什么是链表?

链表是一种通过指针串联在一起的线性结构。

每一个节点由两部分组成,一个是数据域 data ,一个是指针域 next(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。

 

3.单链表(物理结构)

单链表:每个结点除了存放数据元素外,还要存储指向下一个节点的指针。

单链表中的指针域只能指向节点的下一个节点。

单链表代码:

 

  • head 表示头结点的下标
  • e[i] 表示结点i的值
  • ne[i] 表示节点i的next指针是多少
  • idx 存储当前已经用到了哪个点 

 头插法

//头插法
void head_insert(int x){e[idx]=x;ne[idx]=head;head=idx;idx++;
} 

一般插入

 

//在第k个插入的数后插入一个数
void insert(int k,int x){//插入的是第k+1个数,下标是ke[idx]=x;ne[idx]=ne[k];ne[k]=idx;idx++;
} 

 全部代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+6;
int head,e[N],ne[N],idx;
//初始化
void initial(){head=-1,idx=1;
} 
//头插法
void head_insert(int x){e[idx]=x;ne[idx]=head;head=idx;idx++;
} //在第k个插入的数后插入一个数
void insert(int k,int x){//插入的是第k+1个数,下标是ke[idx]=x;ne[idx]=ne[k];ne[k]=idx;idx++;
} 
//删除第k个插入的数后面的数
void move(int k){//k=0时, if(k==0)head=ne[head];elsene[k]=ne[ne[k]];
} 
int main(){int m;cin>>m;//初始化memset(ne,-1,sizeof ne); initial();//cout<<ne[1]<<ne[10];while(m--){char a;cin>>a;if(a=='H'){int x;cin>>x;head_insert(x);}else if(a=='I'){int k,x;cin>>k>>x;insert(k,x);}else{//a==Dint k;cin>>k;move(k);}}//cout<<ne[15];//输出for(int i=head;i!=-1;i=ne[i]){cout<<e[i]<<" ";} return 0;
}

4.双链表(物理结构)

双链表:每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。

双链表既可以向前查询也可以向后查询。

双链表插入

//在第k个结点的右边插入一个结点
void r_insert(int k,int x){e[idx]=x;r[idx]=r[k];l[idx]=k;l[r[k]]=idx;r[k]=idx;idx++;
}
//在第k个结点的左边插入
void l_insert(int k,int x){r_insert(l[k],x); 
} 
//在最右侧插入
void right(int x){r_insert(l[1],x);
} 
//在最左侧插入
void left(int x){r_insert(0,x);
}

删除

//删除第K个插入的数 
void remove(int k){r[l[k]]=r[k];l[r[k]]=l[k]; 
}

所有代码

//双链表
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+6;
int l[N],r[N],idx,e[N];
//初始化
void init(){r[0]=1;l[1]=0;idx=2;
} 
//在第k个结点的右边插入一个结点
void r_insert(int k,int x){e[idx]=x;r[idx]=r[k];l[idx]=k;l[r[k]]=idx;r[k]=idx;idx++;
}
//在第k个结点的左边插入
void l_insert(int k,int x){r_insert(l[k],x); 
} 
//在最右侧插入
void right(int x){r_insert(l[1],x);
} 
//在最左侧插入
void left(int x){r_insert(0,x);
} 
//删除第K个插入的数 
void remove(int k){r[l[k]]=r[k];l[r[k]]=l[k]; 
}int main(){int m;cin>>m;char op[6];int x;int k;init();while(m--){scanf("%s",&op);if(op[0]=='L'){cin>>x;left(x);}else if(op[0]=='R'){cin>>x;right(x);}else if(op[0]=='D'){cin>>k;remove(k+1);}else if(op[1]=='L'){cin>>k>>x;l_insert(k+1,x);}else{cin>>k>>x;r_insert(k+1,x);}}//outputfor(int i=r[0];i!=1;i=r[i]) {cout<<e[i]<<" ";}return 0;}

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

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

相关文章

用C语言列出Linux或Unix上的网络适配器

上代码&#xff1a; 1. #include <sys/socket.h> 2. #include <stdio.h> 3. 4. #include <netdb.h> 5. #include <ifaddrs.h> 6. 7. int main() { 8. struct ifaddrs *addresses; 9. if(getifaddrs(&addresses) -1) { 10. printf("…

股票K线简介

股票K线&#xff08;K-Line&#xff09;是用于表示股票价格走势的图形&#xff0c;主要由四个关键价格点组成&#xff1a;开盘价、收盘价、最高价和最低价。K线图广泛应用于股票市场技术分析中&#xff0c;它提供了丰富的信息&#xff0c;帮助分析师和投资者理解市场的行情走势…

微信小程序(四十四)鉴权组件插槽-登入检测

注释很详细&#xff0c;直接上代码 新增内容&#xff1a; 1.鉴权组件插槽的用法 2.登入检测示范 源码&#xff1a; app.json {"usingComponents": {"auth":"/components/auth/auth"} }app.js App({globalData:{//定义全局变量isLoad:false} })…

数据分析基础之《pandas(7)—高级处理2》

四、合并 如果数据由多张表组成&#xff0c;那么有时候需要将不同的内容合并在一起分析 1、先回忆下numpy中如何合并 水平拼接 np.hstack() 竖直拼接 np.vstack() 两个都能实现 np.concatenate((a, b), axis) 2、pd.concat([data1, data2], axis1) 按照行或者列…

【JAVA WEB】JavaScript--函数 作用域 对象

目录 函数 语法格式 示例 定义没有参数列表&#xff0c;也没有返回值的一个函数 定义一个有参数列表 &#xff0c;有返回值的函数 关于参数个数 函数表达式 作用域 作用域链 对象 基本概念 创建对象 1.使用 字面量 创建对象 2.使用new Object()创建对象 3.使…

七、热身仪式(Warm-Up Rituals)

5.Warm Up Rituals 五、热身仪式 A warm up ritual is your per flight checklist you go through before you start focusing for a big session.It may be checking that you have water, that you don’t need to use the bathroom, that your phone is turned off or you’…

docker 3.1 镜像

docker 3.1 镜像命令 拉取镜像 docker pull debian #从 Docker Hub 拉取名为 debian 的镜像docker pull hello-world #从 Docker Hub 拉入名为 hello-world 的镜像‍ 运行镜像/容器 docker run hello-world ‍ 查看本地所有的镜像 docker images​​ 容器生成镜像…

STM32 cubemx配置DMA+空闲中断接收不定长数据

文章目录 前言一、串口空闲中断二、DMA空闲中断接收不定长数据实现思路三、STM32Cubemx配置DMA空闲中断接收不定长数据四、代码编写总结 前言 本篇文章给大家讲解一下DMA串口空闲中断接收串口不定长数据&#xff0c;之前我们也是讲解过串口接收不定长数据的&#xff0c;那么本…

2024.2.14

二维数组实现杨辉三角形 #include<stdio.h> #include<string.h> int main(int argc, const char *argv[]) {int n;scanf("%d",&n);int a[n][n];for(int i0;i<n;i){for(int j0;j<i;j){if(j0||ij){ a[i][j]1;}else{a[i][j]a[i-1][j]a[i-1][j-…

Netty应用(九) 之 编解码器概念 Netty常见的编解码器

目录 22.编解码器 22.1 编解码的概念 22.2 netty中的编解码 22.3 序列化 23.编解码器在使用过程中的两部分核心内容 23.1 序列化协议&#xff08;编码格式&#xff09;&#xff08;传输数据的格式&#xff09; 23.1.1 Java默认的序列化与反序列化 23.1.2 XML的序列化与反…

函数求导法则【高数笔记】

【分类】 1. 四则运算求导 2. 复合运算求导 3. 整体思想求导 #整体思想求导本质是运用复合运算求导&#xff0c;只不过是对复合运算求导的一种精炼 #无论是具体函数还是抽象函数求导&#xff0c;方法是一致的 【四则运算求导】 加&#xff0c;减&#xff0c;乘&#xff0c;除&a…

代码随想录算法训练营第四十九天(动态规划篇)| 474. 一和零, 完全背包理论基础

474. 一和零 题目链接&#xff1a;https://leetcode.cn/problems/ones-and-zeroes/submissions/501607337/ 思路 之前的背包问题中&#xff0c;我们对背包的限制是容量&#xff0c;即每个背包装的物品的重量和不超过给定容量&#xff0c;这道题的限制是0和1的个数&#xff0…

寒假 day13

1.请编程实现二维数组的杨慧三角 #include<stdio.h> #include<string.h> int main(int argc, const char *argv[]) { int n,i,j;printf("please enter n:");scanf("%d",&n);int arr[n][n];for(i0;i<n;i){for(j0;j<i;j){if(j0 || ij…

【51单片机】LCD1602(江科大)

1.LCD1602介绍 LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符,还可以有8个自定义字符 显示容量:162个字符,每个字符为5*7点阵 2.引脚及应用电路 3.内部结构框图 屏幕: 字模库:类似于数码管的数…

HTML 超文本标记语言

超文本标记语言 HTML 在一个客户程序主窗口上显示出的万维网文档称为页面 (page)。 页面制作的标准语言&#xff1a;HTML。 超文本标记语言 HTML (HyperText Markup Language) 是一种制作万维网页面的标准语言&#xff0c;它消除了不同计算机之间信息交流的障碍&#xff0c…

“掌握温度,感知湿度,一触即知!”DHT11温湿度传感器,为您的生活增添一份关怀与精准。#非标协议【下】

“掌握温度&#xff0c;感知湿度&#xff0c;一触即知&#xff01;”DHT11温湿度传感器&#xff0c;为您的生活增添一份关怀与精准。#非标协议【下】 前言预备知识1.DHT11温湿度传感器初识1.1产品概述1.2与51单片机接线1.3数据传送逻辑和数据格式 2.发送时序检测DHT11温湿度传感…

2.14 指针练习

1、选择题 1.1、若有下面的变量定义&#xff0c;以下语句中合法的是&#xff08; A &#xff09;。 int i&#xff0c;a[10]&#xff0c;*p&#xff1b; A&#xff09; pa2; B&#xff09; pa[5]; C&#xff09; pa[2]2; D&#xff09; p&(i2); 解析&am…

数据库管理-第150期 Oracle Vector DB AI-02(20240212)

数据库管理150期 2024-02-12 数据库管理-第150期 Oracle Vector DB & AI-02&#xff08;20240212&#xff09;1 LLM2 LLM面临的挑战3 RAG4 向量数据库LLM总结 数据库管理-第150期 Oracle Vector DB & AI-02&#xff08;20240212&#xff09; 作者&#xff1a;胖头鱼的鱼…

备战蓝桥杯---动态规划(入门1)

先补充一下背包问题&#xff1a; 于是&#xff0c;我们把每一组当成一个物品&#xff0c;f[k][v]表示前k组花费v的最大值。 转移方程还是max(f[k-1][v],f[k-1][v-c[i]]w[i]) 伪代码&#xff08;注意循环顺序&#xff09;&#xff1a; for 所有组&#xff1a; for vmax.....0…

Wireshark不显示Thrift协议

使用Wireshark对thrift协议进行抓包&#xff0c;但是只显示了传输层的tcp协议&#xff1a; "右键" -> "Decode As" 选择thrift的tcp端口 将“当前”修改为Thrift&#xff0c;然后点击“确定” 设置后&#xff0c;可以发现Wireshark里面显示的协议从Tcp变…