C语言的函数跳转和链表赋值相关问题

问下为何我为一个结点赋值时会进行到主函数的输入age语句 若连续为三个结点赋值 程序会强制结束 不执行92 93行


#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
 
struct _node{
    int num;
    char name[10];
    char a[10];
    int age;
    struct _node *next;
};
 
struct _node* create()
{
    struct _node* head=(struct _node*)malloc(sizeof(struct _node));
    head->num=0;
    head->name[10]="0";
    head->a[10]="0";
    head->age=0;
    head->next=NULL;
    struct _node* pcurrent=head;
    while(1)
    {
        int number,ag;
        char na[10],b[10];
        printf("请输入学号\n");
        scanf("%d",&number);
        printf("请输入姓名\n");
        scanf("%s",na);    
        printf("请输入性别\n");
        scanf("%s",b);    
        printf("请输入年纪");
        scanf("%d",&ag);
        if(number==0||strcmp(na,"0")==0||strcmp(b,"0")==0||ag==0)
        {
            break;
        }
        struct _node *newnode=(struct _node*)malloc(sizeof(struct _node));
        newnode->num=number;
        strcpy(newnode->name,na);
        strcpy(newnode->a,b);
        newnode->age=ag;
        pcurrent->next=newnode;
        pcurrent=pcurrent->next;
    }
    pcurrent=head->next;
    printf("输出已经赋值的链表");
    while(pcurrent!=NULL)
    {
        printf("%d\n",pcurrent->num);
        pcurrent=pcurrent->next;
    }
    return head;    
    
};
 
int del(struct _node*head,int ag)
{
    struct _node* pcurrent=head->next;
    struct _node* prev=head;
    while(pcurrent!=NULL)
    {
        if(pcurrent->age==ag)
        {
            prev->next=pcurrent->next;
            struct _node* t=pcurrent;
            pcurrent=pcurrent->next;
            free(t);
        }
        if(pcurrent!=NULL)
        {
            prev=prev->next;
            pcurrent=pcurrent->next;
        }
    }
    pcurrent=head->next;
    printf("删除对应年纪后的链表");
    while(pcurrent!=NULL)
    {
        printf("%s\n",pcurrent->name[10]);
        pcurrent=pcurrent->next;
    }
    
}   
    
int main()
{
    struct _node *head=create(); 
    int age;
    printf("请输入一个想要删除的年纪");
    scanf("%d",&age);
    del(head,age);   
        
}

head->name[10]="0"; 不能这么写啊
name[10]是char类型,表示name数组的第10个元素,这是越界访问。而且"0"是字符串,也不能赋值给一个字符的
head->name[10]="0"; 改为strcpy(head->name,"0");

修改如下,改动处见注释,供参考:

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>

struct _node {
    int num;
    char name[10];
    char a[10];
    int age;
    struct _node* next;
};

struct _node* create()
{
    struct _node* head = (struct _node*)malloc(sizeof(struct _node));
    head->num = 0;
    head->name[0] = '\0';  //head->name[10] = "0"; 修改
    head->a[0] = '\0';     //head->a[10] = "0";    修改
    head->age = 0;
    head->next = NULL;
    struct _node* pcurrent = head;
    while (1)
    {
        int number, ag;
        char na[10], b[10];
        printf("请输入学号\n");
        scanf("%d", &number);
        printf("请输入姓名\n");
        scanf("%s", na);
        printf("请输入性别\n");
        scanf("%s", b);
        printf("请输入年纪");
        scanf("%d", &ag);
        if (number == 0 || strcmp(na, "0") == 0 || strcmp(b, "0") == 0 || ag == 0)
        {
            break;
        }
        struct _node* newnode = (struct _node*)malloc(sizeof(struct _node));
        newnode->num = number;
        strcpy(newnode->name, na);
        strcpy(newnode->a, b);
        newnode->age = ag;
        
        newnode->next = NULL;    //修改

        pcurrent->next = newnode;
        pcurrent = pcurrent->next;
    }
    pcurrent = head->next;
    printf("输出已经赋值的链表:\n");  //修改
    while (pcurrent != NULL)
    {
        printf("%d %s %s %d\n", pcurrent->num, pcurrent->name, pcurrent->a, pcurrent->age);//修改
        //printf("%d\n", pcurrent->num);
        pcurrent = pcurrent->next;
    }
    return head;
};

void del(struct _node* head, int ag) //修改   
//int del(struct _node* head, int ag)
{
    struct _node* pcurrent = head->next;
    struct _node* prev = head;
    while (pcurrent != NULL)
    {
        if (pcurrent->age == ag)
        {
            prev->next = pcurrent->next;
            struct _node* t = pcurrent;
            free(t);
            pcurrent = prev->next; //pcurrent=pcurrent->next; 修改
        }
        else    //if (pcurrent != NULL) 修改
        {
            prev = pcurrent; //prev = prev->next; 修改
            pcurrent = pcurrent->next;
        }
    }
    pcurrent = head->next;
    printf("删除对应年纪后的链表:\n");
    while (pcurrent != NULL)
    {
        printf("%d %s %s %d\n", pcurrent->num, pcurrent->name, pcurrent->a, pcurrent->age);//修改
        //printf("%s\n", pcurrent->name[10]);
        pcurrent = pcurrent->next;
    }

}

int main()
{
    struct _node* head = create();
    int age;
    printf("请输入一个想要删除的年纪");
    scanf("%d", &age);
    del(head, age);
}