写一下线性表

如果你是c语言, "不会"c++, 那么...

把iostream当成stdio.h
把cout当成printf, 不用管啥类型, 变量名字一给输出完事
把cin>>当成scanf, 变量名字一给输入完事
把endl当成\n, 换行.

哦对了, malloc已经不建议使用了, 现在使用new, 把new当作malloc, 把delete当作free就行

ok, 现在你掌握了c++的基础内容, 现在我们接着往下看...

感觉没啥好写的...背一下时空复杂度, 这两个我直接从gpt复制来的, 看看就行. 

1. 顺序存储结构(数组)

顺序存储结构用一段连续的内存空间依次存放线性表的元素。

  • 特点

    1. 内存位置连续,每个元素的存储位置都可以通过首地址和偏移量计算出来,访问速度快(时间复杂度为 (O(1)))。

    2. 插入和删除操作需要移动大量元素(最坏情况下时间复杂度为 (O(n)))。

    3. 存储空间在定义时需要预先分配,可能存在内存浪费或空间不足问题。

  • 常见操作

    1. 查找第 (i) 个元素:直接通过数组下标访问,时间复杂度为 O(1)。

    2. 插入元素:在指定位置插入新元素,需要将插入位置后的元素依次向后移动一位,时间复杂度为 O(n)。

    3. 删除元素:删除指定位置的元素,需要将删除位置后的元素依次向前移动一位,时间复杂度为 O(n)。

2. 链式存储结构(链表)

链式存储结构使用一组任意的存储单元存储线性表的元素,每个元素由一个数据域和一个指针域组成,指针域指向下一个元素的地址。

  • 特点

    1. 元素的存储位置不连续,通过指针链接各个元素。

    2. 插入和删除操作不需要移动其他元素,只需修改指针指向,时间复杂度为 (O(1))。

    3. 查找某个元素需要从头开始遍历,时间复杂度为 (O(n))。

  • 常见操作

    1. 查找第 (i) 个元素:需要从链表头开始遍历,时间复杂度为 (O(n))。

    2. 插入元素:只需修改插入位置前后的指针关系,时间复杂度为 (O(1))。

    3. 删除元素:只需修改删除位置前后节点的指针关系,时间复杂度为 (O(1))。

然后链表的创建摧毁, 没啥说的...

#include<string>
#include<iostream>
using namespace std;struct Node
{int data;Node* next;
};//print
void Print(Node* head)
{Node* current = head;while (current!= NULL){std::cout << current->data << " ";current = current->next;}std::cout << std::endl;
}//insert
void Insert(Node** head, int data)
{Node* newNode = new Node();newNode->data = data;newNode->next = *head;*head = newNode;
}// 释放链表的内存
void freeList(struct Node* head) {struct Node* current = head;struct Node* next;while (current != NULL) {next = current->next; // 保存下一个节点delete current;       // 释放当前节点current = next;       // 移动到下一个节点}
}int main()
{Node* head = NULL;Insert(&head, 1);Insert(&head, 2);Insert(&head, 3);Insert(&head, 4);Print(head);freeList(head);head = NULL;
;return 0;
}

对于查找, 删除, 写一下数组, 不难理解

#include<iostream>
using namespace std;void printArray(int* arr, int size);
void deleteNode(int* arr, int size, int index);
void searchNode(int* arr, int size, int index);
void gotoNode(int* arr, int size, int index);void test01()
{int array[10] = { 7,3,5,5,6,0,8,9,2,1 };int size = sizeof(array) / sizeof(array[0]);deleteNode(array, size, 3);printArray(array, size);searchNode(array, size, 5);gotoNode(array, size, 7);
}//O(n)
void deleteNode(int* arr,int size, int index)
{for (auto i = 0; i != size;++i){if (arr[i] == index){for (auto j = i; j != size - 1; ++j){arr[j] = arr[j + 1];}arr[size - 1] = 0;}}
}//O(n)
void searchNode(int* arr, int size, int index)
{for (auto i = 0; i != size; ++i){if (arr[i] == index){cout << "Found at index " << i << endl;return;}}cout << "Not found" << endl;
}//O(1)
void gotoNode(int* arr, int size, int index)
{if (index < 0 || index >= size){cout << "Index out of range" << endl; return;}elsecout << "Value at index " << index << " is " << arr[index] << endl;
}void printArray(int* arr, int size) {for (auto i = 0; i != size; ++i){cout << arr[i] << " ";}cout << endl;
}int main()
{test01();
}

查找删除也写一下链表, 也不难

#include<iostream>
using namespace std;struct Node
{Node* next;int data;Node(int x = 10){data = x;next = nullptr;}
};//O(1)
void insert_front(Node** head, int x)
{Node* newNode = new Node(x);if (*head == nullptr){*head = newNode;newNode->next = nullptr;}else{newNode->next = *head;*head = newNode;(*head)->next = nullptr;}
}//O(n)
void insert_end(Node** head, int x)
{Node* NewNode = new Node(x);if (*head == nullptr)*head = NewNode;//newnode->next=nullptr;那么head指向新节点,next指向nullptrelse{Node* iterator = (*head)->next;while (iterator->next!= nullptr)iterator = iterator->next;iterator->next = NewNode;}
}
//O(n)
void search(Node** head, int x)
{Node* iterator = *head;while (iterator!= nullptr){if (iterator->data == x)cout << "Found" << endl;iterator = iterator->next;}if (iterator == nullptr)cout << "Not Found" << endl;
}//O(n)
void delete_front(Node** head)
{if (*head == nullptr)cout << "List is empty" << endl;else{Node* temp = *head;*head = (*head)->next;delete temp;}
}
//O(n)
void delete_end(Node** head)
{if (*head == nullptr)cout << "List is empty" << endl;else{Node* iterator = *head;while (iterator->next->next!= nullptr)iterator = iterator->next;delete iterator->next;iterator->next = nullptr;}
}
//O(n)  (先查后删,出要是查...)
void delete_node(Node** head, int x)
{if (*head == nullptr)cout << "List is empty" << endl;Node* iterator = *head;while (iterator->next != nullptr && iterator->next->data != x){iterator = iterator->next;}if (iterator->next == nullptr)cout << "Not Found" << endl;else{Node* temp = iterator->next;iterator->next = iterator->next->next;delete temp;}
}
//查不写了, 和上面那个一样.//直接删节点
//也是, 先查后删, 主要是查...

后来我发现我们老师讲的就十分幽默...当然也很规范, 使用最好最坏平均分析

 翟旭你期末看到这里怎么不给我点赞啊

我们有单向链表双向链表循环链表, 一个个实现的话...

来吧那就.

单向我不写了, 上面那个就是

循环那个也差不多, 就是尾节点->next指向头节点

算了我直接写一下吧,  边写代码边写注释, 理解起来会很快

#include<iostream>
using namespace std;//实现循环链表//我们最好设置一个哨兵头节点//定义节点结构
struct Node{int data;Node* next;Node(int x=0):data(x),next(NULL){};
};//定义循环链表类class CircularLinkedList {
private:Node* sentinel;//可以把他看做你熟知的head, 这有很多好处
public://构造函数CircularLinkedList(){sentinel = new Node();sentinel->next = sentinel;//#1}//析构函数~CircularLinkedList(){Node* current = sentinel->next;Node* temp = NULL;while (current != sentinel){temp = current;current = current->next;delete temp;}delete sentinel;}//插入元素void insert(int value){Node* new_node = new Node(value);new_node->next = sentinel->next;sentinel->next = new_node;}//删除元素void remove(int value){Node* current = sentinel->next;Node* previous = sentinel;while (current->data != value){previous = current;current = current->next;if (current == sentinel->next)return;}previous->next = current->next;delete current;}//查找元素bool find(int value){Node* current = sentinel->next;while (current->data != value){current = current->next;if (current == sentinel->next)return false;}return true;}//打印链表void print(){Node* current = sentinel->next;do {cout << current->data << " ";current = current->next;} while (current != sentinel->next);}
};

双向稍微处理一下逻辑就好了

比如删除删除某个节点, 那么就直接考虑前后

我们使用ABC来表示, 删除B

那么BC双向链接断开, AB双向链接断开,有四条指针需要理解, B->next和front<-B都不需要了, B指针先delete然后赋值为nullptr, 然后 B->next和front<-B 都nullptr

A->next和front<-C悬空着, 他们俩正好连在一起

你可以把它想象成一个乐高, 前面和面一个插入一个被插入

再比如插入, 还是ABC距离, 那么AC断开, A->next和front<-C悬空, 接到B上, 然后B一前一后分别插入A和被C插入, ok.

很简单的逻辑. 和单向链表真的很像, 顺便一提, 你可以把单向列表想象成一个平头乐高块, 都见过吧, 顶上是光滑的, 没有头的那种. 

今天儿子驾考过了, 开心

ok.

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

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

相关文章

【工具变量】科技金融试点城市DID数据集(2000-2023年)

时间跨度&#xff1a;2000-2023年数据范围&#xff1a;286个地级市包含指标&#xff1a; year city treat post DID&#xff08;treat*post&#xff09; 样例数据&#xff1a; 包含内容&#xff1a; 全部内容下载链接&#xff1a; 参考文献-pdf格式&#xff1a;https://…

【JVM】概述

前言 Java的技术体系主要由支撑Java程序运行的虚拟机、提供各开发领域接口支持的Java类库、Java编程语言及许许多多的第三方Java框架&#xff08;如Spring、MyBatis等&#xff09;构成。在国内&#xff0c;有关Java类库API、Java语言语法及第三方框架的技术资料和书籍非常丰富&…

Spring Boot蜗牛兼职网:全栈开发

第4章 系统设计 4.1 系统体系结构 蜗牛兼职网的结构图4-1所示&#xff1a; 图4-1 系统结构 登录系统结构图&#xff0c;如图4-2所示&#xff1a; 图4-2 登录结构图 蜗牛兼职网结构图&#xff0c;如图4-3所示。 图4-3 蜗牛兼职网结构图 4.2开发流程设计 系统流程的分析是通…

抖音短视频矩阵系统OEM源码开发注意事项,功能开发细节流程全揭秘

抖音短视频矩阵系统OEM源码开发注意事项,功能开发细节流程全揭秘 在当今数字化时代背景下&#xff0c;短视频产业正经历前所未有的快速发展。其中&#xff0c;抖音凭借其创新的算法及多元内容生态获得巨大成功&#xff0c;吸引了众多用户。对于意欲进入短视频领域的创业者而言&…

移动技术开发:ListView水果列表

1 实验名称 ListView水果列表 2 实验目的 掌握自定义ListView控件的实现方法 3 实验源代码 布局文件代码&#xff1a; activity_main.xml: <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.androi…

springboot注册和注入组件方式概览

IoC&#xff1a;Inversion of Control&#xff08;控制反转&#xff09; 控制&#xff1a;资源的控制权&#xff08;资源的创建、获取、销毁等&#xff09; 反转&#xff1a;和传统的方式不一样了 DI &#xff1a;Dependency Injection&#xff08;依赖注入&#xff09; 依赖&…

国人卖家可折叠无线充电器发起TRO专利维权,功能相同可能侵权

案件基本情况&#xff1a;起诉时间&#xff1a;2024-8-5案件号&#xff1a;2024-cv-22971原告&#xff1a;SHANGXING TECHNOLOG (SHENZHEN) CO., LTD原告律所&#xff1a;Rubio & Associates, P.A.起诉地&#xff1a;佛罗里达州南部法院涉案商标/版权&#xff1a;原告品牌简…

信息安全数学基础(19)同余式的基本概念及一次同余式

一、同余式概念 同余式是数论中的一个基本概念&#xff0c;用于描述两个数在除以某个数时所得的余数相同的情况。具体地&#xff0c;设m是一个正整数&#xff0c;a和b是两个整数&#xff0c;如果a和b除以m的余数相同&#xff0c;则称a和b模m同余&#xff0c;记作a≡b(mod m)。反…

计算机视觉的应用34-基于CV领域的人脸关键点特征智能提取的技术方法

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用34-基于CV领域的人脸关键点特征智能提取的技术方法。本文主要探讨计算机视觉领域中人脸关键点特征智能提取的技术方法。详细介绍了基于卷积神经网络模型进行人脸关键点提取的过程&#xff0c;包括使…

Linux相关概念和重要知识点(5)(权限的修改、时间属性)

1.权限的修改 &#xff08;1&#xff09;提权行为 普通用户是会受到权限的限制&#xff0c;但root账户无视一切权限限制&#xff0c;因此当我们要获取更高的权限&#xff0c;有一种办法就是将自己变成root或者短暂拥有和root一样的权力。 普通用户 -> root &#xff1a;s…

人工智能有助于解决 IT/OT 集成安全挑战

思科的一项研究表明&#xff0c;信息技术 (IT) 和运营技术 (OT) 融合所带来的安全问题可以通过人工智能 (AI) 解决&#xff0c;尽管该技术也可能被恶意行为者利用。 该报告由思科和 Sapio Research 联合发布&#xff0c;对 17 个国家的 1,000 名行业专业人士进行了调查&#x…

硬件(驱动开发)

一、OSC基本架构&#xff08;片上系统&#xff09; OSC&#xff08;On-chip System Control&#xff0c;片上系统控制&#xff09;基本架构通常涉及片上系统中的各个组件如何进行协调与控制&#xff0c;以实现高效的处理、通信和管理。OSC架构在现代微处理器和系统单芯片&…

华为HarmonyOS地图服务 3 - 如何开启和展示“我的位置”?

一. 场景介绍 本章节将向您介绍如何开启和展示“我的位置”功能&#xff0c;“我的位置”指的是进入地图后点击“我的位置”显示当前位置点的功能。效果如下&#xff1a; 二. 接口说明 “我的位置”功能主要由MapComponentController的方法实现&#xff0c;更多接口及使用方法…

rocky Linux 9.4系统配置zabbix监控MySQL主从复制状态与配置钉钉告警

MySQL主从复制原理&#xff1a; 1. 主从复制的基本概念 主服务器&#xff08;Master&#xff09;&#xff1a;负责处理所有的写操作&#xff08;INSERT、UPDATE、DELETE&#xff09;&#xff0c;并将这些操作记录到二进制日志&#xff08;binary log&#xff09;中。 从服务器…

计算机网络(月考一知识点)

文章目录 计算机网络背诵默写版计算机网络知识点&#xff08;月考1版&#xff09; 计算机网络背诵默写版 为我自己留个印记&#xff0c;本来荧光笔画的是没记住的&#xff0c;但是后面用紫色的&#xff0c;结果扫描的时候就看不见了。 计算机网络知识点&#xff08;月考1版&a…

静态链表:实现、操作与性能优势【算法 16】

静态链表&#xff1a;实现、操作与性能优势 在算法和数据结构的探索中&#xff0c;链表作为一种基础且灵活的数据结构&#xff0c;广泛应用于各种场景。然而&#xff0c;在算法竞赛或需要高效内存管理的环境中&#xff0c;传统的动态链表可能会因为内存分配和释放的开销而影响性…

【H2O2|全栈】关于CSS(5)如何制作一个搜索网页的首页?

目录 CSS基础知识 前言 准备工作 简单网页的组成部分 案例 浏览器的窗口大小 划分主要部分 固定定位 头部导航&#xff08;左侧&#xff09; 头部导航&#xff08;右侧&#xff09; LOGO ​编辑搜索框 热搜标题 热搜内容 文字简介 资源 预告和回顾 后话 CSS…

Tomcat中BIO和NIO的区别(Tomcat)

BIO Tomcat中BIO的模型和理论很简单&#xff0c;例图如下 1.Acceptor线程死循环阻塞接收客户端的打过来的socket请求 2.接收到请求之后打包成一个SocketProcessor&#xff08;Runnable&#xff09;&#xff0c;扔到线程池中读取/写入数据 参数配置 1.Acceptor默认线程是1&#…

网络丢包定位记录(二)

网卡驱动丢包 查看&#xff1a;ifconfig eth1/eth0 等接口 1.RX errors: 表示总的收包的错误数量&#xff0c;还包括too-long-frames错误&#xff0c;Ring Buffer 溢出错误&#xff0c;crc 校验错误&#xff0c;帧同步错误&#xff0c;fifo overruns 以及 missed pkg 等等。 …

Cursor免费 GPT-4 IDE 工具的保姆级使用教程

Cursor免费 GPT-4 IDE 工具的保姆级使用教程 简介 Cursor 是一款基于人工智能技术的代码生成工具。 它利用先进的自然语言处理和深度学习算法&#xff0c;可根据用户的输入或需求&#xff0c;自动生成高质量代码。 不管是初学者&#xff0c;还是资深开发者&#xff0c;Curs…