C++关于链表基础知识

单链表

// 结点的定义

template <class T>

struct Node 

{

        T data ;

        Node <T> *next;   //指向下一个node 的类型与本node相同

}

// 最后一个node指针指向Null

 生成结点:  Node <T> * p =  new Node < T>;

为结点赋值:       p-> data = 'a';

                        p- > next = (其他结点的地址);  p -> next = NULL ; (尾结点)

                        delete p; //释放结点

// 单链表的类实现

template <class T> 

class LinkList

{

public :    //此处是函数定义

        LinkList();   

        ListList(T a[ ] , int n);

        int Lenght(); 

        T Get(int);  //俺下标查找

        int Loate(T); //按值定位

        void insert(T,int);  //插入

        T delete (int) ;  //删除

        ~LinkList();  

private:

        Node <T> * first;      

}

构造函数的实现一个空链表:

template <class T>
LinkList <T> :: LinkList()
{first = new Node <T>;    first->next = NULL;           
}

头插法

初始化头节点(头节点指的是first,首结点代表链表第一个结点)

template <class T>
LinkList <T> :: LinkList (T a[ ] ,int n)
{//初始化头节点first = new Node<T>;first ->next =NULL;for (int i =0 ; i<n ;i++){//生成新的结点Node <T> *s = new Node <T>;s ->data =a [i]; //链接再头节点和首结点之间s->next = first ->next;first ->next = s ;}
}

核心代码:

        s->next = first ->next;
        first ->next = s ;

因为对于first ->next的初始化指向是NULL;此处赋值给s->next则表示了s->next指向了NULL

然后将地址s赋值给了first ->next(头节点的地址域)

尾插法

template <class T>
LinkList <T> :: LinkList (T a[ ] ,int n)
{//初始化头节点Node<T> *first = new Node<T>;Node<T> *r = first;    //尾结点首先指向firstfor (int i =0 ; i<n ;i++){//生成新的结点Node <T> *s = new Node <T>;s ->data =a [i];s ->next =NULL;   //由于是尾插,直接指向NULL //链接在尾结点后面:r->next = s;//尾结点后移,由于此时的新的结点s是尾结点r= s;}//这里也可以加一句r->next = NULL;
}

  析构函数: 

template <class T>
LinkList <T> :: ~linkList
{while (first != NULL)   //或者直接while(first){Node <T> *p = first;first = first->next;delete p; }
}

按照值查找: 

查找值为x的结点的位置

顺序查找:

template <class T>
int LinkList <T> :: locate (T x)  // T类型的x
{Node<T> *p = first->next ;//首结点后的第一个结点int j=1;while(p)   //p不为空一直循环,p为NULL的时候即循环到结尾{if(p->data ==x ) return j;p = p->next ;j++;}return 0;
}

 按照值查找返回结点 ,非模板类实现:


Node * LinkList:: local (int val )
{Node* p = first;while (p ){if (p ->data == val){return p;}p = p -> next;}return NULL;
}

按下标查找:

template <class T>
T LinkList <T> :: Get (int i){
//初始化Node<T> * p = first ->next ;int j =1;while(j<i && p!=NULL)  {p= p->nextj++;}if(p==NULL || i<1) throw"位置非法";return p->data ;
}

随意位置插入:

思路:

新建结点 Node<T> *s = new Node <T>;   s->data = x;   

插入 : s ->next = p->next ;         (p->next 的值是ai的地址,将其赋值给新节点地址域)

             p->next =s ;

//将值为x的结点插入到位置为i的结点,那么首先要找到i-1 号结点
template <class T>
void LinkList <T> :: Insert (T x , int i)
{Node <T> * p = first ; int j = 0 ;while (p && j<i-1){p = p->next ; j++;}if (p == NULL) throw "插入位置非法"else {// 新建结点 Node<T> *s = new Node <T>;s->data = x;      //插入s ->next = p->next ; p->next =s ;}
}

在指定结点后插入:

//在指定的p结点之后插入
template <class T>
void LinkList <T> :: insertAfter (Node<T> * p , T x )
{Node <T> *s =  new Node <T>;s -> data =x ;s->next = p->next; p- next = s ;
}//在指定的p结点之前插入
//需要先找到p结点的前面一个结点q ,循环来找
template <class T>
void ListList <T> ::insertBefore (Node<T>  * p ,T x )
{Node <T> *q = first ; //从头节点开始找while (q ->next != p ){   // 找到q结点的条件q =q->next ; }insertAfter (q,x);  //在q后插入,等于在p前插入
}
//上述方法时间复杂度是O(n)
//下列实现时间复杂度是O(1)
template <class T>
void LinkList <T> :: insertBefore (Node <T> * p ,T x)
{Node <T> *s = new Node<T>;* s = *p ;p ->next = s;    //将原来的p结点当成新插入的结点,把新的结点变为p结点放在后面p ->data = x;    // 等同于前插
}

结点删除:

首先需要把ai代表的结点摘除,使用s 表示:
        s = p->next ;

        p->next = s -> next ;

然后删除结点:

        delete s ;

template <class T>
T LinkList <T> ::  detele (int i)
{Node <T> * p = first ;int j = 0;while(p  && j <i ){p = p->next ;j++ ;}if (p->next ==NULL)throw "删除位置非法"else {s = p->next ;   //让中间结点(待删除)赋值给sp->next = s ->next ;  // 然后第三结点赋值给第一个结点的地址域delete s; //删除中间结点}
}
// 上述操作时间复杂度O(n)
//改成O(1):
template <class T>  //返回T因为一般删除都会返回结点的x值
T LinkList <T> ::delete (Node <T> *p )
{if(p->next){// p非最后一个结点 ,使用删除后面的一个结点代替删除自己T x =p ->data ;p -> data = p ->next ->data ;Node <T>  *q = p ->next ;  //表示出来后一个结点q ->next = p ->next  ; //准备将q出链delete q;return x ;//一般删除结点都返回其值else{...正常循环}
}
}

或者非模板的普通函数实现://输入是指针

void delNode (ListNode *prev)
{ListNode * curr = prev -> next;prev->next = curr -> next ;delete curr;
}

求取链表长度:

template <class T>
int LinkList <T> :: Length(){Node <T> * p = first ;int i =0;while ( p ){p = p ->next;i++;}return i;
}
//上述时间复杂度 O(N)

循环链表:

尾指针地址域指向头节点,上述代码循环条件改为p!= r

双链表:

每个结点有两个指针域,指向前驱和后继

template <class T> 
struct DulNode 
{T data;DulNode <T> * prior, *next ;
}

插入操作:

首先更改新结点的指针域

然后动链表

删除操作:

顺序表和链表的对比:

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

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

相关文章

【微服务】服务注册与发现 - Eureka(day3)

CAP理论 P是分区容错性。简单来说&#xff0c;分区容错性表示分布式服务中一个节点挂掉了&#xff0c;并不影响其他节点对外提供服务。也就是一台服务器出错了&#xff0c;仍然可以对外进行响应&#xff0c;不会因为某一台服务器出错而导致所有的请求都无法响应。综上所述&…

LabVIEW机床加工监控系统

随着制造业的快速发展&#xff0c;机床加工的效率与稳定性成为企业核心竞争力的关键。传统的机床监控方式存在效率低、无法远程监控的问题。为了解决这些问题&#xff0c;开发了一种基于LabVIEW的机床加工监控系统&#xff0c;通过实时监控机床状态&#xff0c;改进生产流程&am…

PhotoMaker部署文档

一、介绍 PhotoMaker&#xff1a;一种高效的、个性化的文本转图像生成方法&#xff0c;能通过堆叠 ID 嵌入自定义逼真的人类照片。相当于把一张人的照片特征提取出来&#xff0c;然后可以生成你想要的不同风格照片&#xff0c;如写真等等。 主要特点&#xff1a; 在几秒钟内…

[C语言]指针和数组

目录 1.数组的地址 2.通过指针访问数组 3.数组和指针的不同点 4.指针数组 1.数组的地址 数组的地址是什么&#xff1f; 看下面一组代码 #include <stdio.h> int main() { int arr[5] {5,4,3,2,1}; printf("&arr[0] %p\n", &arr[0]); printf(&qu…

【c++】string类 (一)

简介 由于c的历史包袱&#xff0c;c要兼容c语言&#xff0c;c的字符串要兼容c语言&#xff0c;在 C 中&#xff0c;字符串通常使用两种主要的方式来表示&#xff1a; C风格字符串&#xff08;C-style strings&#xff09;&#xff1a; 依然是以 \0 结尾的字符数组。这种表示方…

设置服务器走本地代理

勾选&#xff1a; 然后&#xff1a; git clone https://github.com/rofl0r/proxychains-ng.git./configure --prefix/home/wangguisen/usr --sysconfdir/home/wangguisen/etcmakemake install# 在最后配置成本地代理地址 vim /home/wangguisen/etc/proxychains.confsocks4 17…

Web安全 - 文件上传漏洞(File Upload Vulnerability)

文章目录 OWASP 2023 TOP 10导图定义攻击场景1. 上传恶意脚本2. 目录遍历3. 覆盖现有文件4. 文件上传结合社会工程攻击 防御措施1. 文件类型验证2. 文件名限制3. 文件存储位置4. 文件权限设置5. 文件内容检测6. 访问控制7. 服务器配置 文件类型验证实现Hutool的FileTypeUtil使用…

计算机网络:计算机网络体系结构 —— OSI 模型 与 TCP/IP 模型

文章目录 计算机网络体系结构OSI 参考模型TCP/IP 参考模型分层的必要性物理层的主要问题数据链路层的主要问题网络层的主要问题运输层的主要问题应用层的主要问题 分层思想的处理方法发送请求路由器转发接受请求发送响应接收响应 计算机网络体系结构 计算机网络体系结构是指将…

简单部署vue+springboot项目

vue 参考博客 先将vue项目打包 npm run build 再创建项目文件夹front,在front中新建nginx.conf server {listen 80;server_name localhost;# 请求体的大小限制client_max_body_size 50m;# 日志文件存放地址access_log /var/log/nginx/host.access.log main;error…

openpnp - 图像传送方向要在高级校正之前设置好

文章目录 openpnp - 图像传送方向要在高级校正之前设置好笔记图像传送方向的确定END openpnp - 图像传送方向要在高级校正之前设置好 笔记 图像传送方向和JOG面板的移动控制和实际设备的顶部摄像头/底部摄像头要一致&#xff0c;这样才能和贴板子时的实际操作方向对应起来。 …

C++ | Leetcode C++题解之第456题132模式

题目&#xff1a; 题解&#xff1a; class Solution { public:bool find132pattern(vector<int>& nums) {int n nums.size();vector<int> candidate_i {nums[0]};vector<int> candidate_j {nums[0]};for (int k 1; k < n; k) {auto it_i upper_…

测试-BUG篇

文章目录 软件测试的生命周期BUGbug的概念描述bug的要素bug级别bug的生命周期 与开发产生争执怎么办&#xff08;高频考题&#xff09; 软件测试的生命周期 软件测试贯穿于软件的整个生命周期 BUG bug的概念 是指计算机程序中存在的一个错误(error)、缺陷(flaw)、疏忽(mista…

docker环境下配置cerbot获取免费ssl证书并自动续期

文章目录 实践场景了解certbot查看nginx的映射情况操作目标配置nginx配置的ssl证书设置自动续签 实践场景 本人使用docker部署了一个nginx容器&#xff0c;通过容器卷&#xff0c;实现本地html&#xff0c;ssl&#xff0c;conf和ngiinx容器映射的&#xff0c; 经常需要手动部署…

适合跑步的开放式耳机哪个品牌好?怎么选?可入的蓝牙耳机推荐

想必很多爱晨跑的朋友&#xff0c;一定都有过这般令人困扰的经历。耳机戴久了总觉得不舒适&#xff0c;或是尺寸不合&#xff0c;或是材质欠佳&#xff0c;反正无论怎样调整&#xff0c;都很难找到最舒适的佩戴方式。而且&#xff0c;有时候戴的时间久了&#xff0c;还很容易掉…

FLUX的ID保持项目也来了! 字节开源PuLID-FLUX-v0.9.0,开启一致性风格写真新纪元!

之前的文章已经和大家介绍过字节开源的ID保持项目PuLID。随着FLUX模型的发布&#xff0c;PuLID也开源了 FLUX 版本的模型&#xff0c;不得不说FLUX的强大&#xff0c;两个月生态就赶上了SDXL。这次新发布PuLID-FLUX-v0.9.0模型&#xff0c;它为FLUX.1-dev提供了无需调整的ID定制…

4S店4S店客户管理系统小程序(lw+演示+源码+运行)

社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个用户的使用。手机具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;成本低等优点。 因此&#xff0c;构建符合自己要求的操作系统是非…

VirtulBOX Ubuntu22安装dpdk23.11

目录 依赖包安装 Python安装 numa安装 ​编辑Python pip3安装 ​编辑pyelftools安装 meson和ninja安装 ​编辑构建与编译 Meson构建DPDK ​编辑Ninja安装DPDK ​编辑VFIO-PCI驱动安装 大页内存和IOMMU配置 ​编辑VFIO-PCI加载 ​编辑VFIO-PCI驱动绑定 ​编辑dpdk…

Linux网络操作命令与函数全面总结

1. 引言 Linux作为服务器和开发平台&#xff0c;网络操作是其核心功能之一。本文旨在全面总结Linux系统中的网络操作方法&#xff0c;包括命令行工具和编程接口&#xff0c;帮助读者深入理解Linux网络管理的机制。 2. 命令行工具 2.1 ping 命令 ping 命令用于测试网络连接和…

【Linux】信号知识三把斧——信号的产生、保存和处理

目录​​​​​​​ 1、关于信号的前置知识 1.1.什么是信号&#xff1f; 1.2.为什么要学习信号&#xff1f; 1.3.如何学习信号&#xff1f; 1.4.一些常见的信号 1.5.信号的处理方式 1.6.为什么每一个进程都可以系统调用&#xff1f; 2.信号的产生 2.1.kill命令产生信号…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-28

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-28 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-28目录前言1. Cognitive phantoms in LLMs through the lens of latent variables摘要研究背景问题与挑战创新点算法模型实验效果…