cpp
复制代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct poly
{
int coeff;
int exp;
struct poly* next;
}*link,Node;
void InputPoly(link head);
void Print(link head);
bool Insert(link head, int coeff, int exp);
void Combin2List(link heada, link headb, link headab);
void Clear(link head);
int main()
{
link heada, headb;
link headab;
heada = (link)malloc(sizeof(Node));
heada->next = NULL;
headb = (link)malloc(sizeof(Node));
headb->next = NULL;
headab = (link)malloc(sizeof(Node));
headab->next = NULL;
printf("请输入第一个多项式的系数和指数,以(0,0)结束:\n");
InputPoly(heada);
printf("第一个");
Print(heada);
printf("请输入第二个多项式的系数和指数,以(0,0)结束:\n");
InputPoly(headb);
printf("第二个");
Print(headb);
Combin2List(heada, headb, headab);
printf("合并为:");
Print(headab);
Clear(heada);
Clear(headb);
Clear(headab);
return 0;
}
void InputPoly(link head)
{
int coeff, exp;
printf("请输入系数和指数(如:\"2 3\"表示2x^3):");
scanf("%d%d", &coeff, &exp);
while (coeff != 0 || exp != 0)
{
Insert(head, coeff, exp);
printf("请输入系数和指数:");
scanf("%d%d", &coeff, &exp);
}
}
void Print(link head)
{
link p = head->next;
while (p != NULL)
{
if (p != head->next && p->coeff > 0)
printf("+");
if (p->coeff == -1 && p->exp != 0)
printf("-");
if ((p->coeff != 1 && p->coeff != -1) || p->exp == 0)
printf("%d", p->coeff);
if (p->exp != 1 && p->exp != 0)
printf("x^%d", p->exp);
if (p->exp == 1)
printf("x");
p = p->next;
}
puts("");
}
bool Insert(link head, int coeff, int exp)
{
link node;
link q, p;
q = head;
p = head->next;
node = (link)malloc(sizeof(Node));
node->coeff = coeff;
node->exp = exp;
node->next = NULL;
if (head->next == NULL)
{
head->next = node;
}
else
{
while (p != NULL)
{
if (node->exp > p->exp)
{
node->next = p;
q->next = node;
break;
}
else if(node->exp < p->exp)
{
q = p;
p = p->next;
}
else
{
p->coeff = p->coeff + node->coeff;
free(node);
break;
}
}
if (p == NULL)
q->next = node;
}
return true;
}
void Combin2List(link heada, link headb, link headab)
{
link pa, pb;
pa = heada->next;
pb = headb->next;
while (pa != NULL && pb != NULL)
{
if (pa->exp > pb->exp)
{
Insert(headab, pa->coeff, pa->exp);
pa = pa->next;
}
else if (pa->exp == pb->exp)
{
Insert(headab, pa->coeff + pb->coeff, pb->exp);
pa = pa->next;
pb = pb->next;
}
else
{
Insert(headab, pb->coeff, pb->exp);
pb = pb->next;
}
}
while (pa != NULL)
{
Insert(headab, pa->coeff, pa->exp);
pa = pa->next;
}
while (pb != NULL)
{
Insert(headab, pb->coeff, pb->exp);
pb = pb->next;
}
}
void Clear(link head)
{
link p = head->next;
while (p != NULL)
{
head->next= p->next;
free(p);
p = head->next;
}
free(head);
}