链表中出现的问题

代码

cpp 复制代码
#include<iostream>
#include<stdexcept>
using namespace std;
#define eleType int
//节点的实现
struct listNode {
	eleType data;
	listNode* next;
	//数据域这里错了,初始化一直是0啊,无法改变
	//listNode(eleType x):data(0),next(NULL){}
	listNode(eleType x) :data(x), next(NULL) {}
};
//链表类:增删改查
class linkedList {
private:
	listNode* head;
	int size;
public:
	linkedList():head(NULL),size(0){}//这里由于实例化对象调用的是默认构造函数,所以第一个小括号里面不应该有参数
	//插入函数声明
	void insert(eleType value,int i);
	//删除函数声明
	void remove(int i);
	//查找函数声明
	listNode* find(eleType value);
	listNode* get(int i);
	//修改函数声明
	void update(eleType value, int i);
	//调试函数声明
	void print();
	~linkedList();
};
//析构函数->问题4
linkedList::~linkedList() {
	listNode* curr = head;
	while (curr) {
		listNode* temp = curr;
		curr = curr->next;
		delete temp;
	}
}
//插入函数
void linkedList::insert(eleType value,int i) {
	if (i<0 || i>size) {
		throw out_of_range("Invalid Position!");//问题1
	}
	listNode* newCode = new listNode(value);//问题2
	if (i == 0) {
//		listNode* curr = head;//这个指针多余了
		newCode->next = head;
		head = newCode;
	}
	else {
		listNode* curr = head;
		for (int j = 0; j < i - 1; j++) {
			curr = curr->next;
		}
		newCode->next = curr->next;
		curr->next = newCode;
	}
	size++;
}
//删除函数
void linkedList::remove(int i) {
	if (i<0 || i>size) {
		throw out_of_range("Invalid Position!");
	}
	if (i == 0) {
		listNode* curr = head;
		head = curr->next;
		delete curr;
	}
	else {
		listNode* curr = head;
		for (int j = 0; j < i - 1; j++) {
			curr = curr->next;
		}
		listNode* temp = curr->next;
		curr->next = temp->next;
		delete temp;
	}
	size--;
}
//查找函数
listNode* linkedList::find(eleType value) {//给值传数
	listNode* curr = head;
	while (curr && curr->data != value) {
		curr = curr->next;
	}
	return curr;
}
listNode* linkedList::get(int i) {//给数传值
	if (i<0 || i>size) {
		throw out_of_range("Invalid Position!");
	}
	listNode* curr = head;
	for (int j = 0; j < i; j++) {
		curr = curr->next;
	}
	return curr;
}
void linkedList::update(eleType value, int i) {
	if (i<0 || i>size) {
		throw out_of_range("Invalid Position!");
	}
	listNode* curr = head;
	for (int j = 0; j < i; j++) {
		curr = curr->next;
	}
	curr->data = value;
}
void linkedList::print() {
	listNode* curr = head;
	while (curr) {
		cout << curr->data << ' ';
		curr = curr->next;//这里要偏移指针遍历链表啊
	}
	cout << endl;
}
int main() {
	linkedList list;//问题3
	list.insert(10, 0);
	list.insert(20, 1);
	list.insert(30, 2);
	list.insert(40, 3);
	list.insert(50, 4);
	list.print();
	list.remove(0);
	list.print();
	list.update(666, 0);
	list.print();
	listNode* const temp = list.find(666);
	cout << temp->data << endl;
	cout << list.get(0)->data << endl;
	return 0;
}

反思

我想讲一下结构体和类里面的初始化列表:

listNode(eleType x) :data(x), next(NULL) {}

这个是结构体里面的初始化列表,由于每个节点都有数据域和指针域两个部分,所以初始化时包含这两个参数的初始化,而输入端输入的是数据域的值,所以类型也跟data保持一致。

linkedList():head(NULL),size(0){}//这里由于实例化对象调用的是默认构造函数,所以第一个小括号里面不应该有参数

这个是类里面的初始化列表,两个参数一个是头节点,一个是链表长度,暂时不需要从外部输入来确定他们的值,所以初始化为NULL和0,而且调用时为默认构造函数,则第一个小括号中就不用写东西啦。

相关推荐
FunnySaltyFish15 分钟前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱1 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者17 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮17 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者18 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考18 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx21 小时前
CART决策树基本原理
算法·机器学习
Wect1 天前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱1 天前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法
肆忆_1 天前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++