这是一个指向指针变量地址的指针变量(指针变量的指针)
一、前言
在链表数据结构中,在实现根据位置获取链表结点的方法(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 == ...) ...
这样可以让操作方法的格式保持较高的一致性,