转换链接列表从C到c++

Converting link list from C to C++

本文关键字:c++ 链接 列表 转换      更新时间:2023-10-16

我有一个工作链表实现在C(从linux),我想转换为使用在c++(在windows上)。

我有一个播放器结构,它看起来像这样:
typedef struct PLAYER {
    char * name;
    struct PLAYER * next;
} player;

在我最初的C代码中,我像这样初始化了播放器列表:

player * player_list;
player_list = malloc(sizeof(player));

但是,对于在C中使用,我不能使用(void *),所以我需要像这样强制转换它:

player * player_list;
player_list = (player*)malloc(sizeof(player));

对于添加/链接玩家的使用,我检查链表中的项目是否设置为NULL,但是经过一些调试后,我可以看到在c++中malloc'ed数据不像C中那样设置为NULL

例如,在C实现中,current->next == NULL为真,而在c++中,它为假。

我的问题是,我如何在c++中malloc数据,使数据默认设置为NULL ?从而允许我使用原来的函数

如果您需要在c++中创建链表,则应该使用new操作符来分配内存,而不需要typedef

struct Node
{
  std::string name;
  Node * next;
};
// creating a new node
Node * p_node = new Node;
Node.name = "John";
Node.next = nullptr;

注意从char[]std::string的变化。std::string类型应该用于文本,因为它处理文本内容的分配和回收。

此外,您最终将希望使用template,以便您可以将链表数据结构应用于不同的节点类型。

或者您可以简化您的生活并使用std::list,如:

std::list<name> name_database;

我的问题是,如何在c++中malloc数据,使数据默认设置为NULL ?从而允许我使用原来的函数。

你不需要。

在c++中将代码转换为链表的最简单方法是

 struct PLAYER {
     std::string name;
 };

和使用

 std::list<PLAYER> player_list;

std::list容器类已经实现了一个链表。

分配内存并初始化为0的函数是calloc。对于c++和C来说是一样的,malloc不会将内存归零,但calloc会。它在c语言中"有效"是一个"巧合"。

要充分利用c++的优势,可以使用标准库容器,如std::liststd::deque,以及智能指针。

虽然我建议您完全接受c++并转向STL容器,但我猜您希望在开始之前做最少的工作来恢复并运行单元测试。我写这篇文章是为了给你最少的修改,让你可以根据测试开始重构。

为struct添加构造函数:

struct PLAYER {
    char * name;
    struct PLAYER * next;
    PLAYER()
        : name(), next()
    {}
};

或者,使用最新的c++来使更改最小化:

struct PLAYER {
    char *name = nullptr;
    struct PLAYER *next = nullptr;
};

然后你可以替换你的calloc()malloc()与一个简单的new PLAYER()和匹配free()delete,并准备开始你的重构。

为了更符合c++的习惯,首先要改变的是原始指针——您将使用std::string代替char*,使用std::unique_ptrstd::shared_ptr作为大多数其他指针(当您移动到标准容器时,链表中的PLAYER*将消失)。

我的问题是,我如何在c++中malloc数据,使数据默认设置为NULL ?

在c++ C中,没有办法动态地为指针分配内存,这两种标准都确保指针最初是NULL。在实践中,使用calloc()而不是malloc()进行分配可能会产生这种效果,因为它将所有分配的字节初始化为0。尽管具有所有字节0的指针表示通常是NULL指针的表示,但是,标准并不要求必须是。(这与空指针常量的源代码表示的问题不同。)然而,如果你只关心Windows和msvc++,那么calloc()应该可以满足你的需要。

是否值得学这门课是完全不同的问题。c++确实提供了合适的集合模板,因此您不需要计算这些细节,并且这些模板将与其他STL模板清晰地交互,这对您非常有利。没有什么理由不这样做;唯一一个立即出现在脑海中的是,您希望能够使用C或c++编译器成功且正确地构建项目。在这种情况下,任何更改都必须避免改变代码的C语义的约束是巨大而重要的。