代码在VC6.0能编译,在VS2015就崩溃,求大神指点

qq_28337005 2016-07-06 02:24:15
如题,代码如下;

#include<iostream>
typedef struct PolyNode* Polynomial;
struct PolyNode //运用队列对多项表达式进行运算
{
int coef;//系数
int expon;//指数
//struct PolyNode* link;
Polynomial link;
};


void Attach(int nCoef, int nExpon, Polynomial* rear)
{
Polynomial p;
p = new PolyNode;
p->coef = nCoef;//对新结点进行赋值
p->expon = nExpon;
p->link = NULL;
(*rear)->link = p;
*rear = p;//把队列中尾巴往后移
}

Polynomial ReadPoly()
{
int nNumber, nCoef, nExpon;
printf("请输入项数:");
std::cin >> nNumber;
Polynomial rear, front, temp;
rear = new PolyNode;//申请一个临时的头结点,必须要删除
rear->link = NULL;
front = rear;//队列中,刚开始头和尾都指向头结点
while (nNumber--)//根据具体的项数来限定循环
{
std::cin >> nCoef >> nExpon;
Attach(nCoef, nExpon, &rear);
}
temp = front;
front = front->link;
delete temp;
return front;//返回初始化完的多项式
}

Polynomial Multi(Polynomial p1, Polynomial p2)//这些p1,p2变量是不能改变.先赋给一些临时变量,这样内部的具体指向才不会改变
{
Polynomial rear, front, temp, t1, t2;
rear = new PolyNode;
rear->link = NULL;
front = rear;
//if (p1->coef && p2->coef)
if (!p1 || !p2)
{
printf("0 0");
return NULL;
}
//先得出第一项(防止下面多做循环)
t1 = p1; t2 = p2;
while (t2)
{
Attach(t1->coef * t2->coef, t1->expon + t2->expon, &rear);
t2 = t2->link;
}
t1 = t1->link;
int coef, expon;//用以下面的比较
while (t1)
{
t2 = p2;//在t2中,t1每循环一次,它就得重新回到第一的位置
rear = front;
while (t2)
{
coef = t1->coef * t2->coef;
expon = t1->expon + t2->expon;
//新新生成的结点该插在什么位置
while (rear->link && rear->link->expon > expon)//rear->link 保证不为NULL,继续循环下去
rear = rear->link;//进入下一个结点
if (rear->link && rear->link->expon == expon)//若是上面退出时,它还在上一个结点,因此我们需要拿它下一个结点来比较
rear->link->coef = rear->link->coef + coef;//指数相同,系数相加
else
{
Polynomial p = new PolyNode;
p->coef = coef;
p->expon = expon;
p->link = rear->link;
rear->link = p;
rear = rear->link;//还要把尾巴移动
}
//Attach(rear->coef, rear->expon, &rear);
t2 = t2->link;
}
t1 = t1->link;
}
/* while (t1)//不需要了,上面是不是零都已经全部处理了.
{
Attach(t1->coef, t1->expon, &rear);
t1 = t1->link;
}
while (t2)
{
Attach(t2->coef, t2->expon, &rear);
t2 = t2->link;
}*/
temp = front;
front = front->link;
delete temp;
return front;
}

int Swap(int Ele1, int Ele2)
{
if (Ele1 > Ele2)
return 1;
else if (Ele1 < Ele2)
return -1;
else
return 0;
}
Polynomial Add(Polynomial p1, Polynomial p2)
{
Polynomial rear, front, temp;
rear = new PolyNode;//创建一个运算后的多项式链表
rear->link = NULL;
front = rear;
while (p1 && p2)//若p1或p2有一个复制完就结束循环
{
switch (Swap(p1->expon, p2->expon))
{
case 1:
Attach(p1->coef, p1->expon, &rear);
p1 = p1->link;
break;
case -1:
Attach(p2->coef, p2->expon, &rear);
p2 = p2->link;
break;
case 0:
int sum = p1->coef + p2->coef;//指数相等,系数相加
if (sum)//不等于零才继续复制过去
Attach(sum, p1->expon, &rear);
// Attach(sum, p2->expon, &rear);
p1 = p1->link;
p2 = p2->link;
break;
}
}
while (p1)//若p1还有元素,把它全部复制到新的表达式中
{
Attach(p1->coef, p1->expon, &rear);
p1 = p1->link;
}
while (p2)//若p1还有元素,把它全部复制到新的表达式中
{
Attach(p2->coef, p2->expon, &rear);
p2 = p2->link;
}
temp = front;
front = front->link;
delete temp;
return front;
}

void PrintPoly(Polynomial p)
{
// if()
while (p)
{
printf("%d %d+ ", p->coef, p->expon);
p = p->link;
}
printf("\n");
}
int main()
{
Polynomial p1, p2, pp, ps;
p1 = ReadPoly();
p2 = ReadPoly();
pp = Multi(p1, p2);
printf("输出乘法表达式:");
PrintPoly(pp);
ps = Add(p1, p2);
printf("输出加法表达式:");
PrintPoly(ps);
return 0;
}


以上代码在VS2015上运行,把参数输入完之后,就崩溃了.而在VC6.0上,轻而易举得到结果.找来找去找不着东南西北.希望大神能指点指点.感谢!
...全文
298 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
dataxdata 2016-07-06
  • 打赏
  • 举报
回复
放在CB下试了一下,结果是否正确没细看,但至少可以正常运行,不会出错,所以建议还是检查一下VS2015的设置
FASM_FASM 2016-07-06
  • 打赏
  • 举报
回复
这个代码还是自己好好调试一下吧,你的链表节点处理的问题太多了。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧