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



