如何使用结构体在C++中更改这些代码?

How to change these codes using struct to class in C++?

本文关键字:代码 何使用 结构体 C++      更新时间:2023-10-16

我有这些代码块,我想使用类而不是结构。我应该如何修改我的代码?

struct node
{
int number;        /* data portion */
node* next; /* pointer portion */
};
node* create_node(int number, node* next)
{
node* result = (node*)malloc(sizeof(node));
result->number = number;
result->next = next;
return result;
}
void destroy_node(node* const list)
{
free(list);
}

我应该做这样的事情吗?

class node{
public:
create_node(int number,node* next){
//blah blah
}
destroy_node(node* const list){
//blah blah
}
}

改变的目的是什么? 从 C 到 C++ 的盲目转换毫无意义。

如果您的目的是创建基于 OOP 的链表,您应该从以下内容开始:

class LinkedList 
{
struct node {
value_type value;
node *next, *prev;
};
node *head; // maybe *last too, to avoid O(n) complexity of adding new element.
public:
LinkedList() : head (nullptr) {}
// methods for manipulation with list, 
// maybe definition of iterator type for such.
~ LinkedList(); // should dispose of all nodes created
};

必须封装整个容器,而不是单个节点。当然,列表可以通过value_type模板参数轻松模板化。

C 和 C++ 代码背后的逻辑在原则上是不同的。请注意,该结构是一个类,即使它没有构造函数、析构函数或虚拟方法。在这种情况下,这将是一个微不足道的类。具有标准内存布局的简单类与 C 结构兼容。

嵌套类节点可以使用 RAII 概念

class LinkedList 
{
struct node
{
value_type value;
node *next, *prev;
node(value_type v, node *pr) : 
value(v), next(nullptr), prev(pr) { pr->next = this; }
// inserting constructor
node(value_type v, node *pr,  node *nx) : 
value(v), next(nx), prev(pr) { pr->next = this; }
~node()
{ 
delete next; // would call ~node() of next node if next non-null 
}
};

然后,要创建列表中值val的第一个节点,您将这样做

head = new node(val, nullptr); // no previous nodes

在按node1node1->next指向的节点之间插入节点

new node(val, node1, node1->next);

列表的析构函数将是

LinkedList::~LinkedList()
{
delete head;
}

虽然我的示例是更常用的双向链表,但它适用于您的单向链表,通过排除对prev成员变量的操作。虽然链表的经典概念不允许确定你是否在列表的头部,但只有当你在它的尾部时,在这种封装的情况下,你仍然可以通过比较指针到节点head来做到这一点。

相关文章: