#include <iostream>
#include <cstring>
using namespace std;
#define MAXSIZE 20
#define TRUE 1
#define FALSE 0
typedef bool Status;
typedef struct {
int xi;
int zhi;
}ElemType;
typedef struct Node {
ElemType data;
struct Node* next;
}LinkList;
void InsertSort(LinkList*& mylist)
{
if ((mylist->next == NULL) || (mylist->next->next == NULL))
{
return;
}
Node* head, * p1, * prep1, * p2, * prep2, * temp;
head = mylist;
prep1 = head->next;
p1 = prep1->next;
bool flag;
while (p1 != NULL)
{
flag = true;
temp = p1;
for (prep2 = head, p2 = prep2->next; p2 != p1; prep2 = prep2->next, p2 = p2->next)
{
if (p2->data.zhi > p1->data.zhi)
{
p1 = p1->next;
prep1->next = p1;
prep2->next = temp;
temp->next = p2;
flag = false;
break;
}
}
if (flag)
{
prep1 = prep1->next;
p1 = p1->next;
}
}
}
void DisplayList(LinkList* List)
{
int flag = 0;
Node* p = List;
while (p->next)
{
p = p->next;
if ((p->data).xi == 0)
continue;
else if ((p->data).xi != 1)
if (!flag)
cout << (p->data).xi;
else
printf("%+d", (p->data).xi);
flag++;
if ((p->data).xi == 1 && (p->data).zhi == 0)
cout << "1";
if ((p->data).zhi == 1)
cout << "x";
else if ((p->data).zhi != 0 && (p->data).zhi != 1)
cout << "x^" << (p->data).zhi;
}
cout << endl;
}
void InitList(LinkList*& List)
{
List = new LinkList;
List->next = NULL;
}
Status ListInsert(LinkList*& List, int position, ElemType e)
{
if (position <= 0)
return FALSE;
LinkList* p = List;
LinkList* temp;
int count = 0;
while (p->next && count < position - 1)
{
p = p->next;
count++;
}
if (count != position - 1)
return FALSE;
temp = new Node;
temp->data = e;
temp->next = p->next;
p->next = temp;
return TRUE;
}
int ListLength(LinkList* List)
{
LinkList* p = List;
int count = 0;
while (p->next)
{
p = p->next;
count++;
}
return count;
}
int str2int(char* str)
{
int temp = 0;
const char* p = str;
if (str == NULL) return 0;
if (*str == '-' || *str == '+')
{
str++;
}
while (*str != 0)
{
if (*str < '0' || *str > '9')
{
break;
}
temp = temp * 10 + (*str - '0');
str++;
}
if (*p == '-')
{
temp = -temp;
}
return temp;
}
void Simplify(LinkList*& List)
{
LinkList* p = List->next;
LinkList* destory;
while (p != NULL)
{
while (p->next != NULL && (p->data).zhi == (p->next->data).zhi)
{
(p->data).xi += (p->next->data).xi;
destory = p->next;
p->next = p->next->next;
delete destory;
}
p = p->next;
}
}
void Multi(LinkList *&La, LinkList *&Lb, LinkList *&Lc)
{
LinkList* pa = La;
LinkList* pb = Lb;
ElemType temp;
while (pa = pa->next)
{
pb = Lb;
while (pb = pb->next)
{
temp.xi = (pa->data).xi * (pb->data).xi;
temp.zhi = (pa->data).zhi + (pb->data).zhi;
ListInsert(Lc, ListLength(Lc) + 1, temp);
}
}
}
void Add(LinkList*& La, LinkList*& Lb, LinkList*& Lc)
{
LinkList *p;
Lc->next = La->next;
p = Lc->next;
while (p->next)
p = p->next;
p->next = Lb->next;
InsertSort(Lc);
Simplify(Lc);
}
int main()
{
LinkList * F, * G;
InitList(F);InitList(G);
LinkList* result1, * result2;
InitList(result1); InitList(result2);
ElemType e;
char strxi[20], strzhi[20];
cout << "请输入第一个多项式(输入'q'结束输入):" << endl;
cout << "请输入一个系数: ";
while (scanf("%s", &(strxi)), strcmp(strxi, "q"))
{
e.xi = str2int(strxi);
cout << "请输入一个指数: ";
scanf("%s", &(strzhi));
e.zhi = str2int(strzhi);
ListInsert(F, ListLength(F) + 1, e);
cout << "请输入一个系数: ";
}
cout << "输入的第一个多项式是:F(x) = ";
InsertSort(F);
Simplify(F);
DisplayList(F);
cout << "请输入第二个多项式(输入'q'结束输入):" << endl;
cout << "请输入一个系数: ";
while (scanf("%s", &(strxi)), strcmp(strxi, "q"))
{
e.xi = str2int(strxi);
cout << "请输入一个指数: ";
scanf("%s", &(strzhi));
e.zhi = str2int(strzhi);
ListInsert(G, ListLength(G) + 1, e);
cout << "请输入一个系数: ";
}
cout << "输入的第二个多项式是:G(x) = ";
InsertSort(G);
Simplify(G);
DisplayList(G);
Multi(F, G, result1);
InsertSort(result1);
Simplify(result1);
cout << "多项式相乘为:";
DisplayList(result1);
Add(F, G, result2);
cout << "多项式相加为:";
DisplayList(result2);
return 0;
}