C - 仅删除链表中最后一个节点旁边的不存在的节点将终止程序



>当我删除链表中存在的任何节点时,我的代码可以完美运行。 假设我的链表有 10 个节点,如果我想删除第 12 个、第 13 个、第 14 个......节点我的程序给了我预期的消息。

但是如果我想删除第 11 个节点(与最后一个节点相邻(,我的程序会以退出代码终止-1073741819 (0xC0000005)

int delete()
{
int position, count = 1;
printf( "nwrite your position" );
scanf( "%d", &position );
struct node *p, *q;
p = head;
if ( position == 0 ) {
p = p->next;
head = p;
return 0;
}
while ( p != NULL && count != position ) {
count++;
p = p->next;
}
count = 0;
if ( p == NULL ) {
printf( "link list is empty or link not foundn" );
return 0;
}
else {
q = p->next;
p->next = q->next;
}
}

当我删除链表中存在的qny节点时,我的代码工作得很好

不,它没有。 删除索引 0 处的节点看起来不错,但对于任何其他正索引n,它会尝试删除索引n+1 处的节点,方法是将指针p前进到指向节点n,然后操作p->next

但是如果我想删除第 11 个节点(与最后一个节点相邻(,我的程序以退出代码 -1073741819 (0xC0000005( 终止

我不相信,但我相信当您尝试删除最后一个节点(而不是最后一个节点之后的节点(时,程序会失败。 在这种情况下,p将前进以指向最后一个节点,其next指针为 null。 因此,此代码:

q=p->next;
p->next=q->next;

q设置为 null 指针,然后尝试取消引用该指针。

pNULL时,此语句无效

p->next = q->next;

因此,解决方案是将p->next == NULL语句添加到if条件中 喜欢这个:-

if ( p == NULL || p->next == NULL ) {
printf( "link list is empty or link not foundn" );
return 0;
}

现在正确的代码是

int delete()
{
int position, count = 1;
printf( "nwrite your position" );
scanf( "%d", &position );
struct node *p, *q;
p = head;
if ( position == 0 ) {
p = p->next;
head = p;
return 0;
}
while ( p != NULL && count != position ) {
count++;
p = p->next;
}
count = 0;
if ( p == NULL || p->next == NULL ) {
printf( "link list is empty or link not foundn" );
return 0;
}
else {
q = p->next;
p->next = q->next;
}
}

相关内容

  • 没有找到相关文章

最新更新