C++ --- 链表的操作--插入

链表的插入

	Listnode *newnode = new Listnode(val);
	cur -> next = newnode;
	cur = cur -> next;

链表的插入主要可以分为这几步:

1.创建一个新的链表节点,初始化它的值为val

Listnode  *newnode = new Listnode(val);

通过new构造一个新的链表节点,节点的值为val
new运算符,用于开辟空间,开辟的空间在堆上,而C++中一般声明的变量都是在栈中的;
new得到的是一段空间的首地址。所以一般需要用指针来存放这段地址
使用语法一般是 : 指针变量 = new 数据类型

int *ptr = new int(5); // 分配一个整数内存空间,ptr保存了该内存的地址
int *ptr1 = new int[5];//分配一个储存5个整数的一维数组空间,同样ptr1保存了该内存的地址
###主要括号的不同

2.将新的节点放入到链表的尾部,接入链表,也就是当前链表的尾部的next指向新节点

cur -> next = newNode; // cur节点的next节点是新节点,从而将新节点接入链表

箭头 -> 语法
用于通过指针访问指针所指向的对象的成员,cur 是一个指向 ListNode 结构体对象的指针,而 next 是 ListNode 结构体内部的一个成员变量(指向下一个节点的指针)。使用 cur->next 表示访问 cur 所指向的节点的 next 成员变量。
箭头运算符(->)包括了解引用点运算符(.)
在c++中,*和&在不同的地方有着不同的意义
具体一些例子:

//有关 * :
int *ptr  = &a;//指针
a = a * b; // 乘法
*p = 100 //表指向,就是p是指向100的地址值


// 有关 &:
int c = a&b; //位运算,转换为二进制
int *p = &a;//&表示取a的地址
int a = 100;
int &a1 = a ;//引用

解引用:就是解释引用,就是根据指针标量保存的地址值来找地址值代表的内容
eg:

#include <iostream>
using namespace std;
int main(){
	int *ptr ;
	int a = 6;
	ptr = &a;
	cout << ptr <<endl;
	cout << *ptr << endl;
}

定义个指向int类型的指针变量,定义个整型a = 6,把a的地址值赋给指针ptr,后面的*ptr就是解引用的过程,就是直接去寻找指针所指的地址里面的内容,此内容可以是任何数据类型,当然也可以是指针。
引用:& 表示引用
引用就像给变量取了个别名,不是新定义一个变量,编译器不会开辟一个新的内存空间,二者共用一个内存空间
格式
类型 &引用变量名(对象名) = 引用实体
eg:

#include <iostream>
using namespace std;
int main(){
	int a = 10;
	int &a1 = a;
	int b = a;
	cout << "a的地址:" << &a << endl;
	cout << "a1的地址:" << &a1 << endl;
	cout <<"b的地址:"<< &b << endl;
	cout << "a1值"<<a1 << endl;
	cout << "b值"  << b << endl;
	//改变a的值,a1也会改变,但B不会改变,因为b是新开辟的内存
	a = 18;
	cout << "改变后a1值" << a1 << endl;
	cout << "改变后b值" << b << endl;
}

结果:
在这里插入图片描述

点运算符
又叫成员访问运算符,用于访问一个对象的成员变量或成员函数,字面意思,很好理解,跳过

#include <iostream>
using namespace std;
struct Listnode
{
	int value;
	Listnode *next;
	Listnode(int x) : value(x),next(nullptr) {}
};
int main(){
	Listnode *cur = new Listnode(0);//声明cur指针,指向一个初始化的链表节点
	cout << cur -> next << endl;
	cout << (*cur).next << endl;
}

结果:
在这里插入图片描述

cur -> next 相当于(*cur).next
就是先对指针变量cur解引用,得到了地址值所储存的链表节点,再访问成员变量next

3.新接入的链表节点变为链表的尾部

cur = cur -> next;      // 新插入的节点变更为新的尾节点,即cur发生了变更,cur指向后一个结点

完整代码(在一个结点后面插入``新的结点)

#include <iostream>
using namespace std;
//定义一个链表结点结构体
struct Listnode
{
	int value;
	Listnode *next;
	Listnode(int x) : value(x),next(nullptr) {}
};
int main(){
	Listnode *dummynode = new Listnode(0);//创建一个虚拟节点
	Listnode *cur = dummynode; // cur指针指向虚拟节点
	Listnode *newnode1 = new Listnode(1);//再声明一个新结点,目的是想将其插入到虚拟结点的后面
	Listnode *newnode2 = new Listnode(2);//再来一个
	cur -> next = newnode1;
	cur = cur -> next;
	cur -> next = newnode2;
	cur = cur -> next;
	cur = dummynode;
	// 按顺序输出除虚拟节点外所有结点的val
	while (cur -> next != NULL){
		cout << cur -> next -> value << " ";
		cur = cur ->next;
	}
}

结果:
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值