1. 都删除了链表,你还用那个链表

一 问题描述

在学习数据结构链表的时候,做了一个题目稀疏多项式求和问题。在写完参考答案add_n(p, q)函数后,又自己写了一个函数addpolymerization(p,q),两个函数内容一样,在主函数中调用这两个函数:

int main(int argc, char** argv) 
{
	int x, t;	
	ptr p, q, L, S;
	
	// 创建单向加头循环链表 
	cout << "input p: " << endl;
	p = createLinkedlist();
	cout << "input q: " << endl;
	q = createLinkedlist();
	
	// 输出单向加头循环链表p 
	outlinkedlist(p);
	// 输出单向加头循环链表q
	outlinkedlist(q);
	
	L = add_n(p, q);  
	S = addpolymerization(p, q); 
	
	// 输出结果  
	cout << "ADD result1: " << endl;	
	outlinkedlist(L);
	cout << endl;
	cout << "ADD result2: " << endl;	
	outlinkedlist(S);
	
	return 0;
}

然后编译能够通过,但是在程序执行时,卡在不动。调试时,出现错误:

在这里插入图片描述
这个错误,是因为指针未初始化或越界,访问到了未分配地址的空间

二 问题分析

add_n(p, q)函数中,最后有一条代码,free(q),都把q链表删除了,然后下面又用了q链表。当然就会出错了。
在这里插入图片描述

三 结论

所以,不要都删除了那个链表,你还用那个链表,解决方法是复制一个链表去使用。

附录: add_n(p, q)函数

ptr add_n(ptr ha, ptr hb) 
{
	ptr p, q, last_p, pre_q;
	int val;
	p = ha->next; q = hb->next;
	last_p = ha; pre_q = hb;
	
	while (p!=ha && q!=hb)
	{
		//第一种情况ha中结点 指数更大 
		if (p->exp > q->exp) 
		{
			pre_q->next = q->next; //从hb链表删除q结点
			last_p->next = q; // 插入ha链表
			q->next = p;
			last_p = last_p->next; //调整前驱指针位置
			q = pre_q->next; // 在hb中取一个新结点 
		}
		else if (p->exp < q->exp) // 第二种情况ha中结点指数更小 
		{
			last_p = p; //双指针自然后移一位 
			p = p->next;
		} 
		else // 第三种情况 
		{
			val = p->coef + q->coef;
			if (val != 0) //改ha中的系数值,删除hb中结点
			{
				p->coef = val; // 改p中系数,双指针后移一位
				last_p = p;
				p = p->next;			 
				pre_q->next = q->next; //删除q中结点 
				free(q);
				q = pre_q->next; 
			 } 
			 else //删除系数相加后为0的结点
			 {
			 	last_p->next = p->next; //删ha中结点
				free(p);
				p = last_p->next;
				//删hb中结点
				pre_q->next = q->next;
				free(q);
				q = pre_q->next; 			 	
			  } 
		} 
		
	}
	
	if (q != hb) //插入hb剩余的链表
	{
		last_p->next = q;
		while (q->next != hb) 
			q = q->next;
		q->next = p; // p指向的就是ha,此时,q->next指向的也是ha 
	} 
	free(hb);
	
	return ha;
}

猜你喜欢

转载自blog.csdn.net/ALexander_Monster/article/details/106213177