使用智能指针创建单链表

本文介绍了智能指针的概念,包括shared_ptr、unique_ptr和weak_ptr的分类和使用。通过示例展示了如何利用这些智能指针来创建和管理单链表,旨在帮助C++初学者理解智能指针在链表数据结构中的应用。
摘要由CSDN通过智能技术生成


前言

本章主要讲述如何使用智能指针及其分类,以及自己实现的单链表


一、什么是智能指针?

智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象的指针指向同一对象。

二、智能指针的分类及使用

在c++11中引入了shared_ptr、unique_ptr和weak_ptr;在此之前有也有一个智能指针叫做auto_ptr,在后来的新标准发布后不再使用

1.shared_ptr

是一种共享指针,主要用于类之间的数据交换,内含有一个计数器,当计数器为0时,指针自动释放。
例如:

shared_ptr<int> p1=make_shared<int>(10);//p1的计数器加1
shared_ptr<int> p2=make_shared<int>(11);//p2的计数器加1
p1=p2;//p2的计数器加1,p1计数器减一,此时p1得到计数器为0,指针指向的内容被释放

在这里插入图片描述
在这里插入图片描述

2.unique_ptr

独占数据的一个指针,指针销毁,数据销毁,只能使用直接赋值,不被被拷贝,拷贝构造和拷贝赋值操作符被删除

unique_ptr<int> p1=make_unique<int>(10);
unique_ptr<int> p2(new int(10));
unique_ptr<int> p3;

在这里插入图片描述

3.weak_ptr

弱共享指针,使用不会影响shared_ptr的计数器,不经常使用

在这里插入图片描述

三、单链表实现

List.h:

#pragma once
#include <iostream>
#include <memory>

us
创建一个包含n个编号节点的循环单链表通常涉及以下几个步骤: 1. 定义结构体或类:首先,你需要定义一个节点结构,它通常包含两个部分:数据域(例如存储数字的变量)和指针域(指向下一个节点的指针)。如果是在C++或类似语言中,可以这样定义: ```cpp struct Node { int data; Node* next; }; ``` 2. 创建链表头节点:创建一个空的头节点,初始时next指针为空。 ```cpp Node* head = new Node(); head->data = 0; // 或者你可以设置一个默认值 head->next = head; // 将头节点的next指向自身形成环形链表 ``` 3. 添加n-1个节点:从第二个节点开始,遍历循环,为每个新节点分配内存,并将其data字段设置为当前编号,然后将它的next指向前一个节点。 ```cpp for (int i = 1; i < n; i++) { Node* newNode = new Node(); newNode->data = i; newNode->next = head->next; head->next = newNode; // 更新头节点的next指向新的节点 } ``` 4. 确保释放内存:记得在程序结束时手动删除不再需要的节点,防止内存泄漏。在C++中,可以添加一个析构函数来处理这个任务,或者在循环结束后删除所有节点。 ```cpp // 如果使用智能指针,如unique_ptr // for (Node* node = head; node != head->next; node = node->next) { // delete node; // } // head = nullptr; // 如果使用普通指针并手动管理内存,可以在循环后添加 // while (head != head->next) { // delete head; // head = head->next; // } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值