阅读:0       作者:严长生

链表的创建,尾插法创建单链表(带源码+解析)

尾插法创建单链表,即每次都将新的结点链接到链表的最后一个结点的后面,从而达到创建单链表的过程。

例如,使用尾插法将数据 {1,2,3,4} 用单链表的形式进行存储,其存储过程如下图所示:

提示:图中所示的单链表没有设置头结点,如链表中需要设置头结点,则只需在每个链表前添加一个空结点即可。

实现代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Link {
    int  elem;
    struct Link *next;
}link;
//无头结点链表的尾插法实现函数
link * creatLink(int * arc, int length) {
    int i;
    //最初状态下,头指针 H 没有任何结点,所以,插入第一个元素,就相当于是创建结点 H
    link * H =(link*)malloc(sizeof(link));
    H->elem = arc[0];
    H->next = NULL;

    link * temp=H;
    //如果采用尾插法插入超过 1 个元素,则需添加到链表表尾
    for (i = 1; i<length; i++) {
        //创建新结点并对其进行初始化
        link * a = (link*)malloc(sizeof(link));
        a->elem = arc[i];
        a->next = NULL;
        //将新结点添加到链表的尾部
        temp->next = a;
        //循环过程中,temp时刻指向链表中的最后一个结点
        temp = temp->next;
    }
    return H;
}
//有头结点链表的尾插法实现函数
link * HcreatLink(int * arc, int length) {
    int i;
    //创建头结点 H,其链表的头指针也是 H
    link * H = (link*)malloc(sizeof(link));
    H->elem = 0;
    H->next = NULL;
    //设置一个指针,在遍历链表时用
    link * temp = H;
    //采用尾插法创建链表
    for (i = 0; i<length; i++) {
        //创建新结点并对其进行初始化
        link * a = (link*)malloc(sizeof(link));
        a->elem = arc[i];
        a->next = NULL;
        //将新结点链接到链表的表尾
        temp->next = a;
        //循环过程中,temp始终指向链表表尾的结点
        temp = temp->next;
    }
    return H;
}
//链表的输出函数
void display(link *p) {
    while (p) {
        printf("%d ", p->elem);
        p = p->next;
    }
    printf("\n");
}
int main() {
    int a[4] = { 1,2,3,4};
    //采用尾插法创建无头结点链表
    link * H = creatLink(a, 4);
    display(H);
    //采用尾插法创建有头结点链表
    link * head = HcreatLink(a, 4);
    display(head);
    //使用完毕后,释放即可
    free(H);
    free(head);
    return 0;
}
运行结果:
1 2 3 4
0 1 2 3 4

提示:首元素为 0 ,即表示链表中带有头结点。