练习链表的删除出现了问题求助!
以下是我练习链表创建,输出和删除,创建和输出都可以,就是删除这一块出问题。请帮我看看是哪里出了问题,请指点一下,谢谢!现在一运行就出现如下图的报错:

#include <stdio.h>
#include <malloc.h>
typedef struct NUM
{
int a;
struct NUM *next;
}num,*pnum;
pnum c_list(void); //创建链表
void s_list(pnum head); //输出链表
void d_list(pnum head , int a); //删除链表(删除指定的值)
int main(void)
{
pnum p;
p = c_list(); //创建链表,并将链表首节点赋给P
s_list(p); //输出链表
d_list(p, 2); //删除链表(删除值为2的节点)
return 0;
}
//创建链表
pnum c_list(void)
{
pnum p;
pnum pend; //尾节点
int i;
pnum head; //首节点,指向头节点
head = (pnum)malloc(sizeof(pnum));
head->next = NULL;
p = head;
for(i=0; i < 3; i++)
{
pend = (pnum)malloc(sizeof(pnum));
pend->a = i;
pend->next = NULL;
p->next = pend;
p = p->next;
}
return head;
}
//输出链表
void s_list(pnum head)
{
pnum p;
p = head; //接收传过来的首节点
while(NULL != p->next)
{
printf("%d ",p->next->a);
p = p->next;
}
printf("\n");
}
//删除链表
void d_list(pnum head , int a) //int a 接收删除指定的节点
{
pnum p;
pnum q; //用于指向需要删除的节点
p = head; //接收传过来的首节点
while(NULL != p->next)
{
if(p->next->a == a)
{
q = p->next;
p->next = q->next;
free(q);
q = NULL;
}
p = p->next;
}
}

#include <stdio.h>
#include <malloc.h>
typedef struct NUM
{
int a;
struct NUM *next;
}num,*pnum;
pnum c_list(void); //创建链表
void s_list(pnum head); //输出链表
void d_list(pnum head , int a); //删除链表(删除指定的值)
int main(void)
{
pnum p;
p = c_list(); //创建链表,并将链表首节点赋给P
s_list(p); //输出链表
d_list(p, 2); //删除链表(删除值为2的节点)
return 0;
}
//创建链表
pnum c_list(void)
{
pnum p;
pnum pend; //尾节点
int i;
pnum head; //首节点,指向头节点
head = (pnum)malloc(sizeof(pnum));
head->next = NULL;
p = head;
for(i=0; i < 3; i++)
{
pend = (pnum)malloc(sizeof(pnum));
pend->a = i;
pend->next = NULL;
p->next = pend;
p = p->next;
}
return head;
}
//输出链表
void s_list(pnum head)
{
pnum p;
p = head; //接收传过来的首节点
while(NULL != p->next)
{
printf("%d ",p->next->a);
p = p->next;
}
printf("\n");
}
//删除链表
void d_list(pnum head , int a) //int a 接收删除指定的节点
{
pnum p;
pnum q; //用于指向需要删除的节点
p = head; //接收传过来的首节点
while(NULL != p->next)
{
if(p->next->a == a)
{
q = p->next;
p->next = q->next;
free(q);
q = NULL;
}
p = p->next;
}
}
...全文


