#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{
float coef;
int index;
struct LNode *next;
}LNode,*Polynomial;
void CreatePoly(Polynomial *AB,int size);
Polynomial AddPolyn(Polynomial A,Polynomial B);
void PrintPoly(Polynomial A);
void main(){
Polynomial A,B;//如果在main函数对A初始化分配地址,则可以直接穿A即指向首地址的指针
Polynomial p;
int LA,LB;//两个多项式的长度
printf("请输入第一个多项式的项数:");
scanf("%d",&LA);
CreatePoly(&A,LA);//因为开始声明的A是野指针,只有地址传递让其指向分配的地址空间 ,
//声明一个变量时操作系统会分配内存存储该变量,指针也是变量
//&A即指针存放A的地址,而不是A指向的地址,A是野指针,指向地址未知
PrintPoly(A);
printf("请输入第二个多项式的项数:");
scanf("%d",&LB);
CreatePoly(&B,LB);
PrintPoly(B);
p = AddPolyn(A,B);//经过创建A已经不是野指针,而是指向单链表,故此处可直接穿指针
printf("和多项式为:");
PrintPoly(p);
}
void CreatePoly(Polynomial *AB,int size){//多项式的项数 //*AB是双重指针
*AB = (Polynomial)malloc(sizeof(LNode));//分配头结点 //此时*AB就和mian中的A等价,即指针AB指向了存放A的地址 *AB=A;对*AB初始化即相当于对A初始化
//AB=&A;*AB=A;即初始化让A指向了分配的空间
LNode *r,*s;
r = *AB;
int i = 0;
for(i=0;i<size;i++){
s = (LNode*)malloc(sizeof(LNode));
printf("请输入系数和指数(空格隔开):");//scanf会跳过空格,逗号会产生错误
scanf_s("%f %d",&s->coef,&s->index);
r->next = s;
r = s;
}
r->next = NULL;
}
void PrintPoly(Polynomial A){
LNode *p;
p = A->next;
while(p){
printf("%.2f X^%d",p->coef,p->index);
//将多项式连接起来显示,最后一个结点无符号故在每一个结点之前输出加减号
p = p->next;
if(p!=NULL){
if(p->coef>=0)
printf("+");
else
printf("-");
}
}
printf("\n");
}
Polynomial AddPolyn(Polynomial A,Polynomial B){
LNode *a,*b;//分别指向A,B
LNode *Deletea,*Deleteb;//用来指向系数为0时要释放的结点
a = A->next;
b = B->next;
Polynomial C;
LNode *Crear;//指针,用来指向和多项式的头和尾
//可以考虑给C一个头结点,
C = (Polynomial)malloc(sizeof(LNode));
C->next = NULL;
Crear = C;
while(a!=NULL&&b!=NULL){
if((a->index)<(b->index)){
Crear->next = a;
Crear = a;
a = a->next;
}//if
else if(a->index==b->index){
if(a->coef+b->coef==0){
Deletea = a;
a = a->next;
Deleteb = b;
b = b->next;
free(Deletea);
free(Deleteb);
}//if
else{
a->coef+=b->coef;//两个结点合并为一个,删除一个
Crear->next = a;
Crear = a;
Deleteb = b;
b = b->next;
a = a->next;
free(Deleteb);
}//else
}
else{
Crear->next = b;
Crear = b;
b = b->next;
}
}//while
//一轮处理结束一个多项式以全部处理还有一个未处理完 注意上面以经->next
while(a!=NULL){
Crear->next = a;
Crear = a;
a =a->next;
}
while(b!=NULL){
Crear->next = b;
Crear = b;
b =b->next;
}
return C;
// Crear = Chead = NULL;//C不带头结点太复杂
// while(a!=NULL&&b!=NULL){
// if(a->index<b->index){
// if(Chead==NULL){//没有头结点直接第一个结点需单独处理
// Chead = a;
// Crear = a;
// }
// else{
// Crear->next = a;//将小阶结点插入C
// }
// a = a->next;
// }
// else if(a->index==b->index){
// if(a->coef+b->coef==0){
// Deletea = a;
// a = a->next;
// Deleteb = b;
// b = b->next;
// free(Deletea);
// free(Deleteb);
// }
// else{
// if(Chead==NULL){//没有头结点直接第一个结点需单独处理
// a->coef+=b->coef;//两个结点合并为一个,删除一个
// Chead = a;
// Crear = a;
// Deleteb = b;
// b = b->next;
// a = a->next;
// free(Deleteb);
// }
// else{
// Crear->next = a;//将小阶结点插入C
// }
// a = a->next;
// }
// }
// }
}
一元多项式求和C语言实现
最新推荐文章于 2022-09-21 23:21:45 发布