请给出一个单链表的基本实现，要求包含节点结构体定义、插入函数和打印函数，同时include头文件也必须说明出处
user
```c
#include <stdio.h>  // 出自标准C库
#include <stdlib.h> // 出自标准C库

// 定义节点结构体
struct Node {
    int data;           // 节点数据
    struct Node* next;  // 指向下一个节点的指针
};

// 插入函数：在链表头部插入新节点
void insert(struct Node** head_ref, int new_data) {
    // 分配新节点内存
    struct Node* new_node = (struct Node*) malloc(sizeof(struct Node));
    // 设置新节点数据
    new_node->data = new_data;
    // 将新节点指向当前的头节点
    new_node->next = (*head_ref);
    // 将头节点更新为新节点
    (*head_ref) = new_node;
}

// 打印函数：打印整个链表
void printList(struct Node* node) {
    while (node != NULL) {
        printf("%d -> ", node->data);
        node = node->next;
    }
    printf("NULL\n");
}
```
assistant