c++链表构造函数

时间:2025-04-19 07:59:49

c++的链表结构是基于结构体创建的,下面结构来存放每个节点

struct ListNode
{
    double value;
    ListNode *next;
};

在已经声明了一个数据类型来表示结点之后,即可定义一个初始为空的链表,方法是定义一个用作链表头的指针并将其初始化为 nullptr,示例如下:

ListNode *head = nullptr;

现在可以创建一个链表,其中包含一个结点,存储值为 12.5,如下所示:

head = new ListNode; //分配新结点
head->value = 12.5; //存储值
head->next = nullptr; //表示链表的结尾

接下来再看一看如何创建一个新结点,在其中存储 13.5 的值,并将其作为链表中的第二个结点。可以使用第二个指针来指向新分配的结点(其中将存储 13.5 的值),示例如下:

ListNode *secondPtr = new ListNode;
secondPtr->value = 13.5;
secondPtr->next = nullptr; //第二个结点是链表的结尾
head->next = secondPtr; //第一个结点指向第二个

用这样的方法创建新节点很麻烦,所以请看下面的代码

struct ListNode
{
    double value;
    ListNode *next;
    //构造函数
    ListNode(double valuel, ListNode *nextl = nullptr)
    {
        value = value1;
        next = next1;
    }
};

通过该声明,即可使用以下两种不同的方式创建一个结点:

-通过仅指定其 value 部分,而后继指针则默认为 nullptr。
-通过指定 value 部分和一个指向链表下一个结点的指针。

当需要创建一个结点放在链表的末尾时,第一种方法是很有用的;
而当新创建的结点将被插入链表中间某个有后继结点的地方时,第二种方法是很有用的。

通过这个新的结点声明,即可使用比以前的示例要短得多的代码,创建一个存储值 12.5 的结点,而它的后面则是一个存储值 13.5 的结点,示例如下:

ListNode *secondPtr = new ListNode(13.5);
ListNode *head = new ListNode(12.5, secondPtr);

实际上,还可以放弃第二个指针,将上面的代码改写为以下形式:

ListNode *head = new ListNode(13.5);
head = new ListNode(12.5, head);

该语句之所以能和它前面的语句等效,就是因为以下赋值语句:

head = new ListNode(12.5, head);

该语句将从右到左评估,首先在构造函数中使用 head 的旧值,然后从 new 运算符返回的地址将被分配给 head,成为它的新值。

内存释放:
因为是使用new创建的,所以要注意内存释放的问题

void releaseNode(ListNode* node)
 {
     //创建临时节点
     ListNode* temp = NULL; 
     if(node == NULL)
     {
         cout << "链表节点内存为空\n";
     }
     else
     {
         while(node != NULL)
         {
             temp = node;
             node = node ->next;
             delete temp;
             cout << "节点内存清除成功\n";
         }
     }
 }