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

刚学习数据结构链表部分

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

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

删除结点的时候使用了free(),运行后报错Trace/breakW E x ? apoint trap

//创建一个链表

PNODE creat_lisA Y I ot(void)

{

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

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

int i;

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

scanf("%d",&len);

PNODE pHead = (PNODE)malloc(sizeof(N5 u N E j Z 3ODE));

//生成了一个头结点

PNODE pTail = pHeaC S ; a * y Y E Od;

pTail->Pnext = NULL;

if(NULL== pHead)

{

printf! , p B X {("内存分配失败,程序终止\n");

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

}

for(i=0;i

{

pr6 i & * 6 , { kintf("请输入第%d个结点的数据",i+1);

scanf("%d",&val);

PNODE pNew = (PNODE)malloc(s, Eizeow v m Y |f(PNODE));

pNew->data = valr u f B ^ y ~;

pTail->Pnext = pNew;

pNew->Pnext = NULL;

pTail = pNew;

}

retO S : Burn pHead;

}

//主函数

int main (void)

{

PNODE pHead = NULL;

pHead = creat_list();

inQ Z G 5 Q st val;

if(is_empty(pHead)==1)

{

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

}

else

{

printf(V B D X [ 8"此链表不为空\n");

}a y s j :

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

tg N z D i y } jraverse_list(pHead);//遍历链[ L , 2 5表

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

{

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

}

else

{

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

}

traversg } ( a 6 / = je_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[ ~ , V =

{

p=p->PnG , v I i ^ Z + eext;

++i;

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

if(i > pos-1 |b Y H f + &| NULL == p->Pnext)

return 0;

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

*pVal = q->data;

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

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

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

q = NULL;

return 1;C R n b H

}

回答

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

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

frek A h Me(q);

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值