链表中出现的问题

代码

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,而且调用时为默认构造函数,则第一个小括号中就不用写东西啦。

相关推荐
tiger865几秒前
大语言模型面试和题解,梳理中国主流开源 LLM 系列的发展脉络、技术路线与工程取舍
人工智能·gpt·深度学习·算法·自然语言处理·面试·transformer
Methy4 分钟前
IoTHub半个月崩了五次?都是裸rethrow惹的祸
服务器·c++·后端
我不会起名字32213 分钟前
一天一道力扣Hot100(36):深度优先算法---组合总和
数据结构·c++·后端·python·算法·go
纪念 22917 分钟前
c++类和对象(四)
开发语言·c++
汉克老师29 分钟前
GESP2026年9月认证C++六级( 第三部分编程题(2、分树规划))精讲
c++·gesp·小学生·学c++编程
学生小羊35 分钟前
C++ 初阶 学习博客
c语言·c++·c++与c语言的区别·c++基础学习
雨落在了我的手上39 分钟前
Java数据结构(十五):哈希表
数据结构
虚无的纽扣40 分钟前
【力扣刷题】第三天:有效三角形的个数、快乐数
算法·排序算法
tiger86543 分钟前
大语言模型面试和题解,Context Engineering 怎么做?长 Prompt、动态上下文与 Memory 管理
人工智能·深度学习·算法·语言模型·自然语言处理·面试·nlp
辛苦才能1 小时前
C++多态原理:虚函数表的内存布局与动态绑定的汇编真相
开发语言·c++