每天进步一点点之带头节点单链表

1,单链表分为带头结点和不带头结点,带头节点的好处,只有实际写代码后才能体会出来。可以类比顺序表中的哨兵

好处:

1,第1个位置的插入、删除更加方便,带来操作上的统一。

2,对于头插法:

不带头结点的链表,插入第一个结点时,需要特殊处理,删除操作类似.

3,优势2:统一空表和非空表的处理

举例:无头结点链表的头插法实现函数,不太明白,为什么网上搜到的样例,总是在循环之前建立了一个结点,放入循环中建立,本人测试并无问题。
typedef struct Link {
    int  elem;
    struct Link *next;
}link;
//无头结点链表的头插法实现函数
link * creatLink(int * arc, int length) {
    int i;
    //最初状态下,头指针 H 没有任何结点,所以,插入第一个元素,就相当于是创建结点 H
    link * H = NULL;
    //如果采用头插法插入超过 1 个元素,则可添加到第一个结点 H 之前
    for (i = 0; i<length; i++) {
        link * a = (link*)malloc(sizeof(link));
        a->elem = arc[i];
        //插入元素时,首先将插入位置后的链表链接到新结点上
        a->next = H;
        //然后再链接头指针 H
        H = a;
    }
    return H;
}
//网上样例,无头结点链表的头插法实现函数
link * creatLink(int * arc, int length) {
    int i;
    //最初状态下,头指针 H 没有任何结点,所以,插入第一个元素,就相当于是创建结点 H
    link * H =(link*)malloc(sizeof(link));
    H->elem = arc[0];
    H->next = NULL;
    //如果采用头插法插入超过 1 个元素,则可添加到第一个结点 H 之前
    for (i = 1; i<length; i++) {
        link * a = (link*)malloc(sizeof(link));
        a->elem = arc[i];
        //插入元素时,首先将插入位置后的链表链接到新结点上
        a->next = H;
        //然后再链接头指针 H
        H = a;
    }
    return H;
}
 
原文地址:https://www.cnblogs.com/lixiangfu/p/13371670.html