单链表的 c 复制构造函数
本文将首先讨论链表数据结构的概念以及使用它的合适场景。 然后,我们将讨论使用 c 的单链表和单链表的复制构造函数的紧凑实现。
c 链表数据结构
链表数据结构的主要优点是能够将数据存储在不连续的内存位置。 它是由节点组成的线性数据结构,其中每个节点存储数据项(密钥和相关卫星数据)以及对下一个节点的引用。
头指针指向该数据结构中的第一个节点; 因此,它有时被称为头节点。 单链表的一些经典实现也有一个指向列表最后一个节点的尾指针。
例如,下图显示了没有尾指针的链表概念的示例描述。
链表有三种类型:
-
单链表或简单链表
它是一个简单的链表,也称为单向链表,在其中我们只能向前移动。 每个节点存储数据项和下一个节点的引用。
-
双向链表
它是一个链表,我们可以在其中向前和向后移动。 双向链表的每个节点都由数据项、下一个节点的引用和前一个节点的引用组成。
它非常适合执行/重做状态场景,包括网络浏览器的下一页和上一个导航。
-
循环链表
它与单向链表几乎相同,只是链表最后一个节点中的下一个指针始终指向第一个节点。 这会创建一个圆圈; 因此,它被称为循环链表。
它通常在循环队列管理系统中很方便。
单链表的示例代码
让我们看一下以下单链表的 c 实现:
#include
using namespace std;
class node {
public:
int data;
node* next;
};
class linkedlist{
public:
node * head;
linkedlist()
{
head=nullptr;
}
void addnewitem(int data)
{
node * temp=new node();
temp->data = data;
temp->next = head;
head = temp;
}
void display()
{
node * temp=head;
while (temp!=nullptr)
{
cout<data<<",";
temp=temp->next;
}
cout<int main() {
linkedlist list;
list.addnewitem(5);
list.addnewitem(10);
list.addnewitem(15);
list.display();
return 0;
}
上面的代码由以下几个类组成:
- 一个 node 类有两个成员变量:data 和 node 类指针 next。 data变量用于存储元素的值,next变量用于存储下一个元素的引用。
-
一个类linkedlist有一个node类型的成员变量head用于存储链表的第一个元素,还有一个构造函数
linkedlist()
,以及两个成员函数addnewitem和display()
。linkedlist()
构造函数用 null 值初始化头部。
addnewitem()
方法用于在链表的前面添加一个新元素。 我们也可以将此函数命名为addtofront 或push。
display()
方法显示链接列表元素。
c 单链表的复制构造函数
以下是单链表的复制构造函数的代码。
linkedlist( const linkedlist &obj )
{
if (obj.head!=nullptr)
{
this->head=new node;
this->head->data=obj.head->data;
node* temp= obj.head->next;
node* temp2=this->head;
while(temp!=nullptr)
{
node * newnode=new node; ////
newnode->data=temp->data;//// creating new node
newnode->next=temp->next;////
temp2->next=newnode;
temp2=temp2->next;
temp=temp->next;
}
}
else
{
head=nullptr;
}
}
上面的代码显示了单链表复制构造函数,它接受一个链表对象 const linkedlist &obj 作为参数,并将接收到的链表中的所有数据复制到调用链表中。
由于链表使用node类型指针,因此我们必须为深拷贝定义拷贝构造函数。 如果未提供复制构造函数的实现,将创建浅复制。
调用复制构造函数
考虑 main() 函数的以下代码:
int main() {
linkedlist list; // declaring a list
list.addnewitem(5);
list.addnewitem(10);
list.addnewitem(15);
cout<<"the content of list 1 are: ";
list.display();
linkedlist list2 (list); //declaring a list2 with the copy constructor
cout<<"the content of list 2 are: ";
list2.display();
return 0;
}
上面的代码中,使用linkedlist列表创建了一个linkedlist类型的对象列表; 陈述。 之后,我们使用 list.addnewitem( )
方法将三个值插入到列表中。
创建了另一个 linkedlist 类型的 list2 对象,我们在声明时将第一个列表对象作为参数传递给调用复制构造函数。 两个对象的 display()
方法在列表中显示相同的数据项。
输出:
转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处
本文地址:
相关文章
发布时间:2024/03/21 浏览次数:168 分类:javascript
-
本文将教你 javascript 中多个构造函数的五种不同模式。这些模式包括参数嗅探、静态方法、函数中的方法、具有默认值的可选参数和单个对象字面量。
发布时间:2024/02/02 浏览次数:138 分类:编程语言
-
本教程演示如何使用标准语法在 c# 中进行构造函数链接本教程将演示如何在 c# 中进行构造函数链接。要了解构造函数链,首先必须了解以下概念。
发布时间:2024/02/01 浏览次数:205 分类:编程语言
-
base 关键字可用于从 c# 中的子类的构造函数调用基类的构造函数。本教程将讨论从 c# 中的子类的构造函数调用基类的构造函数的方法。
发布时间:2024/02/01 浏览次数:155 分类:编程语言
-
this 关键字可用于从 c# 中同一类的另一个构造函数调用一个构造函数。本教程将讨论在 c# 中从同一个类的另一个构造函数调用一个构造函数的方法。
发布时间:2024/01/02 浏览次数:208 分类:c
-
本文演示了如何在 c 中把文件读成字符串。本文将讲解几种在 c 中把文件内容读取到 std::string 的方法。使用 istreambuf_iterator 在 c 中将文件读入到字符串
发布时间:2023/11/15 浏览次数:188 分类:java
-
本教程解释了如何在 java 中从另一个构造函数中调用一个构造函数。在 java 中,对象初始化后调用构造函数的顺序称为构造函数链。当我们想通过使用一个实例来调用一个构造函数时,就会用到
发布时间:2023/11/15 浏览次数:114 分类:java
-
这篇文章讨论了在 java 中重载构造函数的方法。本文介绍如何在 java 中重载构造函数。我们还列出了一些示例代码,你可以遵循这些示例代码以更好地理解该主题。
发布时间:2023/11/15 浏览次数:151 分类:java
-
本文介绍默认构造函数在 java 中的工作原理。在 java 语言中,术语构造函数类似于我们在编程中运行的方法。
发布时间:2023/11/15 浏览次数:179 分类:java
-
本教程演示什么是 java 中的空构造函数。当我们需要通过我们的框架反射创建一个新实例时,需要一个空的构造函数。