一 问题描述
在学习数据结构链表的时候,做了一个题目稀疏多项式求和问题
。在写完参考答案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;
}