微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在链表尾部插入元素的插入函数

如何解决在链表尾部插入元素的插入函数

我想实现在链表尾部插入元素,我想使用成员函数来实现,目前我可以通过在struct之外创建一个函数来实现,请帮忙我应该修改什么来实现它作为成员函数

我的传统方法

#include<iostream>
using namespace std;
struct node{
    int data;
    node *next;
};
node * Insert(int v,node *head){
    if(head==NULL){
        node *temp=new node;
        head=temp;
        temp->data=v;
        temp->next=NULL;
         return head;
    }
    else{
        node *temp=head;
        while(temp->next!=NULL){
            temp=temp->next;
        }
        node *temp_new=new node;
        temp_new->data=v;
        temp_new->next=NULL;
        temp->next=temp_new;
        return head;
    }
}

解决方法

这是一个工作示例。这个想法是,从成员函数开始,您递归地调用 node::Insert 直到到达最后一个元素,然后才创建下一个元素。

#include <iostream>

struct node{
    int data;
    node *next = nullptr;
    node *Insert(int v);
};

node *node::Insert(int v)
{
    if (next == nullptr)
    {
        next = new node;
        next->data = v;
        return next;
    }
    else
    {
        return next->Insert(v);
    }
}

int main()
{
    node a{3};
    a.Insert(2);
    a.Insert(5);
    std::cout << a.data << ' ' << a.next->data << ' ' << a.next->next->data << ' ' << std::endl;
    
    return 0;
}

live on Coliru

还有:avoid using namespace std

添加

如评论中所述,展开递归可能是个好主意。这是上述代码的非递归版本:

#include <iostream>

struct node{
    int data;
    node *next = nullptr;
    node *Insert(int v);
};

node *node::Insert(int v)
{
    if (next == nullptr)
    {
        next = new node;
        next->data = v;
        return next;
    }
    else
    {
        auto p = next;
        while (p->next != nullptr)
            p = p->next;
        p->next = new node;
        p = p->next;
        p->data = v;
        return p;
    }
}

int main()
{
    node a{3};
    a.Insert(2);
    a.Insert(5);
    std::cout << a.data << ' ' << a.next->data << ' ' << a.next->next->data << ' ' << std::endl;
    
    return 0;
}

live on Coliru

,

仅通过查看您的 insert 当前所做的事情,让它成为 node 的成员是没有意义的。您可以这样调用您的 insert

 node* root = nullptr;
 root = Insert(42,root);

使用单个元素创建列表。另一方面,在拥有 node 类型的实例之前,您不能调用 node 的成员函数。

如果您编写一个表示列表的类,而不仅仅是单个节点,则转换会更简单。从这个开始:

struct node{
    int data;
    node *next;
};
struct linked_list {
    node* head;
};

现在上面两行看起来像这样:

linked_list l;
l.insert(42);

您需要做的就是将自由函数移动到类中,而不是使用参数 head,而是使用成员 head。也不再需要返回头部:

#include<iostream>
using namespace std;
struct node{
    int data;
    node *next;
};
struct linked_list {
    node* head = nullptr;
    void Insert(int v){
        if(head==nullptr){
            head =new node;
            head->data=v;
            head->next=nullptr;
        }
        else{
            node *temp=head;
            while(temp->next!=nullptr){
                temp=temp->next;
            }
            node *temp_new=new node;
            temp_new->data=v;
            temp_new->next=nullptr;
            temp->next=temp_new;
        }
    }
};

请注意,我没有对实现进行任何更改(只有 NULL -> nullptrvoid 返回,如果它有错误,那么它现在仍然有错误;)。您还应该为 nodelinked_list 以及析构函数提供适当的构造函数,因为目前这会泄漏所有分配的内存。最后但并非最不重要的是,您需要阅读 3/5 规则:What is The Rule of Three?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。