ccdnyy 2024-04-13 11:16 采纳率: 0%
浏览 2

数据结构里获取链表某个元素,为什么还要引入一个p

如图所示,直接用p=0不就好了,为什么又弄个链表,又弄个计数器等于1的,不是麻烦了嘛?

img


img

  • 写回答

6条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-13 11:16
    关注

    引自免费微信小程序:皆我百晓生

    在C++中实现获取链表中第i个元素的功能时,确实可以通过不同的方法来实现。这里所展示的两种方式都是为了遍历链表并找到指定位置的元素。不过,它们之间有一些微妙的区别。

    第一种方法(图1)使用了一个名为p的指针和一个名为j的计数器。这种方法的思路是先将p指向链表的第一个元素(即头节点的下一个节点),然后通过j来跟踪当前遍历到的位置。当p不为NULL且j小于目标位置i时,继续移动p到下一个节点,并增加j的值。这样做的好处是可以节省空间,因为只需要一个额外的指针p。但是,这种方法要求输入的索引i必须是有效的,即0 <= i < 链表长度,否则可能会导致程序错误,因为它没有检查链表是否足够长以容纳第i个元素。

    第二种方法(图2)使用了一个名为P的计数器,同时在遍历过程中更新元素内容到e。这种方法的优点是在遍历时同时更新了结果,因此不需要额外的空间来存储临时的节点指针。然而,这种方法在逻辑上稍微复杂一些,因为它在循环内更新了e,这可能容易让人误解,以为每次循环都会更新结果。实际上,只有在找到正确位置后才会更新e

    总结一下,这两种方法各有优缺点。第一种方法更简洁,但需要确保输入的索引有效;第二种方法稍微多一点冗余,但它在找到正确位置后立即返回结果。在实际编程中,选择哪种方法取决于具体需求、代码风格和个人偏好。如果你想要一种更加清晰明了的方法,可以考虑将第二个版本稍作修改,使其逻辑更明确:

    EStatus GetElem(LinkList L, int Position, ElemType& e) {
        int P = 0;
        while (L && P < Position) {
            L = L->next;
            P++;
        }
    
        if (!L) {
            return ERROR; // 第i个元素不存在
        }
        
        e = L->data;
        return OK;
    }
    

    这个版本在找到正确位置之前不会更新e,并在找到正确位置后才进行赋值。这样,代码的意图就更加清晰了。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月13日

悬赏问题

  • ¥15 matlab做ba模型让其在ba和er规则下生长
  • ¥50 有偿!centos curl port设置问题
  • ¥15 请问Quartus的Verilog代码怎么写?
  • ¥100 Mac 版foxmail 收邮件问题
  • ¥15 QWebEngineView
  • ¥15 如何使用shufflenet进行手写数字识别
  • ¥20 微信小程序播放直播流
  • ¥15 关于迷宫自走单片机循迹小车的知识
  • ¥15 python使用selenium工具爬取网站的问题
  • ¥15 visual studio中c语言用ODBC链接SQL SERVER