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

顺序表与链表学习笔记

顺序表及其结构定义

(1)结构定义

  • 顺序存储
    • 顺序表的元素按顺序存储在一块连续的内存区域中,每个元素占用相同大小的存储空间。
    • 通过数组实现,每个元素可以通过下标快速访问。
  • 存储密度高
    • 因为顺序表使用连续的内存空间,所以其存储密度很高,没有额外的指针存储开销。
  • 随机访问
    • 顺序表支持O(1)时间复杂度的随机访问,可以通过下标直接访问任意位置的元素。
    • 访问时间复杂度:O(1)。
  • 动态性
    • 顺序表通常预留一定的存储空间来处理动态增长,但在容量不足时需要扩展数组。
    • 扩展数组时需要重新分配一块更大的连续内存,并将现有元素复制到新内存区域中。
  • 插入和删除操作
    • 在顺序表的末尾进行插入和删除操作的时间复杂度为O(1)。
    • 在顺序表的中间或开头进行插入和删除操作的时间复杂度为O(n),因为需要移动大量元素以保持连续存储。
  • 空间浪费问题
    • 如果顺序表预留了过多的空间而未使用,会导致空间浪费。
    • 如果预留的空间不足,需要频繁扩展数组,会导致性能下降。

顺序表代码实现

#include<stdio.h>
#include <stdlib.h>
#include <time.h>typedef struct vector {int size, count;int *data;
}vector;vector* getNewVector(int n) {vector *p = (vector *)malloc(sizeof(vector));p->size = n;p->count = 0;p->data = (int *)malloc(sizeof(int) * n);return p;
}int expand(vector *v) {if (v == NULL) return 0;printf("expand v from %d to %d\n", v->size, v->size * 2);int *p = (int *)realloc(v->data , sizeof(int) * v->size * 2);if (p == NULL) return 0;v->data = p;v->size *= 2;return 1;
}int insert(vector *v, int pos, int val) {if (pos  < 0 || pos > v->count) return 0;if (v->size == v->count && !expand(v)) return 0;for (int i = v->count - 1; i >= pos; i--) {v->data[i + 1] = v->data[i];}v->data[pos] = val;v->count += 1;return 1;
}int erase(vector *v, int pos) {if (pos < 0 || pos >= v->count) return 0;for (int i = pos + 1; i < v->count; i++) {v->data[i - 1] = v->data[i];}v->count -= 1;return 1;
}void clear(vector *v) {if (v == NULL) return ;free(v->data);free(v);return ;
}void output_vector(vector *v) {int len = 0;for (int i = 0; i < v->size; i++) {len += printf("%3d", i);}printf("\n");for (int i = 0; i < len; i++) printf("-");printf("\n");for (int i = 0; i < v->count; i++) {printf("%3d", v->data[i]);}printf("\n\n\n");return ;
}int main() {srand(time(0));#define MAX_OP 20 vector *v = getNewVector(2);for (int i = 0; i < MAX_OP; i++) {int op = rand() % 4, pos, val, ret;switch (op) {case 0:case 1: case 2: {pos = rand() % (v->count + 2);val = rand() % 100;ret = insert(v, pos, val);printf("insert %d at %d to vector = %d\n", val, pos, ret);} break;case 3: {pos = rand() % (v->count + 2);ret = erase(v, pos);printf("erase item at %d in vector = %d\n", pos, ret);} break;}output_vector(v);}clear(v);return 0;
}

链表及其结构定义

链表是一种灵活的线性数据结构,与数组(顺序表)相比具有许多不同的性质。以下是链表的主要结构性质:

  • 动态内存分配

    • 动态性:链表节点在需要时动态分配内存,不需要事先分配固定大小的内存空间。链表的大小可以在运行时根据需要动态增长或收缩。
    • 内存利用率高:链表避免了数组可能出现的空间浪费问题,因为它只使用需要的内存。
  • 节点结构

    • 节点组成:链表由一系列节点组成,每个节点包含数据部分和指针部分。数据部分存储实际的数据,指针部分用于指向下一个节点(或前后节点)。

      	typedef struct Node {int data;struct Node *next;
      } Node;
  • 顺序访问

    • 线性访问:链表不支持随机访问,只能从头节点开始顺序访问每个节点。访问第n个节点的时间复杂度为O(n)。
    • 指针操作:链表操作依赖于指针,需要进行频繁的指针操作(如指针的赋值和修改)。
  • 插入和删除操作

    • 高效操作:插入和删除操作在链表任意位置的时间复杂度为O(1),只需修改相关指针。不需要像数组那样移动大量数据,因此在处理动态数据时效率较高。

    5. 指针操作

    • 复杂性:链表的操作依赖于指针,需要进行频繁的指针操作(如指针的赋值和修改)。指针操作复杂度较高,容易出错。
    • 额外空间:链表每个节点需要额外的指针空间,与数组相比,链表有一定的空间开销。

不同类型的链表特性

  • 单向链表

    • 单向链接:每个节点包含一个指向下一个节点的指针。

    • 末尾节点:链表末尾的节点指针为NULL,表示链表的结束。

      typedef struct Node {int data;struct Node *next;
      } Node;
  • 双向链表

    • 双向链接:每个节点包含一个指向下一个节点的指针和一个指向前一个节点的指针。

    • 双向访问:可以从任意节点方便地访问其前驱节点和后继节点。

    • 额外开销:每个节点需要额外的空间存储前驱节点的指针。

      	typedef struct DNode {int data;struct DNode *prev;struct DNode *next;
      } DNode;
  • 循环链表

    • 循环结构:循环链表的最后一个节点的指针指向头节点,形成一个环。

    • 循环单向链表:最后一个节点的next指向头节点。

    • 循环双向链表:最后一个节点的next指向头节点,头节点的prev指向最后一个节点。

      // 循环单向链表
      typedef struct CNode {int data;struct CNode *next;
      } CNode;// 循环双向链表
      typedef struct CDNode {int data;struct CDNode *prev;struct CDNode *next;
      } CDNode;
  • 链表的应用场景

    • 插入和删除频繁:链表适用于插入和删除操作频繁的场景,如实现栈、队列、符号表等。
    • 内存管理:链表可以更好地管理内存,在需要频繁分配和释放内存的场景中表现优异。
  • 链表的缺点

    • 随机访问效率低:链表不支持高效的随机访问,只能顺序访问,访问效率较低。
    • 指针开销:每个节点需要存储额外的指针信息,相对于数组,链表有一定的空间开销。
    • 复杂性:链表的指针操作较为复杂,容易出错,调试困难。

单链表代码实现

#include<stdio.h>
#include<stdlib.h>
#include<time.h>typedef struct Node {int data;struct Node *next;
}Node;Node *getNewNode(int val) {Node *p = (Node *)malloc(sizeof(Node));p->data = val;p->next = NULL; return p;
}Node *insert(Node *head, int pos, int val) {Node new_head, *p = &new_head, *node = getNewNode(val);new_head.next = head;for (int i = 0; i < pos; i++)  p = p->next;node->next = p->next;p->next = node;return new_head.next;
}void clear(Node *head) {if (head == NULL) return ;for (Node *p = head, *q; p; p = q) {q = p->next;free(p);}return ;
}void output_linlist(Node *head, int flag) {int  n = 0; for (Node *p = head; p; p = p->next) n += 1;for (int i = 0; i < n; i++) {printf("%3d", i);printf("  ");}printf("\n");for (Node *p = head; p; p = p->next) {printf("%3d", p->data);printf("->");}printf("\n");if (flag == 0) printf("\n\n");return ;
}int find(Node *head, int val) {Node *p = head;int n = 0;while (p) {if (p->data == val) {output_linlist(head, 1);int len = 5 * n + 2;for (int i = 0; i < len; i++) printf(" ");printf("^\n");for (int i = 0; i < len; i++) printf(" ");printf("|\n");return 1;}n++;p = p->next;}return 0;
}int main() {srand(time(0));#define MAX_OP 10Node *head = NULL;for (int i = 0; i < MAX_OP; i++) {int pos = rand() % (i + 1), val = rand() % 100, ret;printf("insert %d at %d to linklist\n", val, pos);head = insert(head, pos, val);output_linlist(head, 0);}int val;while (~scanf("%d", &val)) {if (find(head, val) == 0) {printf("not found\n");}}clear(head);return 0;
}``

相关文章:

顺序表与链表学习笔记

顺序表及其结构定义 &#xff08;1&#xff09;结构定义 顺序存储&#xff1a; 顺序表的元素按顺序存储在一块连续的内存区域中&#xff0c;每个元素占用相同大小的存储空间。通过数组实现&#xff0c;每个元素可以通过下标快速访问。 存储密度高&#xff1a; 因为顺序表使用…...

2.SQL注入-字符型

SQL注入-字符型(get) 输入kobe查询出现id和邮箱 猜测语句,字符在数据库中需要用到单引号或者双引号 select 字段1,字段2 from 表名 where usernamekobe;在数据库中查询对应的kobe&#xff0c;根据上图对应上。 select id,email from member where usernamekobe;编写payload语…...

在Ubuntu 14.04上安装和配置Elasticsearch的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 Elasticsearch 是一个用于实时分布式搜索和数据分析的平台。它因易用性、强大功能和可扩展性而备受欢迎。 Elasticsearch 支持 R…...

C++:inline关键字nullptr

inline关键字 C中inline使用关键点强调 (1)inline是一种“用于实现的关键字”&#xff0c;而不是一种“用于声明的关键字”&#xff0c;所以关键字 inline 必须与函数定义体放在一起&#xff0c;而不是和声明放在一起 (2)如果希望在多个c文件中使用&#xff0c;则inline函数应…...

数字信号处理实验三(IIR数字滤波器设计)

IIR数字滤波器设计&#xff08;2学时&#xff09; 要求&#xff1a; 产生一复合信号序列&#xff0c;该序列包含幅度相同的28Hz、50Hz、100Hz、150Hz的单音&#xff08;单频&#xff09;信号&#xff1b;其中&#xff0c;50Hz及其谐波为工频干扰&#xff08;注&#xff1a;采样…...

Why is Kafka fast?(Kafka性能基石)

Kafka概述 Why is kafka fast&#xff1f; 思考一下&#xff0c;当我们在讨论Kafka快的时候我们是在谈论什么呢&#xff1f;What does it even mean that Kafka is fast? 我们是在谈论kafka的低延迟&#xff08;low latency&#xff09;还是在讨论吞吐量&#xff08;through…...

Linux下的SSH详解及Ubuntu教程

前言 SSH&#xff08;Secure Shell&#xff09;是一种用于计算机之间安全通信的协议&#xff0c;广泛应用于远程登录、系统管理和文件传输等场景。本文将详细介绍SSH在Linux系统&#xff08;特别是Ubuntu&#xff09;下的使用&#xff0c;包括安装、配置、密钥管理和常见应用&…...

MobPush HarmonyOS NEXT 版本集成指南

开发工具&#xff1a;DevEco Studio 集成方式&#xff1a;在线集成 HarmonyOS API支持&#xff1a;> 11 集成前准备 注册账号 使用MobSDK之前&#xff0c;需要先在MobTech官网注册开发者账号&#xff0c;并获取MobTech提供的AppKey和AppSecret&#xff0c;详情可以点击查…...

什么是封装?为什么要封装?

什么是封装&#xff1f; 封装是计算机科学中的一个重要概念&#xff0c;尤其在面向对象编程&#xff08;OOP&#xff09;中占据核心地位。封装主要指的是将数据&#xff08;属性&#xff09;和对这些数据的操作&#xff08;方法&#xff09;组合在一个单元中&#xff08;我们称…...

远程桌面无法复制粘贴文件到本地怎么办?

远程桌面不能复制粘贴问题 Windows远程桌面为我们提供了随时随地访问文件和数据的便捷途径&#xff0c;大大提升了工作和生活的效率。然而&#xff0c;在使用过程中&#xff0c;我们也可能遇到一些问题。例如&#xff0c;在通过远程桌面传输文件时&#xff0c;常常会出现无法复…...

LeetCode 207. 课程表

思路&#xff1a;这是一道拓扑排序问题&#xff0c;拓扑排序听起来可能有点复杂&#xff0c;但实际上它是个相当直观的概念。想象一下&#xff0c;你有很多事情要做&#xff0c;但有些事情必须在另一些事情完成之后才能开始&#xff0c;就像你得先穿上袜子再穿鞋子 拓扑排序就…...

数据结构历年考研真题对应知识点(树的基本概念)

目录 5.1树的基本概念 5.1.2基本术语 【森林中树的数量、边数和结点数的关系&#xff08;2016&#xff09;】 5.1.3树的性质 【树中结点数和度数的关系的应用&#xff08;2010、2016&#xff09;】 【指定结点数的三叉树的最小高度分析&#xff08;2022&#xff09;】 5.1…...

Pytorch和Tensorflow安装【Win和Linux】

Ubuntu/win安装Pytorch和Tensorflow 说明: 这两种框架的搭建,均基于Anaconda进行搭建。先在系统中安装Anaconda软件。 一、Pytorch的搭建 windows安装 (1)搭建参考官网给的命令,pytorch官网 (2)下载地址:https://download.pytorch.org/whl/torch_stable.html 从上述…...

筑算网基石 创数智未来|锐捷网络闪耀2024 MWC上海

2024年6月26日至28日&#xff0c;全球科技界瞩目的GSMA世界移动大会&#xff08;MWC 上海&#xff09;在上海新国际博览中心&#xff08;SNIEC&#xff09;盛大召开。作为行业领先的网络解决方案提供商&#xff0c;锐捷网络以“筑算网基石 创数智未来”为主题&#xff0c;带来了…...

T4打卡 学习笔记

所用环境 ● 语言环境&#xff1a;Python3.11 ● 编译器&#xff1a;jupyter notebook ● 深度学习框架&#xff1a;TensorFlow2.16.1 ● 显卡&#xff08;GPU&#xff09;&#xff1a;NVIDIA GeForce RTX 2070 设置GPU from tensorflow import keras from tensorflow.keras…...

抖音矩阵云混剪系统源码 短视频矩阵营销系统V2(全开源版)

>>>系统简述&#xff1a; 抖音阵营销系统多平台多账号一站式管理&#xff0c;一键发布作品。智能标题&#xff0c;关键词优化&#xff0c;排名查询&#xff0c;混剪生成原创视频&#xff0c;账号分组&#xff0c;意向客户自动采集&#xff0c;智能回复&#xff0c;多…...

zabbix报警机制

zabbix思路流程...

【Matlab】-- 飞蛾扑火优化算法

文章目录 文章目录 01 飞蛾扑火算法介绍02 飞蛾扑火算法伪代码03 基于Matlab的部分飞蛾扑火MFO算法04 参考文献 01 飞蛾扑火算法介绍 飞蛾扑火算法&#xff08;Moth-Flame Optimization&#xff0c;MFO&#xff09;是一种基于自然界飞蛾行为的群体智能优化算法。该算法由 Sey…...

全面体验ONLYOFFICE 8.1版本桌面编辑器

ONLYOFFICE官网 在当今的数字化办公环境中&#xff0c;选择合适的文档处理工具对于提升工作效率和团队协作至关重要。ONLYOFFICE 8.1版本桌面编辑器&#xff0c;作为一款集成了多项先进功能的办公软件&#xff0c;为用户提供了全新的办公体验。今天&#xff0c;我们将深入探索…...

建议csdn赶紧将未经作者同意擅自锁住收费的文章全部解锁,别逼我用极端手段让你们就范

前两天我偶然发现csdn竟然将我以前发表的很多文章锁住向读者收费才让看。 csdn这种无耻行径往小了说是侵犯了作者的版权著作权&#xff0c;往大了说这是在打击我国IT领域未来的发展&#xff0c;因为每一个做过编程工作的人都知道&#xff0c;任何一个程序员的学习成长过程都少不…...

Pycharm一些问题解决办法

研究生期间遇到关于Pycharm一些问题报错以及解决办法的汇总 ModuleNotFoundError: No module named sklearn’ 安装机器学习库&#xff0c;需要注意报错的sklearn是scikit-learn缩写。 pip install scikit-learnPyCharm 导包提示 unresolved reference 描述&#xff1a;模块…...

ONLYOFFICE 桌面编辑器 8.1 发布:全新 PDF 编辑器、幻灯片版式、增强 RTL 支持及更多本地化选项

目录 什么是ONLYOFFICE&#xff1f; ONLYOFFICE 主要特点包括&#xff1a; 官网信息&#xff1a; 1. 功能齐全的 PDF 编辑器 1.1 编辑 PDF 文本 1.2 插入和修改对象 1.3 创建和填写表单 2. 幻灯片版式功能 2.1 快速应用幻灯片版式 2.2 动画窗格的改进 3. 文档编辑、…...

Linux高并发服务器开发(六)线程

文章目录 1. 前言2 线程相关操作3 线程的创建4 进程数据段共享和回收5 线程分离6 线程退出和取消7 线程属性&#xff08;了解&#xff09;8 资源竞争9 互斥锁9.1 同步与互斥9.2 互斥锁 10 死锁11 读写锁12 条件变量13 生产者消费者模型14 信号量15 哲学家就餐 1. 前言 进程是C…...

Google发布Gemma 2轻量级开放模型 以极小的成本提供强大的性能

除了 Gemini 系列人工智能模型外&#xff0c;Google还提供 Gemma 系列轻量级开放模型。今天&#xff0c;他们发布了 Gemma 2&#xff0c;这是基于全新架构设计的下一代产品&#xff0c;具有突破性的性能和效率。 Gemma 2 有两种规格&#xff1a;90 亿 (9B) 和 270 亿 (27B) 个参…...

精品UI知识付费系统源码网站EyouCMS模版源码

这是一款知识付费平台模板&#xff0c;后台可上传本地视频&#xff0c;批量上传视频连接&#xff0c; 视频后台可设计权限观看&#xff0c;免费试看时间时长&#xff0c;会员等级观看&#xff0c;付费观看等功能&#xff0c; 也带软件app权限下载&#xff0c;帮助知识教育和软件…...

使用Apache POI库在Java中导出Excel文件的详细步骤

使用Apache POI库在Java中导出Excel文件的详细步骤 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技…...

基于C#在WPF中使用斑马打印机进行打印

最近在项目中接手了一个比较有挑战性的模块——用斑马打印机将需要打印的内容打印出来。苦苦折腾了两天&#xff0c;总算有所收获&#xff0c;就发到网上来骗骗分数-_-|| 项目中使用的打印机型号为GX430t的打印机&#xff0c;接手的时候&#xff0c;自己对于打印机这块儿是眼前…...

六、资产安全—信息分级资产管理与隐私保护练习题(CISSP)

六、资产安全—信息分级资产管理与隐私保护(CISSP): 六、资产安全—信息分级资产管理与隐私保护(C...

使用 AutoGen 的 AI 智能体设计模式

1.Auto Gen框架 在Auto中,每种智能体分别扮演不同的角色。 ConversableAgent 作为最高级别的智能体抽象,为所有具体智能体提供了基础的通信能力。这包括发送和接收信息的能力,以及基于这些信息进行内部状态更新的能力。所有从这个类派生的智能体都继承了这些基本功能…...

Android InputChannel连接

InputChannel是InputDispatcher 和应用程序 (InputTarget) 的通讯桥梁&#xff0c;InputDispatcher 通知应用程序有输入事件&#xff0c;通过InputChannel中的socket进行通信。 连接InputDispatcher和窗口 WinodwManagerService:addwindow: WMS 添加窗口时&#xff0c;会创建…...

织梦新闻门户网站模板/网络推广外包公司

1&#xff0c;空指针和索引越界 ArrayIndexOutOfBoundsException:数组索引越界异常 原因&#xff1a;你访问了不存在的索引。 b:NullPointerException:空指针异常 原因&#xff1a;数组已经不在指向堆内存了。而你还用数组名去访问元素。 【1】ArrayIndexOutOfBoundsExcepti…...

办公网站建设/搜索引擎优化seo多少钱

Java对象的内存布局及堆内存划分前言对象的指向Java内存模型Object objnew Object()占用字节对象的访问句柄访问和直接指针访问对比堆内存Young区Old区名词扫盲一个对象的人生轨迹图总结前言 上一篇我们分析了Java虚拟机方法执行流程及方法重载和方法重写原理&#xff0c;并分…...

怎么做多个域名指向一个网站/外贸谷歌推广怎么样

可以使用以下 SQL 查询来实现&#xff1a; SELECT teacher_id, teacher_name, title, course_name, evaluation, evaluation_level FROM teachers JOIN courses ON teachers.teacher_id courses.teacher_id其中&#xff0c;teachers 表存储教师的信息&#xff0c;包括教师号、…...

如何用图片做网站背景/百度投流运营

java中int和Integer的区别 一看就懂int 是基本类型&#xff0c;直接存数值integer是对象&#xff0c;用一个引用指向这个对象1.Java 中的数据类型分为基本数据类型和复杂数据类型int 是前者>>integer 是后者(也就是一个类)Integer 是对象类型 int是原始类型 适用场合有很…...

室内设计联盟模型下载/seo推广优化

近期&#xff0c;JetBrains发布了其旗舰产品IntelliJ IDEA的2018.2版本。新版本支持即将推出的Java 11、断点意图&#xff08;Breakpoints Intentions&#xff09;、MacBook的Touch Bar等特性&#xff0c;并改进了Spring Boot、Scala和Docker插件。\\Java\\IntelliJ IDEA 2018.…...

东莞网站推广怎么做/潍坊seo建站

预计更新第一章. Python 简介 Python 简介和历史Python 特点和优势安装 Python 第二章. 变量和数据类型 变量和标识符基本数据类型&#xff1a;数字、字符串、布尔值等字符串操作列表、元组和字典 第三章. 控制语句和函数 分支结构&#xff1a;if/else 语句循环结构&#…...