当前位置: 首页 > news >正文

数据结构与算法 顺序表、链表总结

文章目录

    • 顺序表
      • 1、顺序表的基本概念
  • 链表
    • 1 简介
      • 链表概念
      • 链表特点
      • 链表与数组的对比
    • 2 链表的类型
      • 分类
  • 链表
  • 循环单向链表
    • 1 简介
      • 概念
    • 2 数据存储和实现
      • 数据存储
      • 数据实现
    • 3 操作
      • 基本操作
      • 实现

线性表(List):零个或多个数据元素的有限序列。

在较复杂的线性表中,一个数据元素可以由若干个数据项组成。在这种情况下,常把数据元素称为记录,含有大量记录的线性表又称为文件

顺序表

1、顺序表的基本概念

概念:用一组地址连续的存储单元依次存储线性表的数据元素,这种存储结构的线性表称为顺序表。

特点:逻辑上相邻的数据元素,物理次序也是相邻的。

链表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NpMMu49F-1678256000198)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20230301091717476.png)]

1 简介

链表概念

  • 链表是一种随机存储在内存中的节点对象集合。
  • 节点包含两个字段,即存储在该地址的数据和包含下一个节点地址的指针。
  • 链表的最后一个节点包含指向null的指针。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VhHZYb70-1678256000199)(image/2021-03-12-21-00-33.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SclxGWqi-1678256000199)(image/2021-03-12-21-01-53.png)]

链表特点

  • 链表不需要连续存在于存储器中。节点可以是存储器中的任何位置并链接在一起以形成链表。这实现了空间的优化利用。
  • 链表大小仅限于内存大小,不需要提前声明。
  • 空节点不能出现在链表中。
  • 在单链表中存储基元类型或对象的值。

链表与数组的对比

  • 数组有以下限制:

    • 在程序中使用数组之前,必须事先知道数组的大小。
    • 增加数组的大小是一个耗时的过程。在运行时几乎不可能扩展数组的大小。
    • 数组中的所有元素都需要连续存储在内存中。在数组中插入任何元素都需要移动元素之前所有的数据。
  • 链表是可以克服数组所有限制的数据结构。 链表是非常有用的,因为,

    • 它动态分配内存。链表的所有节点都是非连续存储在存储器中,并使用指针链接在一起。
    • 大小调整不再是问题,因为不需要在声明时定义大小。链表根据程序的需求增长,并且仅限于可用的内存空间。

2 链表的类型

分类

  • 单链表
  • 双链表
  • 循环单链表
  • 循环双链表

链表

链式存储设计时,各个不同结点的存储空间可以不连续,但是结点内的存储单元地址则必须连续。

typedef struct LNode {int value; // value中存放结点值域,默认是int型struct Lnode *next;//指向后继结点的指针
}LNode; // 定义单链表结点类型
1234

上述定义了一个结构体,包括两部分,一是值域,二是指针域;每当定义一个结点都会产生这两个区域。
这个value与next域必须是挨着的,称这个结点为内部

假如我们定义若干个不同的结点,把它们连接起来成为一个单链表。

value区域,箭头区域则是指针域指向逻辑上相链接的下一个结点,但是它们在空间上不一定连续。
而对于它们的结点内部一定是连续的。若第一个结点占用两个地址,那么value域的起始地址是1,则指针域的地址就是2。同理若第二个结点的value地址是10,则next域就是11。

因此,在进行链式存储设计时,各个不同结点完全可以存储在不连续的空间上,而对于同一个结点内部,不论划分多少个区域,两个也好,三个也罢,总之内部的单元存储地址是连续的

循环单向链表

1 简介

概念

  • 在循环单链表中,链表的最后一个节点包含指向链表的第一个节点的指针。可以有循环单向链表以及循环双链表。
  • 遍历一个循环单链表,直到到达开始的同一个节点。循环单链表类似于链表,但它没有开始也没有结束。任何节点的下一部分都不存在NULL值。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4jLx1utk-1678256055499)(image/循环单向链表.png)]

2 数据存储和实现

数据存储

链表的最后一个节点包含链表的第一个节点的地址。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sgXy3iXl-1678256055501)(image/2021-03-12-21-21-07.png)]

数据实现

  • 链表通过结构体和指针实现
struct node   
{  int data;   struct node *next;  
};  
struct node *head, *ptr;   
ptr = (struct node *)malloc(sizeof(struct node *));
  • C++ STL提供了链表的实现
#include<list>list<int> li;
forward_list<int> li;

3 操作

基本操作

  • 创建
  • 遍历、搜索
  • 插入
  • 删除

实现

#include<stdio.h>  
#include<stdlib.h>  
struct node
{int data;struct node *next;
};
struct node *head;void beginsert();
void lastinsert();
void randominsert();
void begin_delete();
void last_delete();
void random_delete();
void display();
void search();
int main()
{int choice = 0;while (choice != 7){printf("*********Main Menu*********\n");printf("Choose one option from the following list ...\n");printf("===============================================\n");printf("1.Insert in begining\n2.Insert at last\n");printf("3.Delete from Beginning\n4.Delete from last\n");printf("5.Search for an element\n6.Show\n7.Exit\n");printf("Enter your choice?\n");scanf("%d", &choice);switch (choice){case 1:beginsert();break;case 2:lastinsert();break;case 3:begin_delete();break;case 4:last_delete();break;case 5:search();break;case 6:display();break;case 7:exit(0);break;default:printf("Please enter valid choice..");}}
}
void beginsert()
{struct node *ptr, *temp;int item;ptr = (struct node *)malloc(sizeof(struct node));if (ptr == NULL){printf("OVERFLOW");}else{printf("Enter the node data?");scanf("%d", &item);ptr->data = item;if (head == NULL){head = ptr;ptr->next = head;}else{temp = head;while (temp->next != head)temp = temp->next;ptr->next = head;temp->next = ptr;head = ptr;}printf("node inserted\n");}}
void lastinsert()
{struct node *ptr, *temp;int item;ptr = (struct node *)malloc(sizeof(struct node));if (ptr == NULL){printf("OVERFLOW\n");}else{printf("Enter Data?");scanf("%d", &item);ptr->data = item;if (head == NULL){head = ptr;ptr->next = head;}else{temp = head;while (temp->next != head){temp = temp->next;}temp->next = ptr;ptr->next = head;}printf("node inserted\n");}}void begin_delete()
{struct node *ptr;if (head == NULL){printf("UNDERFLOW");}else if (head->next == head){head = NULL;free(head);printf("node deleted\n");}else{ptr = head;while (ptr->next != head)ptr = ptr->next;ptr->next = head->next;free(head);head = ptr->next;printf("node deleted\n");}
}
void last_delete()
{struct node *ptr, *preptr;if (head == NULL){printf("UNDERFLOW");}else if (head->next == head){head = NULL;free(head);printf("node deleted\n");}else{ptr = head;while (ptr->next != head){preptr = ptr;ptr = ptr->next;}preptr->next = ptr->next;free(ptr);printf("node deleted\n");}
}void search()
{struct node *ptr;int item, i = 0, flag = 1;ptr = head;if (ptr == NULL){printf("Empty List\n");}else{printf("Enter item which you want to search?\n");scanf("%d", &item);if (head->data == item){printf("item found at location %d", i + 1);flag = 0;}else{while (ptr->next != head){if (ptr->data == item){printf("item found at location %d ", i + 1);flag = 0;break;}else{flag = 1;}i++;ptr = ptr->next;}}if (flag != 0){printf("Item not found\n");}}}void display()
{struct node *ptr;ptr = head;if (head == NULL){printf("nothing to print");}else{printf("printing values ... \n");while (ptr->next != head){printf("%d\n", ptr->data);ptr = ptr->next;}printf("%d\n", ptr->data);}}

相关文章:

数据结构与算法 顺序表、链表总结

文章目录顺序表1、顺序表的基本概念链表1 简介链表概念链表特点链表与数组的对比2 链表的类型分类链表循环单向链表1 简介概念2 数据存储和实现数据存储数据实现3 操作基本操作实现线性表&#xff08;List&#xff09;&#xff1a;零个或多个数据元素的有限序列。在较复杂的线性…...

Nginx集群搭建-三台

1.使用root用户登录Linux服务器 2.创建用户 输入 adduser test 后回车 #test 为创建的用户 3.为创建的用户设置密码 输入 passwd test 后回车 输入两次密码 4.出现 passwd&#xff1a;所有的身份验证令牌已经成功更新。证明Linux新用户和密码创建成功 5.使用新用户test登录Linu…...

【算法】图的存储和遍历

作者&#xff1a;指针不指南吗 专栏&#xff1a;算法篇 &#x1f43e;或许会很慢&#xff0c;但是不可以停下&#x1f43e; 文章目录1. 图的存储1.1 邻接矩阵1.2 邻接表2. 图的遍历2.1 dfs 遍历2.2 bfs 遍历1. 图的存储 引入 一般来说&#xff0c;树和图有两种存储方式&#…...

文件如何批量复制保存在多个文件夹中

在日常工作中经常需要整理文件&#xff0c;比如像文件或文件夹重命名或文件批量归类&#xff0c;文件批量复制到指定某个或多个文件来中保存备份起来。一般都家最常用方便是手动一个一个去重命名或复制到粘贴到某个文件夹中保存&#xff0c;有没有简单好用的办法呢&#xff0c;…...

16N60-ASEMI高压MOS管16N60

编辑-Z 16N60在TO-220封装里的静态漏极源导通电阻&#xff08;RDS(ON)&#xff09;为0.2Ω&#xff0c;是一款N沟道高压MOS管。16N60的最大脉冲正向电流ISM为48A&#xff0c;零栅极电压漏极电流(IDSS)为10uA&#xff0c;其工作时耐温度范围为-55~150摄氏度。16N60功耗&#xf…...

Open3D 多个点云配准(C++版本)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 多路配准(多个点云配准)是指在全局空间中对齐多个几何块的过程。输入的数据可以是点云或深度图像 P i P_i P...

java实现Hbase 增删改查

目录 一、新建一个maven工程 二、代码实现 2.1、配置hbase信息&#xff0c;连接hbase数据库 2.2、创建命名空间 2.3、创建表 2.4、删除表&#xff0c;删除之前要设置为禁用状态 2.5、添加数据 2.6、获取命令表空间 / tables列表 2.7、get方法查看表的内容 2.8、scan方法…...

1109. 航班预订统计 差分数组

1109. 航班预订统计 差分数组技巧适⽤于频繁对数组区间进⾏增减的场景 1.由数组a生成差分数组b{b[0]0,i0(或者b[0]a[0],i0)b[i]a[i]−a[i−1],i>01.由数组a生成差分数组b\left\{\begin{array}{l}b[0]0,i0(或者b[0]a[0],i0)\\ b[i]a[i]-a[i-1],i>0\end{array}\right. 1.由…...

图床搭建,使用typora上传

1. 准备gitee作为图床的仓库 新建仓库 准备仓库的私人令牌&#xff0c;后面配合使用 点击个人设置——》私人令牌 注意私人令牌&#xff0c;复制保存好&#xff0c;后面不能再看了 2. 准备PicGO&#xff0c;并进行相关配置 PicGo官方下载链接 下载安装好node.js,下载网址 安…...

低代码开发的优势是什么?

低代码开发的优势是什么?低代码开发这个概念这两年来经常出现在人们的视野中&#xff0c;市场对于低代码的需求也越来越庞大。 Gartner预测&#xff0c;到2025年&#xff0c;75%的大型企业将使用至少四种低代码/无代码开发工具&#xff0c;用于IT应用开发和公民开发计划。 可…...

Ip2Resion线上部署报数据越界及错误处理

上篇在本地测试调用Ip2Resigon解析行政区划 Ip2Region的Java本地实现运行正常&#xff0c;但部署到测试环境&#xff0c;抛出数组越界&#xff08;java.lang.ArrayIndexOutOfBoundsException&#xff09;异常。 环境信息 ip2Resion是2.7版本&#xff0c;对应文件后缀为 xdb。 …...

致敬我的C++启蒙老师,跟着他学计算机编程就对了 (文末赠书5本)

致敬我的C启蒙老师&#xff0c;跟着他学计算机编程就对了 摘要 讲述了一个故事&#xff0c;介绍了一位良师&#xff0c;一段因C而续写的回忆&#xff0c;希望对各位看官有所帮助和启发。 文章目录1 写在前面2 我的C启蒙老师3 谈谈老师给我的启发4 友情推荐5 文末福利1 写在前面…...

CSS中的伪元素和伪类

一直被伪类和伪元素所迷惑&#xff0c;以为是同一个属性名称&#xff0c;根据CSS动画&#xff0c;索性开始研究a:hover:after&#xff0c;a.hover:after的用法。 伪元素 是HTML中并不存在的元素&#xff0c;用于将特殊的效果添加到某些选择器。 对伪元素的描述 伪元素有两…...

逻辑优化基础-rewrite

简介 逻辑综合中的rewrite算法是一种常见的优化算法&#xff0c;其主要作用是通过对逻辑电路的布尔函数进行等效变换&#xff0c;从而达到优化电路面积、时序和功耗等目的。本文将对rewrite算法进行详细介绍&#xff0c;并附带Verilog代码示例。 一、算法原理 rewrite算法的…...

案例27-单表从9个更新语句调整为2个

目录 一&#xff1a;背景介绍 二&#xff1a;思路&方案 三&#xff1a;过程 1.项目结构 2.准备一个普通的maven项目&#xff0c;部署好mysql数据库 3.在项目中引入pom依赖 5.编写MyBitis配置文件 6.编写Mysql配置类 7.编写通用Update语句 8.项目启动类 四&#xff1a;总…...

Wordpress paid-memberships-pro plugins CVE-2023-23488未授权SQLi漏洞分析

目录 1.漏洞概述 2.漏洞等级 3.调试环境 4.漏洞代码 5 POC 1.漏洞概述 WordPress插件paid-memberships-pro版本<2.9.8中,容易受到REST路由“/pmpro/v1/order”的“code”参数中未验证的SQL注入漏洞的影响。攻击者可进行SQLi盲注,从而获取数据库权限。 CVE:...

【JavaWeb篇】JSTL相关知识点总结

目录 为什么会有JSTL&#xff1f; 什么是JSTL&#xff1f; 如何理解JSTL标准标签库呢&#xff1f; 如何使用JSTL&#xff1f; 第一步&#xff1a;引入JSTL标签库对应的jar包。 第二步&#xff1a;在JSP中引入要使用标签库。&#xff08;使用taglib指令引入标签库。&#x…...

【蓝桥杯刷题】坑爹的负进制转换

【蓝桥杯刷题】——坑爹的负进制转换&#x1f60e;&#x1f60e;&#x1f60e; 目录 &#x1f4a1;前言&#x1f31e;&#xff1a; &#x1f49b;坑爹的负进制转换题目&#x1f49b; &#x1f4aa; 解题思路的分享&#x1f4aa; &#x1f60a;题目源码的分享&#x1f6…...

react+antdpro+ts实现企业级项目二:Strapi及认证登陆模块

在上一章节中&#xff0c;我们已经成功创建并登陆了系统&#xff0c;现在需要为系统添加权限和登录认证&#xff0c;以提高系统的安全性、数据保护、个性化服务和用户体验。此外&#xff0c;添加权限和登录认证还可以方便管理员进行用户和授权管理。为了快速开发前端&#xff0…...

Android ANR trace日志如何导出

什么是ANR &#xff1f;上网搜索&#xff0c;一搜一大片&#xff0c;我就说个很容易识别的字眼&#xff0c;XXXAPP无响应 ANR trace日志如何导出&#xff1f;使用ADB命令&#xff1a; adb pull data/anr/trace.txt 你要存放的路径。查看ANR报错位置全局搜索你APP的包名&#x…...

AI创业从模型竞赛到场景落地:2026年生态爆发与实战指南

1. 从HumanX 2026归来&#xff1a;我眼中的AI创业生态爆发图景刚从HumanX 2026的会场回来&#xff0c;整个人还沉浸在那种高速迭代、热气腾腾的氛围里。如果你问我最大的感受是什么&#xff0c;我会毫不犹豫地说&#xff1a;AI创业的“场景化落地”竞赛&#xff0c;已经进入了白…...

PCB设计数据管理:挑战、实践与关键技术

1. PCB设计数据管理的核心挑战与行业现状在电子行业快速迭代的今天&#xff0c;印刷电路板(PCB)设计团队面临着前所未有的时间压力。根据行业调研数据&#xff0c;领先企业通过优化数据管理实现了22%的PCB开发时间缩减&#xff0c;而落后企业同期开发时间反而增加了9%。这种差距…...

a16n:实现AI编程助手配置可移植性的插件化转换工具

1. 项目概述&#xff1a;AI编程助手配置的“翻译官”如果你和我一样&#xff0c;同时在使用 Cursor 和 Claude Code 这类 AI 编程工具&#xff0c;那你一定遇到过这个痛点&#xff1a;好不容易在 Cursor 里调教好了一套完美的.cursorrules文件&#xff0c;定义了代码风格、项目…...

19 - 语言模型为何是AGI的开端?——从“知识压缩”到“智能涌现”的第一性原理

本专题系列文章共 21 篇,前 5 篇限时免费阅读 01 - 眩晕时代的定海神针:大模型落地的“第一性原理”与算力丰裕悖论 02 - 95%的AI投资打了水漂:五大错配如何扼杀你的“第二增长曲线” 03 - 从电力到AI:标准化已死,个性化永生——大模型时代的三大商业终局 04 - 你的护城…...

硅应变计与Σ-Δ ADC协同设计及温度补偿技术

1. 硅应变计与Σ-Δ ADC的协同优势解析硅基应变计在现代传感器领域占据重要地位&#xff0c;其核心原理基于压阻效应——当硅材料发生机械形变时&#xff0c;晶格结构变化导致载流子迁移率改变&#xff0c;从而引起电阻值变化。与传统金属箔应变计相比&#xff0c;硅应变计的灵…...

深度解析:Mermaid实时编辑器架构设计与工程实践指南

深度解析&#xff1a;Mermaid实时编辑器架构设计与工程实践指南 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-editor …...

AI技能(SKILL)中文翻译项目:打破语言壁垒,赋能中文AI社区

1. 项目概述&#xff1a;一个为中文AI社区“破壁”的翻译工程如果你和我一样&#xff0c;在过去一年里深度使用过Claude、ChatGPT或者各类AI Agent平台&#xff0c;那你一定对“SKILL”这个概念不陌生。简单来说&#xff0c;SKILL就是AI的“技能包”&#xff0c;它把特定领域的…...

技术决策的后悔药:选型错误后的补救策略

在软件测试的全生命周期中&#xff0c;技术选型是影响测试效率、质量与项目成败的关键环节。小到一款测试工具的挑选&#xff0c;大到整个测试框架的搭建&#xff0c;每一次决策都如同在迷雾中航行&#xff0c;稍有不慎便可能驶入“选型错误”的漩涡。当测试环境兼容性问题频发…...

别再为EVE-ng镜像发愁了!手把手教你从官网下载到VMware部署(附国内加速地址)

EVE-ng网络模拟器全流程实战&#xff1a;从镜像获取到高阶配置 第一次接触网络设备模拟的工程师&#xff0c;往往会在EVE-ng的入门阶段遇到各种"拦路虎"——镜像文件找不到可靠的下载源、导入VMware时配置出错、虚拟网络连接异常。这些问题如果得不到解决&#xff0c…...

PyTorch模型参数管理:从torch.nn.Parameter到高效训练实践

1. 理解torch.nn.Parameter的本质 第一次接触PyTorch的torch.nn.Parameter时&#xff0c;我也曾困惑它和普通Tensor的区别。直到在实际项目中踩了几个坑&#xff0c;才真正明白它的价值。让我们从一个简单的例子开始&#xff1a; import torch import torch.nn as nn# 普通Te…...