严蔚敏版的数据结构里面关于单链表的存储结构定义如下
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
《数据结构与算法分析》中关于单链表的存储结构定义如下
struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;
struct Node{
ElemType Element;
Position Next;
};
显而易见下面这个定义太复杂了,而且现在也很少将typedef这样,因为如果变量太多了,这真的太容易混乱了。
要想理解这两个定义。首先我们先来学习下指针的基础知识。
指针:指针是一个其数值为地址的变量。
地址运算符&:&nurse表示变量nurse的地址。
间接运算符*:当后跟一个指针名或地址时, * 给出存储在被指向地址中的数值。例如val = *ptr;//将ptr指向的值赋给val(ptr是一个地址)
再给两个例子方便理解指针
int *pi;//pi是指向一个整数变量的指针
char *pc;//pc是指向一个字符型变量的指针
类型标识符表明了被指向变量的类型,而 * 表明该变量为一个指针。
有了这些指针的基础知识后,我们现在可以知道*LinkList的意思是LinkList是指向链表结点LNode的指针,LinkList L则表示L是单链表的头。
然后我们来复习一下结构体的基本知识
struct book{
float value;
};
struct book library;
struct book{
float value;
}library;//在定义后跟变量名
这两个效果是一样的,作用是把library声明为一个使用book结构设计的结构变量
另外结构体是可以嵌套的,所以我们在严书中看到struct LNode *next;
最后我们来看一下typedef的用法。
typedef通俗来说就是给紧跟其后的类型起个别名,就跟#define类似的作用
typedef struct Node *PtrToNode;
的意思就是*PtrToNode就是Node,所以PtrToNode就是指向Node的指针,所以
typedef PtrToNode Position;
就是和
struct LNode *next;
一样的作用。
综上就是我对链表结构体的定义的理解。后面的栈和队列都可以这样理解。最主要的一点,严书比《数据结构与算法分析》真的清楚多了。