带头结点的单链表:
        单链表由表头唯一确定,若头指针名为L,则链表L。

单链表的存储结构:
        类型:数据域data是随数据元素决定的;指针域类型是指针型。
        int p; p = &a;
        用自己定义自己,指针的类型,指向的变量的类型依然是递归的那个类型(也就是定义的那个结构类型)
        Lnode, *LinkList(表示LinkList的类型是指针型);(LinkList为指向结构体Lnode的指针类型)
        定义链表L:LinkList L;

        定义结点指针p:LNode p;

举例:学号、姓名、成绩(三个数据域,)
typedef Struct student{
    char num[8];
    che name[8];
    int score;
    struct student *next;
}Lnode, *LinkList;
然后:LinkLIst L; 再让L指向头结点就可以了

单链表的初始化:
        构建一个空表:(1)生成新结点作为头结点,用头指针L指向头结点;(2)将头结点的指针域置空。
        Status InitList L(LinkList &L) {
                L = new LNode; // 从内存中找到空间给L
                L->next=NULL;
                return OK;
        }

判断链表是否为空:
        判断头结点指针域是否为空
int ListEmpty(LinkList L){
    if(L->next)
        return 0;
    else
        return 1;
}

单链表的销毁:
        从头指针开始,依次释放所有结点
        p = L;
        ★    L=L->next; // 下一结点的地址赋给L
        delete p; // 删除地址,它对应的是new
        什么时候结束:L被赋给最后一个,即为空时,循环就停止(结束条件:L==NULL、循环条件:L!=NULL或L)
Status DestoryList_L(LinkList &L){
    Lnode *p; // 或者LinkList p;
    while(L) {
        p = L;
        L = L ->next;
        delete p;
    }
    return OK;
}

清空单链表:(链表仍然存在,但链表中无元素,成为空链表
        依次释放所有结点,并将头结点指针域设置为空
        (如果从头结点开始,那么就p = L; 如果从首元结点开始,那么就p = L->next)
Status ClearList(LinkList &L) {
    Lnode *p, *q; // 或者LinkList p, q;
    p = L->next;
    while(p) {
        q = p->next;
        delete p;
        p = q;
    }
    L->next = NULL;
    return OK;
}

求链表的表长
        从首元结点开始,依次计数所有结点
int ListLength_L(LinkList  L){
    Lnode *p; // 或者LinkList p;
        p = L->next;
    i = 0;
    while(p) {
                i++;
                p  = p->next;
    }
    return i;
}
(LinkList L)    L前面加不加&,取决于L有没有变化,需要用L带回操作后的结果,就加&

带头结点的单链表:
P = L; // p指向头结点
s = L->next; // s指向首元结点
p = p->next; // p指向下一个结点