C语言的链表问题,求各位大佬帮帮忙


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct STU
{
	int num;
	struct STU *next;
};
struct STU *creat();
void printf1(struct STU *head);
void add(struct STU **head,struct STU stu);
void del(struct STU **head,int num);
void des(struct STU **head);
int main()
{
	struct STU *head1,stu;
	int num;
	head1=creat();
	printf1(head1);
	printf("\n请输入要添加的学生信息\n");
	scanf("%d",&stu.num);
	add(&head1,stu);
	printf1(head1);
	printf("\n请输入要删除的学生学号\n");
	scanf("%d",&num);
    del(&head1,num);
	printf1(head1);
	des(&head1);
	
}
struct  STU *creat()
{
	struct STU *head=NULL,*p1,*p2;
	p1=(struct STU *)malloc(sizeof(struct STU));
	p1->next=NULL;
	scanf("%d",&p1->num);
	while(p1->num!=0)
	{
		if(head==NULL)
		{
			head=p1;
			p2=p1;
		}
		else
		{
			p2->next=p1;
			p2=p1;
		}
		p1=(struct STU *)malloc(sizeof(struct  STU));
		p1->next=NULL;
		scanf("%d",&p1->num);
	}
	return head;
}
void printf1(struct STU *head)
{
	while(head!=NULL)
	{
		printf("%4d",head->num);
		head=head->next;
	}
}
void add(struct STU **head,struct STU stu)
{
	struct STU *p1,*p2,*p;
	p=(struct STU *)malloc(sizeof(struct STU));
	p->num =stu.num;
	p->next=NULL;
	p1=*head;
	while(p1->num<stu.num&&p1!=NULL)
	{
		p2=p1;
		p1=p1->next;
	}
	//printf("3");
	if(p1==*head)
	{
		*head=p;
		p->next=p1;
	}
    else if(p1!=NULL)
	{
		p2->next=p;
		p->next=p1;
	}
   if(p1==NULL)
	{
	  // printf("1");
		p2->next=p;
		p->next=NULL;
	}
}
void del(struct STU **head, int num )
{
	struct STU *p1,*p2;
	p1=*head;
	while(p1!=NULL&&p1->num!=num)
	{
		p2=p1;
		p1=p1->next;
	}
	if(p1==*head)
	{
		*head=(*head)->next;
	}
	else if(p1!=NULL&&p1->num==num)
	{
       p2->next=p1->next;
	}
	else
		printf("查无此人");
}
void des(struct STU **head)
{
	struct STU *p;
	while(*head)
	{
		p=*head;
		*head=(*head)->next;
		free(p);
	}
}

求助!!为什么这个链表的插入子函数(void add)在插入的是末尾值的时候会死在while循环里面啊,按照理论来说它读到P1=NULL就会退出来啊,可是它还是死在了读取NULL之后,并且没有跳出循环。有劳各位大佬帮忙解解疑惑,困扰我一天了,是不是我创建链表出了问题还是啥的(但是我其他子函数运行都没问题啊)

while(p1->num<stu.num&&p1!=NULL)

 我觉得应该是要把p1!=NULL放在前面,因为当p1为空时,就不存在p1->num这个了,所以会出错

	while(p1->num<stu.num&&p1!=NULL)
	{
		p2=p1;
		p1=p1->next;
	}

假如p1为NULL,前面的p1->num<stu.num肯定会产生异常中断的。你试试p1!=NULL&&p1->num<stu.num

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y