常规单链表的实现方式是定义一个结构体,结构体中定义一个存放数据的变量和一个指向下一个节点的指针。
在初次接触链表时,接触到了一个符号“->”,笔者在学习时,最开始常常把它和“.”傻傻分不清楚,对于这种状况,首先要搞清楚一点,结构体也是数据类型的一种,跟“int”"char"一样,定义一个结构体后结构体中的变量也就可以被这个结构体定义的变量访问。
结构体的作用即对一个东西进行封装,封装之后方便以后使用,使用了这个类型的变量都会具有这个结构的属性。
结构体变量访问结构体元素时:
例如a和b:
那么当a是指针变量时,a->b等价为(&a).b。
如果用“.”,只需要声明一个结构体,然后用结构体名加“.”加结构体元素名称就可以引用结构体中的元素了,因为计算机自动分配了结构体的内存,就像int a一样,(操作栈内存)。
用->的话必须声明一个结构体的指针,还要手动开启一个该结构体的内存,将结构体的返回的指针赋值给声明的结构体指针才能用->正确引用,否则内存中只分配了指针的内存,没有分配结构体的内存,想要的结构体实际上不存在,这时候用->引用自然会出错,因为没有结构体,所以也不存在结构体域。(操作堆内存)。
如下:
struct Data{
int a,b,c;
};
struct Data *p;
struct Data A = {1,2,3};
p = &A;
上面中 A.a 和p->a 表示的是同一个意思。
“.”可以读作“的”“->”可以读作“指向结构体的”
补充:“->”与“.”功能一样,都是访问结构体变量,但箭头绝对没有现实生活中箭头的指向作用,它只表示用一个指针访问结构体变量,链表中节点的链接过程跟“->”没有关系,链表节点的链接是通过指针指向链接的,编程中表现为给指针变量赋值,实质是把后一个节点的首地址赋给前一个节点的pNext,箭头非指向,不注意这点会对理解链表产生困扰。