单链表的头指针和头结点问题??

Status InitList(LinkList L)
{ /
操作结果:构造一个空的线性表L /
*L=(LinkList)malloc(sizeof(struct LNode)); /
产生头结点,并使L指向此头结点 /
if(!*L) /
存储分配失败 /
exit(OVERFLOW);
(*L)->next=NULL; /
指针域为空 */
return OK;
}

它是怎么实现将L指向此头结点的???

1、L是一个指针变量,那么下面这句就是错误的:
*L=(LinkList)malloc(sizeof(struct LNode));
2、你申请的头结点地址赋给了L, 无法返给调用函数使用

可以修改为:

 Status InitList(LinkList &L)
{ / 操作结果:构造一个空的线性表L /
L=(LinkList)malloc(sizeof(struct LNode)); / 产生头结点,并使L指向此头结点 /
if(L) / 存储分配失败 /
return FALSE;
L->next=NULL; / 指针域为空 */
return OK;
}

请问以下这段程序中,head是头指针还是头结点???我一直搞不明白啊

 #include<stdio.h>  
#include<stdlib.h>  

typedef struct node
{
    int data;
    struct node *next;
}Linklist;

Linklist *create() //创建链表,带头结点  
{
    Linklist *head;
    head = (Linklist *)malloc(sizeof(Linklist));
    head->next = NULL;
    return head;
}

Linklist *tail_insert(Linklist *head, int value) //尾插法  
{
    Linklist *p, *t;
    t = head;
    p = (Linklist *)malloc(sizeof(Linklist));
    p->data = value;
    while (t->next != NULL) //当链表不为空时t向后移动  
        t = t->next;

    t->next = p;
    p->next = NULL;
    return head;
}


Linklist *display(Linklist *head) //打印链表数据  
{
    Linklist *p;
    p = head->next;
    if (p == NULL)
    {
        printf("linklist is empty...\n");
        return head;
    }
    while (p != NULL)
    {
        printf("%5d", p->data);
        p = p->next;
    }
    printf("\n");
    return head;
}

int main()
{
    Linklist *head;
    int i, num;
    head = create();

    printf("tail_insert:\n");
    for (i = 2; i<20; i = i + 4)
        tail_insert(head, i);
    display(head);
    system("pause");
    return 0;
}

head是头指针,head指向的是头结点,即*head
这个链表的头结点并没有存储数据,也就是说不是有效结点。
它的作用是为了插入、删除结点时处理统一,不需要判断是不是头结点。