这是一个指向指针变量地址的指针变量

这是一个指向指针变量地址的指针变量(指针变量的指针)
一、前言

在链表数据结构中,在实现根据位置获取链表结点的方法(getByIndx)时,可以直接循环查询然后返回结点的指针。但由于之前的操作都是返回操作的状态码,如成功返回OK,索引越界返回OVERFLOW等,为了保持操作格式的规范,需要对方法进一步处理。

#include <iostream>

#define OK 200
//#define ERROR -404
#define OVERFLOW 300

using namespace std;
typedef int Status;

class ListNode {
private:
    int data;  // 头结点数据域不存储数据,只存储链表的长度
public:
    ListNode* next;
    // 定义3个构造方法
    ListNode();
    ListNode(const int *a, int n);
    explicit ListNode(int val);

    int getData() const;

    // 定义3个操作函数:根据位置返回节点ptr,将newNode结点插入第i个位置,根据位置删除节点
    Status insertNode(int i, ListNode *newNode);
    Status delByIndx(int i);
    void display() const;
};
  • 思路:在保持方法数据规范的前提下,在getByIndx方法中,增加一个指针参数用于接收目标结点的返回值。
二、使用指针作为参数的技巧

指针参数接收返回值的使用概括起来就是,需要接收谁的返回值,就传谁的指针作为形参,即要修改谁就传谁的指针变量作为形参。例如,在根据位置查询结点的方法中,使用结点指针(ListNode*)接收返回值,那么就使用结点指针的指针(ListNode**)作为形参。方法实现如下

#define OVERFLOW 300
#define OK 200
typedef int Status;
...
Status ListNode::getNodeByIndx(int i, ListNode **ptr) {
    if(i < 1 || i > data)  // 此代码中头节点的数据域存放链表长度数据。
        return OVERFLOW;
    ListNode *p = this;
    for(int j = 0; j < i; j ++)
        p = p->next;
    *ptr = p;
    return OK;
}
  • main方法中调用的示例

    ListNode *p_idx = nullptr;
    Status code;
    cin >> loc;
    code = head->getNodeByIndx(loc, &p_idx);  // 使用&取址操作符传入指针变量的地址
    if(code == OK)
        cout << p_idx->getData() << endl;
    else if(code == OVERFLOW)
        cout << "输入索引不合法!" << endl;
    else if(code == ...)
        ...
    

    这样可以让操作方法的格式保持较高的一致性,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值