链表中出现的问题

代码

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

相关推荐
.道阻且长.4 小时前
2.LeetCode算法习题讲解--双指针--复写零
算法·leetcode·职场和发展
·薯条大王4 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
To_OC5 小时前
LC 438 找到所有字母异位词:暴力超时后,我靠滑动窗口一招搞定
javascript·算法·leetcode
白狐_7986 小时前
408数据结构第5章:二叉树遍历序列题——技巧、判断与真题型总结
数据结构
Forever Nore8 小时前
学完C语言力扣第一题做不来正常吗
数据结构·算法
hansang_IR9 小时前
【题解】LC:倍增 / 区间并查集(Range Parallel Unionfind)
c++·算法·并查集
东东最爱敲键盘9 小时前
day7.c++继承
c++
沫璃染墨10 小时前
《从零入门Linux系统篇(十五):系统工具篇·六——GDB调试器详解:从程序执行控制到高级调试技巧》
linux·运维·服务器·c语言·c++
吃着火锅x唱着歌10 小时前
Effective C++ 学习笔记 条款40 明智而审慎地使用多重继承
c++·笔记·学习