c语言删除节点的函数,C语言程序,单向动态链表删除结点,使用free(),报错 Trace/breakpoint trap...

这篇博客介绍了在学习数据结构链表时遇到的C语言删除节点问题。作者在创建链表并进行操作后,尝试删除节点时遇到'Trace/breakpoint trap'错误。博客分析了可能的原因,包括检查循环条件是否正确遍历链表,以及确认被释放的节点是否是通过malloc动态分配的内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刚学习数据结构链表部分

学习视频是郝斌老师数据结构的公开视频。

主函数中调用了2个函数,一个是创建链表的函数,另一个是删除结点的函数。

删除结点的时候使用了free(),运行后报错Trace/breakpoint trap

//创建一个链表

PNODE creat_list(void)

{

int len;//用来临时存放用户输入的结点的个数

int val;//用来临时存放用户输入的结点的数据

int i;

printf("请输入您要输入的链表的结点个数:\nlen=");

scanf("%d",&len);

PNODE pHead = (PNODE)malloc(sizeof(NODE));

//生成了一个头结点

PNODE pTail = pHead;

pTail->Pnext = NULL;

if(NULL== pHead)

{

printf("内存分配失败,程序终止\n");

exit(-1);//内存都分配失败了,这个程序就没有继续的必要了

}

for(i=0;i

{

printf("请输入第%d个结点的数据",i+1);

scanf("%d",&val);

PNODE pNew = (PNODE)malloc(sizeof(PNODE));

pNew->data = val;

pTail->Pnext = pNew;

pNew->Pnext = NULL;

pTail = pNew;

}

return pHead;

}

//主函数

int main (void)

{

PNODE pHead = NULL;

pHead = creat_list();

int val;

if(is_empty(pHead)==1)

{

printf("此链表为空\n");

}

else

{

printf("此链表不为空\n");

}

printf("生成链表的长度为: %d\n",length_list(pHead));

traverse_list(pHead);//遍历链表

if (delete_list(pHead,3,&val))

{

printf("删除成功,您删除的结点的数据是%d\n",val);

}

else

{

printf("删除失败!\n");

}

traverse_list(pHead);//遍历链表

return 0;

}

//删除结点的函数

_Bool delete_list(PNODE pHead,int pos,int * pVal)

{

int i = 0;

PNODE p = pHead;

PNODE q;

while(NULL!=p->Pnext && i

{

p=p->Pnext;

++i;

}//while 循环使得p指向了pos前的一个结点

if(i > pos-1 || NULL == p->Pnext)

return 0;

q = p->Pnext;//指向了要删除的结点

*pVal = q->data;

//删除P结点后面的结点

p->Pnext = p->Pnext->Pnext;

free(q);//这句报错!!!!!!!!!!!!!!!!!!!

q = NULL;

return 1;

}

回答

while(NULL!=p->Pnext && i

检查这里的循环,是否遍历到链表外面(比如创建链表的时候,没有把最后节点的pNext设置为null)。

free(q);

q所在节点,是通过malloc动态分配的么

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值