surunhe 2023-10-15 11:20 采纳率: 0%
浏览 7

链表删除重复结点保留一位

img


链表删除重复结点(保留一个)求各位帮我看看,这代码逻辑有没有问题,为什么就是运行不出来

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-15 15:12
    关注

    【以下回答由 GPT 生成】

    代码逻辑有一些问题,导致无法正确删除重复结点。

    以下是对代码进行修正的步骤:

    1. 初始化变量g和q。修改第8行:Lnode *g, *q, *r;

    2. 在第11行while循环中,g和q应该被分别初始化为p和p->next。修改第12行:g = p; q = p->next;。这样可以比较当前结点和下一个结点的值。

    3. 找到重复结点后,需要正确删除节点和更新指针。修改第16-19行如下:

    4. 获取待删除结点r的下一个结点:r = q->next;
    5. 将q的next指针指向r的next:q->next = r->next;
    6. 释放r占用的内存:free(r);

    7. 重复结点被删除后,应该继续检查下一个相邻结点。将第21行的return 7;和第24行的return 2;放在对应的循环内。

    8. 遍历完链表后,应该返回正确的结果。将第29行的return 13;放在循环之外。

    以下是修正后的代码:

    int destroy(LinkList *head) {
        Lnode *p, *g, *q, *r;
        if(*head == NULL || (*head)->next == NULL) {
            return 0;
        }
        p = (*head)->next;
        while(p != NULL && p->next != NULL) {
            g = p;
            q = p->next;
            while(q->next != NULL) {
                if(p->data == q->next->data) {
                    r = q->next;
                    q->next = r->next;
                    printf("%d\n", r->data);
                    free(r);
                } else {
                    q = q->next;
                }
            }
            p = p->next;
        }
        return 13;
    }
    

    希望以上修正能够帮助你解决问题。如果还有其他疑问,请随时提问。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 10月15日

悬赏问题

  • ¥50 ZYNQ7020双核FLAHS烧写的问题
  • ¥20 ue 5 中想要实现第一人称人物左右行走摆动的效果,摄像头只向右摆动一次(关键词-结点)
  • ¥15 钢岔管添加弹性约束模拟围岩作用
  • ¥15 AD9164瞬时带宽1.8G,怎么计算出来?
  • ¥15 鼠标右键,撤销删除 复制 移动,要怎样删除
  • ¥15 使用MATLAB进行余弦相似度计算加速
  • ¥15 服务器安装php5.6版本
  • ¥15 我想用51单片机和数码管做一个从0开始的计数表 我写了一串代码 但是放到单片机里面数码管只闪烁一下然后熄灭
  • ¥20 系统工程中,状态空间模型中状态方程的应用。请猛男来完整讲一下下面所有问题
  • ¥15 我想在WPF的Model Code中获取ViewModel Code中的一个参数