struct Book {
string id;//ISBN
string name;//书名
double price;//定价
};
typedef struct LNode {
Book data; //结点的数据域
struct LNode *next; //结点的指针域C99标准下可以省略struct
} LNode, *LinkList; //LinkList为指向结构体LNode的指针类型 *LinkList应该是 struct LNode* LinkList;定义一个LNode类型的指针
Status InitList_L(LinkList* L) {//算法2.6 单链表的初始化
//构造一个空的单链表L
*L = (LinkList)malloc(sizeof(LNode)); //生成新结点作为头结点,用头指针L指向头结点 头结点的数据存储在头指针里面。*L表示指针L内部寸的地址对应的值。
(*L)->next = NULL; //头结点的指针域置空
return OK;
}
在上述代码中,LinkList* L
是一个双层指针。让我们一行一行来解析和分析:
-
typedef struct LNode { ... } LNode, *LinkList;
这一行代码定义了一个结构体类型
LNode
和一个指向该结构体类型的指针类型LinkList
。这里的*LinkList
表示LinkList
是指向LNode
类型的指针。 -
Status InitList_L(LinkList* L)
这里的参数
LinkList* L
表示L
是一个指向LinkList
类型指针的指针。通过使用双层指针,我们可以在函数内部修改原始指针的值。 -
*L = (LinkList)malloc(sizeof(LNode));
在函数的实现中,使用
malloc
动态分配内存空间,使得*L
所指向的指针变量指向了分配的内存。在这里,*L
表示指针L
内部存储的地址对应的值。(*L)->next
中的(*L)
是对指针L
进行解引用操作,访问其指向的LinkList
类型的数据结构。(*L)->next
表示该数据结构中的next
成员。
总结起来,由于需要在函数内修改原始指针的值,所以使用了双层指针 LinkList* L
。通过使用 *L
解引用操作,可以访问并修改 L
指向的数据结构。
是的,在C语言中,int *p;
和int* p;
是相同的。它们都声明了一个指向整型变量的指针 p
。在C语言中,对于指针的声明,星号 *
可以放在类型名前面或者变量名前面,两种写法在语法上是等价的。