建立一个链表,每个结点包括……,输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,将此结点删去

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

建立一个链表,每个结点包括……,输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,将此结点删去
还有一个年龄19没删掉,循环执行到尾结点的前驱结点循环就终止了,怎么解决?

用代码块功能插入代码,请勿粘贴截图
#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];
    char sex[10];
    int age;
    struct Student* next;
}student;


int main()
{
    student* creat(int n);
    student* del(student * head, int a_ge);
    void print(student * head);
    void fr(student * head);
    student* head;
    int n, age;
    printf("please enter the number of students:");
    scanf("%d", &n);
    head = creat(n);

    printf("please enter an age:");
    scanf("%d", &age);
    printf("\n");
    del(head, age);
    printf("modified student data:\n");
    print(head);
    fr(head);
    return 0;
}

student* creat(int n)
{
    int i;
    student* head, * node, * 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 the student number, name, gender, age :\n");
    for (i = 0; i < n; i++)
    {
        node = (student*)malloc(LEN);
        if (node == NULL)
        {
            printf("out of memory, the request failed!\n");
            exit(-1);
        }
        memset(node, 0, LEN);
        end->next = node;
        end = node;
        scanf("%ld %s %s %d", &node->num, node->name, node->sex, &node->age);
        printf("\n");
    }
    return head;
}



student* del(student* head, int a_ge)
{
    student* p;  
    student* pt;  //中间变量
    for (p = head; p->next != NULL; p = p->next)   //p开始指向头结点,循环结束条件:当p指向尾结点的前驱结点
    {
        if (p->next->age == a_ge)     //若p的后驱结点等于输入的数值
        {
            pt = p->next;       
            p->next = pt->next;    //删除满足条件的结点
            free(pt);
            pt = NULL;
        }
    }
    return head;
}


void print(student* head)
{
    student* p;
    for (p = head->next; p != NULL; p = p->next)
    {
        printf("%ld\t%s\t%s\t%d\n", p->num, p->name, p->sex, p->age);
    }
}



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

运行结果及报错内容
please enter the number of students:4
please enter the student number, name, gender, age :
101 Ma m 20

102 Li f 23

103 Zhang m 19

104 Wang m 19

please enter an age:19

modified student data:
101     Ma      m       20
102     Li      f       23
104     Wang    m       19

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

修改如下,供参考:

#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];
    char sex[10];
    int  age;
    struct Student* next;
}student;
int main()
{
    student* creat(int n);
    student* del(student * head, int a_ge);
    void print(student * head);
    void fr(student * head);
    student* head;
    int n, age;
    printf("please enter the number of students:");
    scanf("%d", &n);
    head = creat(n);
    printf("please enter an age:");
    scanf("%d", &age);
    printf("\n");
    del(head, age);
    printf("modified student data:\n");
    print(head);
    fr(head);
    return 0;
}
student* creat(int n)
{
    int i;
    student* head, * node, * 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 the student number, name, gender, age :\n");
    for (i = 0; i < n; i++)
    {
        node = (student*)malloc(LEN);
        if (node == NULL)
        {
            printf("out of memory, the request failed!\n");
            exit(-1);
        }
        memset(node, 0, LEN);
        end->next = node;
        end = node;
        scanf("%ld %s %s %d", &node->num, node->name, node->sex, &node->age);
        printf("\n");
    }
    return head;
}
student* del(student* head, int a_ge)
{
    student* p;
    student* pt;  //中间变量
    for (p = head; p->next != NULL; )// p = p->next)   修改
    {
        if (p->next->age == a_ge)     //若p的后驱结点等于输入的数值
        {
            pt = p->next;
            p->next = pt->next;    //删除满足条件的结点
            free(pt);
            pt = NULL;
        }
        else                  //修改
            p = p->next;      //修改
    }
    return head;
}
void print(student* head)
{
    student* p;
    for (p = head->next; p != NULL; p = p->next)
    {
        printf("%ld\t%s\t%s\t%d\n", p->num, p->name, p->sex, p->age);
    }
}
void fr(student* head)
{
    student* p;
    for (; head != NULL;)  //for(p = head; p != NULL;) 修改
    {
        p = head;
        head = head->next;  //p = p->next; 修改
        free(p);
        p = NULL;
    }
}


student *del(student *head, int a_ge)
{
    student *p;
    student *pt; //中间变量
    // for (p = head; p->next != NULL; p = p->next) // p开始指向头结点,循环结束条件:当p指向尾结点的前驱结点
    for (p = head; p->next != NULL;) // p开始指向头结点,循环结束条件:当p指向尾结点的前驱结点
    {
        if (p->next->age == a_ge) //若p的后驱结点等于输入的数值
        {
            pt = p->next;
            p->next = pt->next; //删除满足条件的结点
            free(pt);
            pt = NULL;
        }
        else
            p = p->next;
    }
    return head;
}