如何使用结构体在C++中更改这些代码?
How to change these codes using struct to class in C++?
我有这些代码块,我想使用类而不是结构。我应该如何修改我的代码?
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
在按node1
和node1->next
指向的节点之间插入节点
new node(val, node1, node1->next);
列表的析构函数将是
LinkedList::~LinkedList()
{
delete head;
}
虽然我的示例是更常用的双向链表,但它适用于您的单向链表,通过排除对prev
成员变量的操作。虽然链表的经典概念不允许确定你是否在列表的头部,但只有当你在它的尾部时,在这种封装的情况下,你仍然可以通过比较指针到节点head
来做到这一点。
相关文章:
- 我应该如何修改此代码以使用给定字符串中的字母打印菱形图案
- 我无法在Visual Studio代码中使用CIN输入答案,它说输入您的年龄,但它说只读文本编辑器如何解决这个问题?
- Netbeans 10:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- 在什么情况下,我想在 C/C++ 代码中使用内联汇编代码
- 为什么这些代码仍然使用 lvalue 函数?
- 为什么我们不在下面给出的代码中使用指针来实例化C++的实体对象?
- 链接器命令失败,macOS 上的退出代码为 1(使用 -v 查看调用)
- 创建一个数组,以允许用户输入存储并稍后在代码中使用
- 为什么我的 c++ 代码在使用堆栈时以退出代码 11 结尾?
- 如何在软件代码中使用ofstream创建文件
- 为什么Microsoft在新代码中使用结构而不是类?
- 代码::块C++使用 MacOS 编译 Mojave : 致命错误: sys/cdefs.h: 没有这样的文件或目录
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 如何修复 clang: 错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- 示例代码中使用分隔符将 std::string 拆分为 std::vector 的范围问题
- 如何在C++代码上使用 Tcl-C API
- Xcode:链接器命令失败,退出代码为 1(使用 -v 查看调用)[C++]
- 为什么我们应该在下面的代码中使用模板包装器?
- 将-Wtype限制与类型泛型代码一起使用
- 如何在C++代码之上使用标准的Xcode GUI