2.3.1 单链表和指针

  可以用 C 语言中的"结构指针"来描述链表结构。

   typedef struct LNode
   {
    ElemType data;
    struct LNode *next;
   } *SLink;

  若设 LNode *p,*q;
    SLink H;
 
 

  从C语言的类型定义可见,在链表中,"结点" 和 "指针" 是相互紧密关联的两个概念,不同的结点结构对应有不同的指针类型。

  思考题 如左对变量 p 和 q 定义之后,它们的值是什么?
 
    则 p,q 和 H 均为以上定义的指针型变量。若 p 的值非空,则表明 p 指向某个结点,p->data 表示 p 所指结点中的数据域,p->next 表示 p 所指结点中的指针域,若非空,则指向其"后继"结点。
 
   p->data 即为(*p).data,类似地,p->next 即为(*p).next。
 注意:只有在 p "有值" 且"值不为空"的情况下,
p->data 和 p->next 才有意义。
 
    指针型变量只能作同类型的指针赋值与比较操作。并且,指针型变量的"值"除了由同类型的指针变量赋值得到外,都必须用 C 语言中的动态分配函数得到。例如,p = new LNode; 表示在运行时刻系统动态生成了一个 LNode 类型的结点,并令指针 p "指向"该结点。反之,当指针 p 所指结点不再使用,可用 delete p; 释放此结点空间。    
 注意:一旦执行了delete p; 的语句,(*p)不再存在,自然 p->data 和 p->next 也就没有意义了。