0%

雾失楼台

C++の千层套路

C++在链表层面的书写

在C++中链表的定义为:

1
2
3
4
5
struct ListNode{
int val; //输入数据域
ListNode *next; //定义指针域
ListNode(int x):val(x),next(NULL){} //构造函数,在创建节点时调用
};

以下总结了我个人学习中的小tips:
*1.*在一个节点中,我们使用一个指针cur指向节点的数据域就可以写成”cur->data”,称为“cur的data”;指向指针域可以写成“cur->Next”,称为“cur的Next”。
*2.*至于为什么要将next赋为NULL是因为如果不将next指针初始化,里面就保存着垃圾值。这种直接在结构体里面定义的方法叫做“初始化列表”,其实也可以像C语言一样,在函数体内赋值,但是我们习惯上在定义的时候就将函数赋值。
*3.*其中“cur = cur->next; ”是一个语法糖,完全形式写作“cur = (*cur).next”,意义是“解引用,取成员,赋值”也就是“顺着指针定位到节点,读出next字段里存的地址值,把这个地址写进左边的变量”。
同时在C语言中,链表的结构和函数必须分开写:

1
2
3
4
5
6
7
8
9
10
11
12
typedef struct Node{
int data; //输入数据域
struct Node *next; //C语言中结构体必须使用完整类型名
}Node;
========操作=========
Node* create_data(int data){
Node *n=(Node*)malloc(sizeof(Node));
n->data=data;
/*这里的第一个data是链表中的数据域,第二个data是储存的数据,同名但是意义不同,只有在C语言中才可以这样做,这是因为C语言在设计之初就将命名方式分为“普通变量空间”和“标签变量空间”,而C++将两个空间合并,牺牲了部分的变量名,但是提升了编写的效率*/
n->next=next;
return n;
}