链表类中指针使用问题的记录

编程问题:
给定链表大小m,如果原链表长度小于m则保持原链表长度不变,否则将链表长度减小为m
解决思路:
程序思路很简单,首先找到第m+1个节点记为ptr,再设置一个指针指向ptr之后的节点记为ptr1,删除ptr,并将其设置为nullptr,接着设置tmp指针,指向ptr1之后的节点,删除ptr1,ptr1指向tmp,重复操作,直到ptr1为nullptr则结束

ListNode<T>* ptr1 = ptr->next;
delete ptr;
ptr = nullptr;
ListSize--;
ListNode<T>* tmp;
while(ptr1 != nullptr)
{
	tmp = ptr1->next;
	delete ptr1;
	ptr1 = tmp;
	ListSize--;
}

就是这么简单的操作出错了,在该函数上找了好长时间的错误,一直找不出来,最后加语句打印,发现是析构函数运行时出现了问题。

析构函数如下:

template<class T>
LinearList<T>::~LinearList()
{
	int i = 0;
	ListNode<T>* tmp;
	while (FirstNode != nullptr)
	{
		tmp = FirstNode;
		FirstNode = FirstNode->next;
		delete tmp;
		tmp = nullptr;
		i++;
	}
	if (i == ListSize)
		std::cout << "Free Mem OK" << std::endl;
}

错误原因:
原本被删除的节点并不是nullptr(我自以为已经是了,毕竟我设置了ptr为nullptr…)。但是ptr不是链表中的指针啊啊啊…特地的写了个程序进行了测试:

#include <iostream>
struct ListNode
{
	ListNode* next;
	int Num;
	ListNode(int elem) :Num(elem), next(nullptr) {}
};

int main()
{
	using namespace std;
	ListNode* test = new ListNode{ 13 };
	test->next = new ListNode{ 17 };
	ListNode* ptr = test->next;
	delete ptr;
	ptr = nullptr;
	if (test->next == nullptr)
		std::cout << "OK" << std::endl;
	delete test;
	return 0;
}

不会打印OK
知道错误的原因后,就好解决了

template<class T>
void LinearList<T>::setSize(int theSize)
{
	if (ListSize <= theSize)
		return;
	ListNode<T>* ptr = FirstNode;
	for (int i = 0; i < theSize-1; i++)
	{
		ptr = ptr->next;
	}
	ListNode<T>* ptr1 = nullptr;
	if (ptr->next->next != nullptr)
			ptr1 = ptr->next->next;
	delete ptr->next;
	ptr->next = nullptr;
	ListSize--;
	ListNode<T>* tmp;
	while(ptr1 != nullptr)
	{
		tmp = ptr1->next;
		delete ptr1;
		ptr1 = tmp;
		ListSize--;
	}
}

即找要删除节点的前一个节点,通过next进行取指针(这下是链表中的指针了…),问题解决。其实通过头节点找到相应节点删除,设置nullptr也可以的,然后再回到原来位置会更好看点,先做个记录,防止以后再犯(大概率会重犯)…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值