如何解决C++链表中无法用new来创建结点的问题

注:这部分建议先学一下C++的面向对象操作会更容易理解

一般情况下,我们要写一个链表,具体的结构体内容如下:

struct Listnode {
	int val;
    Listnode* next;
};

其中val是这个链表的数据域,next就是指针域了;

我们在C里面了解过,初始化一个链表的步骤如下,C++也能够使用

Listnode* head=(struct Listnode*)malloc(sizeof(struct Listnode));
head->next=NULL;
head->val=10;

但是,很多人看到网上的代码里有用new初始化链表的,所以自己也信心满满的去用了,结果就是报错!报错!还是报错!!

这是因为,你的struct没有写构造函数,这个构造函数需要我们自己实现才能用new来创建一个链表节点。

构造函数,说白了就是一个函数,它的目的就是初始化我们要new出来的链表结点

比如说:有的代码里面会写Listnode* head=new Listnode();  然后你就发现他new出来了一个链表结点,但是,大家仔细看一下new后面的Listnode(),是不是很像一个函数,这个就是我们要写的构造函数,它的目的是将新构造的结点的val初始化为0,next为NULL(有的代码会写nullptr,本质上和NULL是一样的,null是空的意思,ptr是指针的意思,nullptr就是空指针的意思),也就是

Listnode(){
    val=0;
    next=NULL;    //也可以是next=nullptr;
}

相对应的,当我们想要初始化一个链表结点,有两种主要的情况:一种是只初始化结点的值;另一个是既初始化值,又初始化next的值

先看第一个,有了上面的经验,我们很容易就能想到传进一个数来,把这个数赋值给val就行了,也就是

Listnode(int x){
    val=x;
    next=NULL;
}

那么第二个就更容易了,传进一个数和一个结点来就行了,也就是

Listnode(int x,Listnode* p){
    val=x;
    next=p;
}

还有一种,只传进一个结点来,大家可以想一想怎么写。

然后我们将这三个构造函数写进链表结构体里面

struct Listnode {
	int val;
    Listnode* next;
    Listnode(){
        val=0;
        next=NULL;
    }
    Listnode(int x){
        val=x;
        next=NULL;
    }
    Listnode(int x,Listnode* p){
        val=x;
        next=p;
    }
};

这样,我们再new一个结点,就能够new出来了!

Listnide*head=new Listnode();//初始化一个val=0,next=NULL的结点

Listnode*head1=new Listnode(3);//初始化一个val=3,next=NULL的结点

Listnode*head2=new Listnode(4,q);//初始化一个val=4,next=q的结点

当我们了解面向对象的操作后,我们就能够美化上面的结构体到以下形式

struct Listnode {
	int val;
    Listnode* next;
	Listnode() :val(0), next(nullptr) {}         //nullptr可以换成NULL
	Listnode(int x) : val(x), next(nullptr) {}
	Listnode(int x, Listnode* next) : val(x), next(next) {}
};

最终效果是一样的,这也是我们最常写的一种形式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值