最近两天队里讲了链表的相关题目和知识,因为搞些别的事情耽误了没跟上课,也是自己在csdn上到处查着学,今晚题目做的头疼,抽空总结一下对链表的理解笔记。
链表和数组之间的区别在于
数组需要一块完整连续的内存来存储,对内存的要求高,链表则相反,它并不需要一块连续的内存空间,它通过指针将一组零散的内存块串联使用,其中我们将内存块成为链表的节点。同时,为了将所有的节点穿起来,每个节点除了储存数据外还需要记录链的下一个节点的地址,节点地址的指针叫做后继指针next。
思想上,有时间换空间,空间换时间之分。
常见的链表结构有单向链表,双向链表,循环链表,双向循环链表。
在代码中出现的p->next=NULL:p指针指向的对象的next属性为空
r->next=p:r指针指向的对象的下一个为p指向的对象
r=p:r指针指向p指针指向的对象。
->的理解:
->是一个整体,它是用于指向结构体、C++中的class等含有子数据的指针用来取子数据。换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”.
例子:struct Data
{
int a,b,c;
}; /*定义结构体*/
struct Data * p;/*定义结构体指针*/
struct Data A = {1,2,3};/*声明变量A*/
int x;/*声明一个变量x*/
p = &A ; /*让p指向A*/
x = p->a;/*这句话的意思就是取出p所指向的结构体中包含的数据项a赋值给x*/
/*由于此时p指向A,因而 p->a == A.a,也就是1*/
“链表指针是C语言的一个难点,但也是重点,学懂了非常有用。要仔细讲就必须先讲变量、指针。
什么是变量?所谓变量,不要浅显的认为会变得量就是变量。套用我们院长的问话:“教室变不变?”变,因为每天有不同的人在里面上课,但又不变,因为教室始终在那,没有变大或变小。这就是变量:有一个不变的地址和一块可变的存储空间。正常情况下,我们只看到变量这个房间里面的东西,也就是其内容,但不会关注变量的地址,但是C语言的指针,就是这个房间的地址。我们声明变量就相当于盖了间房子存放东西,我们可以直接观看房子里的东西,而声明指针,就是相当于获得了一个定位器,当用指针指向某个变量时,就是用指针给变量定位,以后我们就可以用指针找到他所“跟踪”的变量并可以获得里面的内容。
那结构体呢?结构体就相当于是有好几个房子组成的别墅,几个房子绑定在一起使用。假设现在有很多这种别墅分布在一个大迷宫里,每间别墅里都有一间房子。里面放了另一个别墅的位置信息,现在你手拿定位器找到了第一栋别墅,从里面得到了你想要的东西(链表的数据部分),然后把下一栋别墅的位置计入你的定位器(p = p->next),再走向下一栋别墅……如此走下去,知道走到某地下一栋别墅信息没有了(p->next == NULL),你的旅行结束。这就是链表一次遍历的过程。”
——引用p=p->next 表达了什么意思_BigZong-CSDN博客
再就是对于c语言中的malloc和c++中的new
其用法作用是相同的,区分于c和c++编译器,malloc() 函数用来动态地分配内存空间
对于malloc 在链表内我写的题目代码里常出现的例子:
struct node *head=(struct node*)malloc(sizeof(struct node));
struct node *tail=(struct node*)malloc(sizeof(struct node));