这里为什么使用node->next = NULL;就会警告,node不是尾结点吗?我把尾结点的指针域置空为什么还会警告?

问题遇到的现象和发生背景

下面代码中,在建立链表函数中node->next = NULL; //这里为什么使用node->next = NULL;就会警告,node不是尾结点吗?我把尾结点的指针域置空为什么还会警告?我知道要用end->next =NULL;
//警告的内容是;使用未初始化的内存"node"

用代码块功能插入代码,请勿粘贴截图
#pragma warning(disable : 4996) 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN (sizeof(struct Student))


typedef struct Student
{
    long num;
    char name[20];
    struct Student* next;
}student;


int main()
{
    student* creat(int n);
    void print(student * head);
    student* del(student * a, student * b);
    void fr(student * head);
    int m, n;
    student* ahead, *bhead;
    printf("The number of students in Linked List A is:");
    scanf("%d", &n);
    printf("\n");
    ahead = creat(n);    //链表a
    


    printf("The number of students in Linked List B is:");
    scanf("%d", &m);
    printf("\n");
    bhead = creat(m);    //链表b  

    del(ahead, bhead);
    print(ahead);
    return 0;
}


student* creat(int n)   
{
    int i;
    student* head, * node, * end;   //end是尾指针
    head = (student*)malloc(LEN);
    if (head == NULL)
    {
        printf("out of memory, the request failed!\n");
        exit(-1);
    }
    memset(head, 0, LEN);
    end = head;       
    printf("Please enter data for these students:\n");
    for (i = 0; i < n; i++)
    {
        node = (student*)malloc(LEN);
        if (node == NULL)
        {
            printf("out of memory, the rquest failed!\n");
            exit(-1);
        }
        memset(node, 0, LEN);
        end->next = node;
        end = node;
        scanf("%ld %s", &node->num, &node->name);
    }
    node->next = NULL;    //这里为什么使用node->next = NULL;就会警告,node不是尾结点吗?我把尾结点的指针域置空有什么错?
                                                                    //警告的内容是;使用未初始化的内存"node"
    return head;
}


student* del(student* a, student* b)    //删除a链表中与b链表相同的学号
{
    student * pt;
    student* p = a;    
    student* q = b;
    for (p = a; p->next!= NULL;)   //外循环执行到尾结点的前驱结点
    {
        for (q = b; q->next != NULL;q = q->next)   //内循环执行到尾结点的前驱结点
        {
            if (p->next->num == q->next->num)   //当前项p的后驱结点的数据 == 当前项q的后驱结点的数据
            {
                pt = p->next;    //中间变量pt指向当前项p的后驱结点
                p->next = pt->next;     //当前项的指针域存放当前项p的后驱结点的后驱结点
                free(pt);    //释放当前项p的后驱结点的内存空间
                pt = NULL;
                break;    
            }
            else if(q->next->next == NULL)     //当q指向尾结点的前驱结点,就让p指向下一个结点
            {
                p = p->next;
            }
        }   //内循环for语句里q = q ->next控制当前结点
           //而for语句中(p->next->num == q->next->num)比较的是当前结点的下一个结点
           //所以当内循环for语句里的q指向尾结点的前驱结点,下面的语句中就要进行尾结点的比较
           //比较后,因为尾结点是链表的最后一个结点,并且尾结点已经比较过了,所以就要结束内循环,进行外循环
          //每次都要判断内循环for语句中q是否指向尾结点的前驱结点,当q指向尾结点的前驱结点。就说明刚才尾结点已经比较过了,那么就执行外循环
    }
    return a;
}


void print(student* head)
{
    printf("After processing, the data of these students are:\n");
    for (head = head->next; head != NULL; head = head->next)
    {
        printf("%ld\t%s\n", head->num, head->name);
    }
}


void fr(student* head)   
{
    student* p = head;
    for (; p != NULL;)
    {
        p = p->next;
        free(p);
        p = NULL;
    }
}

运行结果及报错内容
The number of students in Linked List A is:4

Please enter data for these students:
101 Wang
102 Li
105 Zhang
108 Wei
The number of students in Linked List B is:5

Please enter data for these students:
103 Zhang
104 Ma
105 Chen
107 Guo
108 Liu
After processing, the data of these students are:
101     Wang
102     Li


//警告的内容是;使用未初始化的内存"node"

我的解答思路和尝试过的方法
我想要达到的结果

因为如果for循环存在不满足条件的可能,那么由于node指针没有初始化,所以node->next是会出问题的。
正确写法是
定义node是初始化为NULL
最后应该是

if(node != NULL)
    node->next = NULL;