|
|
#2
自学的数学2019-09-24 08:22
程序代码:#include <stdio.h> #include <stdlib.h> typedef struct Node { int coef;//系数 int expn;//指数 struct Node *next; }LNode; //LNode为创建的多项式链表类型 struct elem { int coef; int expn; }List[100],change; //List[]构建链表,change用来交换List[]中的某两项。 LNode* create(int n) { LNode *head; LNode *s,*L; //*s表示新创建的空表,*L表示当前的链表,用来连接两空表 L=s=NULL; head=(LNode *)malloc(sizeof(LNode)); head->next=0; //定义空链表 L=(LNode *)malloc(sizeof(LNode)); n--; L->coef=List[1].coef; //复制 L->expn=List[1].expn; head->next=L; int i=2; while(n) { s=(LNode *)malloc(sizeof(LNode)); L->next=s; s->coef=List[i].coef; s->expn=List[i].expn; L=s; n--; i++; } L->next=0; return head; } LNode* add(LNode *p1,LNode *p2) //将多项式p1与p2相加,结果存在第三个链表中(第三个链表由该函数创建) { p1=p1->next; p2=p2->next; LNode *head; LNode *L,*s; head=(LNode *)malloc(sizeof(LNode)); head->next=NULL; L=head; while(p1&&p2) //遍历两表,根据情况判断表的长短是否相同,是否缺项多项,建立一个新的链表来存取内容 { if(p1->expn > p2->expn)//比较指数大小,将指数和系数较小的存入新表 { s=(LNode *)malloc(sizeof(LNode)); L->next=s; s->coef=p2->coef; s->expn=p2->expn; L=s; p2=p2->next; } if(p1->expn < p2->expn)//比较指数大小,将指数和系数较小的存入新表 { s=(LNode *)malloc(sizeof(LNode)); L->next=s; s->coef=p1->coef; s->expn=p1->expn; L=s; p1=p1->next; } if(p1->expn == p2->expn)//相等可以直接相加 { s=(LNode *)malloc(sizeof(LNode)); L->next=s; s->coef=p1->coef + p2->coef; s->expn=p1->expn; L=s; p1=p1->next; p2=p2->next; } } while(p1)//p1有剩余 { s=(LNode *)malloc(sizeof(LNode)); L->next=s; s->coef=p1->coef; s->expn=p1->expn; L=s; p1=p1->next; } while(p2)//p2有剩余 { s=(LNode *)malloc(sizeof(LNode)); L->next=s; s->coef=p2->coef; s->expn=p2->expn; L=s; p2=p2->next; } L->next=NULL; return head; } void print(LNode *p1) //输出表 { p1=p1->next; while(p1) { printf("%d %d\n",p1->coef,p1->expn); p1=p1->next; } } int main() { int z=2; LNode *head2[2]; //head2[]为两多项式的头结点 int n; while(z) { printf("请输入项数\n"); scanf("%d",&n); printf("请输入各项\n"); int i=1; for(i=1;i<=n;i++) { scanf("%d%d",&List[i].coef,&List[i].expn); } i=1; int j=1; for(i;i<n;i++) for(j=i+1;j<=n;j++) { if(List[j].expn<List[i].expn) //将输入的指数按升序排列 ,排序算法 { change.coef=List[i].coef; change.expn=List[i].expn; List[i].coef=List[j].coef; List[i].expn=List[j].expn; List[j].coef=change.coef; List[j].expn=change.expn; } } head2[z]=create(n); z--; } LNode *pp; pp=add(head2[1],head2[2]); printf("结果为:\n"); print(pp); system("pause"); return 0; } |
运行结果错误,大神帮帮忙,两个多项式相加(没有错误)
#include<stdio.h>
typedef struct{
int e[10];
int c[10];
}STRarray;
int main(){
int i,j,k,t;
int add(STRarray a1,int j,STRarray a2,int k,STRarray a3);
STRarray a1,a2;
STRarray a3;
printf("输入第一个多项式的项数为(按回车结束输入k值)");
scanf("%d",&j);
printf("输入第一个多项式指数为(按回车结束输入k值)");
for(i=0;i<j;i++)
scanf("%d",&a1.e[i]);
printf("输入第一个多项式系数为(按回车结束输入k值,系数与指数一一对应)");
for(i=0;i<j;i++)
scanf("%d",&a1.c[i]);
printf("输入第二个多项式的项数为(按回车结束输入k值)");
scanf("%d",&k);
printf("输入第二个多项式指数为(按回车结束输入k值)");
for(i=0;i<k;i++)
scanf("%d",&a2.e[i]);
printf("输入第二个多项式系数为(按回车结束输入k值,系数与指数一一对应)");
for(i=0;i<j;i++)
scanf("%d",&a2.c[i]);
t=add(a1,j,a2,k,a3);
printf("%d\n",t);
for(i=0;i<t;i++)
printf("%d %d",a3.c[i],a3.e[i]);
}
int add(STRarray a1,int j,STRarray a2,int k,STRarray a3){
int m,n=0,t=0,l=0;
for(m=0;m<j+k;m++){
if(a1.e[n]==a2.e[t]&&n!=j&&t!=k){
a3.c[m]=a1.c[n]+a2.c[t];
a3.e[m]=a1.e[n];
n++;
t++;
m++;
l++;
}
else if (a1.e[n]>a2.e[t]&&(n!=j&&t!=k)){
a3.c[m]=a1.c[n];
a3.e[m]=a1.e[n];
n++;
l++;
}
else if (a1.e[n]<a2.e[t]&&(n!=j&&t!=k)){
a3.c[m]=a2.c[t];
a3.e[m]=a2.e[t];
t++;
l++;
}
if(n==j&&t!=k){
a3.c[m]=a2.c[t];
a3.e[m]=a2.e[t];
t++;
m++;
l++;
}
else if(t==k&&n!=j){
a3.c[m]=a1.c[n];
a3.e[m]=a1.e[n];
n++;
m++;
l++;
}
}
return l;
}
程序代码: