最近在看王道考研的数据结构的课程,课程逻辑清晰,但可惜都是伪代码,发现使用C语言编写时会出现各种状况,后来发现是C语言中使用了C++语法引入的引用,现在分享一下代码和改动思路:
一、节点以及链表初始化代码
这里值得注意的是,LinkList明明是节点指针(LNode *)类型,为什么在初始化函数里面传入参数还需要使用地址解析符 * 来解析其地址。其原因在于,虽然我们指向每个节点的都是使用的指针,一个内部的next指针依次相连,一个外部声明的指针*p用于挪动位置,做一些查询之类的移位操作。
但注意这里初始化需要传入的应该是指针的地址,我们在初始化做的工作起始就是让这个链表所占用空间不能有之前存在的“脏数据”,带头节点的单链表还需要额外初始化头节点。这两个操作的对象都应该是指针的地址,因为指针本身是存放所指向元素a1的地址的,所指向元素a1的地址是指针的值,而指针的地址才是我们想要的。
这行*L = (LNode *) malloc(sizeof(LNode)); 这行代码王道视频由于使用了引用,所以我们如果使用纯C语言代码运行,不能忘记给L前面加上 * ,作用是解析地址,因为我们传入的*L是指针的地址, 也就是指针的指针(LinkList * L=LNode** L),指针的指针指向上一级指针的地址,也就是说这个二级指针L存放的值是上一级指针(指向链表首元素的指针)的地址,所以得用地址解析符 * 获取这个二级指针的值,获取的值就是我们想要的头指针地址。(printf打印L出来的是*L的地址)
typedef struct LNode {
int data;
struct LNode *next;
} LNode, *LinkL