Drgata 2020-01-02 11:46 采纳率: 0%
浏览 75

大佬们为什么我的链表只能删除开头,删除不了中间?

从a链表中删除与b链表中有相同学号的节点

struct student *delete(struct student *p1,struct student *p2)
{
    struct student *head1,*head2,*p3,*temp;
    for(head1=p3=p1;p1!=NULL;p1=p1->NEXT){
        for(head2=p2;p2!=NULL;p2=p2->NEXT){
            if(p1->num==p2->num){
                if(p1==head1){
                    head1=head1->NEXT;
                }else{
                    temp=p1;
                    p3->NEXT=p1->NEXT;
                    free(temp);
                    p1=p3;
                    printf("here\n");
                }
            }
        }
        p3=p1;
    }
    return head1;
}

这一段有问题

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-27 00:32
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这段代码有两处问题:

    1. 你的 for 循环在遍历 p2 的时候就结束了。你应该等到 p2 指向 NULL 才能结束循环。

    修复方法如下:

    while (p2 != NULL) {
        // ...
    }
    
    // ... 
    
    1. p1p2 都到达了 NULL,你没有检查它们是否都到达了 NULL。如果有一个还没有到达 NULL,那么删除操作就会失败。你可以通过添加一个条件判断来解决这个问题。 修正后的代码如下:
    void deleteStudent(struct student *p1, struct student *p2) {
        while (p2 != NULL && p2->next != NULL) {
            if (p1 == p2) {
                p1 = p1->next; // 更新 p1 到下一个节点
                free(p2); // 移除 p2
                break;
            }
            p2 = p2->next; // 向后移动到下一个节点
        }
    }
    

    这样修改后,当遇到第一个相同学号的学生时,就可以直接将 p1 跳转到下一个学生,并释放掉 p2

    评论

报告相同问题?