1多项式的表示 2程序框架 3读多项式 4加法实现 5乘法实现 6输出多项式
程序代码如下:
#include<stdio.h> #include<stdlib.h> /* 定义结构,但是更推荐这种定义 typedef struct PolyNode{ int coef; int expon; struct PolyNode *Next; }*PolyNode; */ typedef struct PolyNode *Polynomial ; struct PolyNode { int coef; int expon; Polynomial Next; }; /*连接函数,通过参数的传递,构成链表,注意*rear是指针的指针,故能修改rear的地址(值)*/ void Attach(int coef,int expon,Polynomial *rear) { Polynomial P; P=(Polynomial)malloc(sizeof(struct PolyNode)); P->coef=coef; P->expon=expon; P->Next=NULL; (*rear)->Next=P; (*rear)=P; } /* 读入数据函数*/ Polynomial ReadPoly() { int N; int coef,expon; Polynomial P,rear,t; P=(Polynomial)malloc(sizeof(struct PolyNode)); //采用开头构造空节点P的方法 P->Next=NULL; rear=P; scanf("%d",&N); while(N--) { scanf("%d %d",&coef,&expon); Attach(coef,expon,&rear); } t=P; P=P->Next; free(t); //将空节点删除 return P; } /* 加法的实现函数 */ Polynomial Add(Polynomial P1,Polynomial P2) { Polynomial P,rear,t; P=(Polynomial)malloc(sizeof(struct PolyNode)); //创建空节点 P->Next=NULL; rear=P; // rear 指向P int sum; while(P1 && P2) { if (P1->expon>P2->expon) //按指数递减的顺序排列 { Attach(P1->coef,P1->expon,&rear); //拷贝P1,P1后移,依次类推 P1=P1->Next; } else if (P1->expon<P2->expon) { Attach(P2->coef,P2->expon,&rear); P2=P2->Next; } else { sum=P1->coef+P2->coef; if (sum) Attach(sum,P1->expon,&rear); //系数之和不为0才拷贝,P1,P2同时后移 P1=P1->Next; P2=P2->Next; } } while (P1){Attach(P1->coef,P1->expon,&rear);P1=P1->Next;} //继续将剩下的拷贝过去 while (P2){Attach(P2->coef,P2->expon,&rear);P2=P2->Next;} t=P; P=P->Next; free(t); //释放空的头节点 return P; } /* 乘法实现的函数 */ Polynomial Mult(Polynomial P1,Polynomial P2) { Polynomial P,rear,t1,t2,t; int c,e; if (!P1 || !P2) return NULL; t1 = P1; t2 = P2; P = (Polynomial)malloc(sizeof(struct PolyNode)); P->Next = NULL; rear = P; while(t2) //先得出一个链表,即P1的第一项分别和P2的每一项相乘 { Attach(t1->coef * t2->coef,t1->expon + t2->expon,&rear); t2 = t2->Next; } t1=t1->Next; while (t1) //将每一项结果和原始链表对比,对原始链表进行增,改,删等操作 { t2 = P2; rear = P; while(t2) { e = t1->expon + t2->expon; c = t1->coef * t2->coef; while(rear->Next && rear->Next->expon>e )rear=rear->Next; //!!!一定注意&&前后表达式顺序不能反! if (rear->Next && rear->Next->expon==e) { if(rear->Next->coef+c)rear->Next->coef+=c; else{t=rear->Next;rear->Next=t->Next;free(t);}//删除该节点 } else //<e, 在rear后插入一个新的节点 { t=(Polynomial)malloc(sizeof(struct PolyNode)); t->coef=c; t->expon=e; t->Next=rear->Next; rear->Next=t; rear=rear->Next; } t2=t2->Next; } t1=t1->Next; } t=P; P=P->Next; free(t); //释放空的头节点 return P; } /* 输出函数 */ void PrintPoly(Polynomial P) { int flag=0; if(!P){printf("0 0\n");return;} while(P) { if (!flag)flag=1; //符合题目要求格式,即结尾没有空格 else printf(" "); printf("%d %d",P->coef,P->expon); P=P->Next; } printf("\n"); } int main() { Polynomial P1,P2,PP,PS; P1=ReadPoly(); P2=ReadPoly(); PP=Mult(P1,P2); PrintPoly(PP); PS=Add(P1,P2); PrintPoly(PS); return 0; }