源代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct node //代表每个结点的结构体
{
double xs; //double型系数
int zs; //int型指数
struct node*zz; //指向结构体的指针
} Node;
Node*input(); //输入函数
Node*add(); //多项式相加函数
void output(); //输出函数
int main()
{
Node*p1,*p2,*p3;
printf("请输入第一个多项式\n");
p1 = input();
printf("请输入第二个多项式\n");
p2 = input();
p3 = add(p1,p2);
printf("第一个多项式:\n");
output(p1);
printf("\n");
printf("第二个多项式:\n");
output(p2);
printf("\n");
printf("多项式的和:\n");
output(p3);
return 0;
}
Node*input()
{
int i,n;
Node *p1,*p2,*p3;
printf("请输入多项式的项数:");
scanf("%d",&n);
p1 = p2 = p3 = (struct node*)malloc(sizeof(struct node)); //开辟内存
for(i=0; i<n; i++)
{
printf("请输入第%d项:",i+1);
scanf("%lf %d",&p2->xs,&p2->zs); //样例:如果输入x则输入:1 1
if(i != n-1) //将最后一项单独列出来
{
p3 = (struct node*)malloc(sizeof(struct node)); //开辟新内存
p2->zz = p3; //让p2指向的结构体内的zz指针指向新内存
p2 = p3; //让p2指向新内存
} //if内的语句实现了多项式的存储
else
{
p2->zz = NULL; //最后一个结构体的zz指针置空
}
}
return p1; //返回表头指针
}
void output(Node*head)
{
int n = 0;
while(head != NULL)
{
if(head->xs < 0)
{
if(head->zs==0)
{
printf("%.2lf",head->xs);
}
else
{
printf("%.2lfx%d",head->xs,head->zs);
}
n++;
}
else if(head->xs > 0)
{
if(n != 0){
printf("+"); //如果系数是正数,且不是第一项则输出正号
}
if(head->zs==0)
{
printf("%.2lf",head->xs);
}
else
{
printf("%.2lfx%d",head->xs,head->zs);
}
n++;
}
head = head->zz;
}
if(n == 0){
printf("0");
}
}
Node*add(Node*p1,Node*p2)
{
Node*p3,*p4,*p5,*p6;
p3 = p4 = p5 = (struct node*)malloc(sizeof(struct node)); //p4是表头指针
while(p1!=NULL || p2!=NULL)
{
if(p1 == NULL) //当p1指针为空时,说明第一个多项式已经读取完毕,只需将第二个多项式剩余的项数拷入多项式的和的链表中
{
p3->xs = p2->xs;
p3->zs = p2->zs;
p2 = p2->zz;
}
else if(p2 == NULL) //同上
{
p3->xs = p1->xs;
p3->zs = p1->zs;
p1 = p1->zz;
}
else //p1、p2指针均非空
{
if(p1->zs > p2->zs) //如果p1的指数大于p2的指数
{
p3->zs = p1->zs; //p1的指数拷入和的链表中
p3->xs = p1->xs; //p1的系数拷入和的链表中
p1 = p1->zz; //p1指针向后移一个
}
else if(p1->zs < p2->zs)
{
p3->zs = p2->zs;
p3->xs = p2->xs;
p2 = p2->zz;
}
else if(p1->zs == p2->zs)
{
p3->zs = p2->zs;
p3->xs = p2->xs+p1->xs;
p1 = p1->zz;
p2 = p2->zz;
}
}
p6 = p3; //以下代码为建立新结构体,与存储多项式相似
p5 = (struct node*)malloc(sizeof(struct node));
p3->zz = p5;
p3 = p5;
}
p6->zz = NULL;
free(p5); //释放p5指针
return p4; //返回表头指针
}