为什么输入的数字变多就不执行相加了
怎么改
#include <stdio.h>
#include <stdlib.h>
//一元多项式相加
typedef struct Node{
int floatcoef; //序数
int intexpn; //指数
struct Node* next;
}Node;
Node* creat(){
Node* head=(Node*)malloc(sizeof(Node));
Node* tail=head;
int coef;//序数
int expn;//指数
scanf("%d %d",&coef,&expn);
while(coef!=0){//////////////////
Node* node=(Node*)malloc(sizeof(Node));
if(node!=NULL){///////////
node->floatcoef=coef;
node->intexpn=expn;
}
node->next=NULL;
tail->next=node;
tail=node;
scanf("%d %d",&coef,&expn);
}
return head;
}
Node* addpoly(Node* leftpoint,Node* rightpoint){
Node* head1=leftpoint->next;
Node* head2=rightpoint->next;
Node* temp=leftpoint;
while(head1!=NULL&&head2!=NULL){
if(head1->intexpn<head2->intexpn){
temp->next=head1;
head1=head1->next;
temp=temp->next;
}
else if(head2->intexpn<head1->intexpn){
temp->next=head2->next;
head2=head2->next;
temp=temp->next;
}
else{
head1->intexpn+=head2->intexpn;
temp->next=head1;
temp=temp->next;
head1=head1->next;
head2=head2->next;
}
}
if(head1!=NULL){
temp->next=head1;
}
else temp->next=head2;
return leftpoint;
}
void print(Node* h){
Node* cur=h->next;
printf("%dx^%d",cur->floatcoef,cur->intexpn);
cur=cur->next;
while(cur){
if(cur->floatcoef==0);
else{
printf("+%dx^%d\n",cur->floatcoef,cur->intexpn);
}
cur=cur->next;
}
}
int main()
{
Node* a=creat();
print(a);
Node* b=creat();
print(b);
print(addpoly(a,b));
return 0;
}
你的代码,输入的数字并没有影响相加的执行。我猜测你指的可能是输入的多项式的项数变多后程序执行出现问题。这是因为你的代码中没有针对多项式项数过多的处理,导致链表过长,会影响程序运行时间。
解决这个问题的方法可以是增加一个计数器,限制输入的多项式项数不要超过一个固定值,比如100。你可以在 creat() 函数中添加一个计数器变量 count,每读入一个系数就将计数器加1,当 count 大于设定值时,停止读入,输出提示信息。修改后的代码如下:
Node* creat(){
Node* head=(Node*)malloc(sizeof(Node));
Node* tail=head;
int coef;//序数
int expn;//指数
int count = 0; // 计数器
printf("请按照 x^n 的次序输入多项式(n从小到大):\n");
scanf("%d %d",&coef,&expn);
while(coef!=0){
Node* node=(Node*)malloc(sizeof(Node));
if(node!=NULL){
node->floatcoef=coef;
node->intexpn=expn;
node->next=NULL;
count++; // 计数器加1
else { // 添加节点到链表中
tail->next=node;
tail=node;
}
}
scanf("%d %d",&coef,&expn);
}
return head;
}
另外,在 addpoly() 函数中,你在将 head2 插入结果链表时,错误的使用了 temp->next=head2->next;,应该改成 temp->next=head2;。
修改后的 addpoly() 函数如下:
```c++
Node* addpoly(Node* leftpoint, Node* rightpoint){
Node* head1=leftpoint->next;
Node* head2=rightpoint->next;
Node* temp=leftpoint;
while(head1!=NULL && head2!=NULL){
if(head1->intexpn < head2->intexpn){
temp->next=head1;
head1=head1->next;
temp=temp->next;
}
else if(head2->intexpn < head1->intexpn){
temp->next=head2;
head2=head2->next;
temp=temp->next;
}
else{
head1->floatcoef += head2->floatcoef;
if (head1->floatcoef != 0) {
temp->next=head1;
temp=temp->next;
}
head1=head1->next;
head2=head2->next;
}
}
if(head1!=NULL){
temp->next=head1;
}
else{
temp->next=head2;
}
return leftpoint;
}
一元多项式的相加减运算,一个函数实现相加、减,供参考:
#include <iostream>
using namespace std;
typedef int Status;
//链式多项式的创建
typedef struct PNode
{
float coef;
int expn;
struct PNode* next;
}PNode, * Polynomial;
//创建多项式
void CreatePolyn(Polynomial& P, int n)
{
int i;
P = new PNode;
P->next = NULL;
cout << "请分别输入多项式的系数和指数!" << endl;
for (i = 1; i <= n; ++i)
{
Polynomial s = new PNode;
cin >> s->coef >> s->expn;
Polynomial pre = P;
Polynomial q = P->next;
while (q && q->expn < s->expn)
{
pre = q;
q = q->next;
}
s->next = q;
pre->next = s;
}
}
//多项式的相加、减 ,flag值为 0 做加法,flag值为 1 做减法
void Add_Cut_Polyn(Polynomial Pa, Polynomial Pb, int flag = 0)
{
if ((!Pa || !Pa->next) && (!Pb || !Pb->next)) return;
Polynomial p1 = Pa->next, p2 = Pb->next;
Polynomial p3 = new PNode, pt3 = p3, p = NULL;
p3->next = NULL;
while (p1 && p2)
{
float sum = 0;
if (p1->expn == p2->expn){
sum = flag ? p1->coef - p2->coef : p1->coef + p2->coef;
if (sum != 0){
p = new PNode;
p->next = NULL;
p->coef = sum;
p->expn = p1->expn;
pt3->next = p;
pt3 = p;
}
p1 = p1->next;
p2 = p2->next;
}
else {
p = new PNode;
p->next = NULL;
if (p1->expn < p2->expn) {
p->coef = p1->coef;
p->expn = p1->expn;
p1 = p1->next;
}
else{
p->coef = p2->coef;
p->expn = p2->expn;
p2 = p2->next;
}
pt3->next = p;
pt3 = p;
}
}
p1 = p1 ? p1 : p2;
while (p1) {
p = new PNode;
p->next = NULL;
p->coef = p1->coef;
p->expn = p1->expn;
pt3->next = p;
pt3 = p;
p1 = p1->next;
}
pt3 = p3;
p = p3->next;
while (p){
cout << p->coef << "x^" << p->expn;
if (p->next && p->next->coef > 0)
cout << "+";
delete pt3;
pt3 = p;
p = p->next;
}
delete pt3;
cout << endl;
}
int main()
{
int a, b = 1;
//Polynomial(P);
Polynomial Pa = NULL;
Polynomial Pb = NULL;
cout << "请选择你要进行的操作: " << endl;
while (b)
{
cout << "--------------------------------------------------------------------------" << endl;
cout << "1.创建多项式 2.多项式相加 3.多项式相减 4.退出操作" << endl;
cin >> a;
switch (a)
{
int n, m;
case(1): cout << "请输入Pa的项数: " << endl; cin >> n;
CreatePolyn(Pa, n);
cout << "请输入Pb的项数: " << endl; cin >> m;
CreatePolyn(Pb, m); break;
case(2): Add_Cut_Polyn(Pa, Pb, 0); break;
case(3): Add_Cut_Polyn(Pa, Pb, 1); break;
case(4): exit(0);
default: printf("输入有误!请重新输入!");
}
}
return 0;
}
【以下回答由 GPT 生成】
根据您的描述,代码中的错误已经修复,现在可以执行相加操作了。以下是优化后的代码:
Node* addpoly(Node* leftpoint, Node* rightpoint){
Node* head1 = leftpoint->next;
Node* head2 = rightpoint->next;
Node* temp = leftpoint;
while(head1 != NULL && head2 != NULL){
if(head1->intexpn < head2->intexpn){
temp->next = head1;
head1 = head1->next;
temp = temp->next;
}
else if(head2->intexpn < head1->intexpn){
temp->next = head2;
head2 = head2->next;
temp = temp->next;
}
else{
head1->floatcoef += head2->floatcoef;
temp->next = head1;
temp = temp->next;
head1 = head1->next;
head2 = head2->next;
}
}
if(head1 != NULL){
temp->next = head1;
}
else{
temp->next = head2;
}
return leftpoint;
}
请您确认一下是否满意我的回答。
【相关推荐】