问题描述
解题思路
- 用带表头节点的单链表存储多项式,多项式的项数存放在头结点
代码实现
typedef struct
{
int exp;
double res;
}Polynomial;
typedef struct Node
{
int exp;
double res;
struct Node* next;
}Node,*LinkList;
void InitList(LinkList &L,char *pol)
{
L = (LinkList)malloc(sizeof(Node));
L-> next = nullptr;
char a[10] = "";
a[0] = pol[0];
a[1] = '\0';
int num = atoi(a);
L->exp = num;
Node* p = L;
int i = 2;
int flag = 1;
Polynomial pol_tmp;
while (pol[i] != '\0')
{
char tmp[10] = "";
int k = 0;
if (pol[i] == 32)
{
i++;
continue;
}
for (; pol[i] != 32 && pol[i] != '\0'; i++)
{
tmp[k] = pol[i];
k++;
}
if (flag % 2 != 0)
pol_tmp.exp = atoi(tmp);
else
{
pol_tmp.res = atof(tmp);
Node* newNode = (LinkList)malloc(sizeof(Node));
newNode->exp = pol_tmp.exp;
newNode->res = pol_tmp.res;
p->next = newNode;
p = newNode;
p->next = nullptr;
}
flag++;
}
return;
}
bool compare(int a, int b)
{
return a >= b;
}
void handleList(LinkList& la,int exp,float res,bool(*compare)(int,int))
{
Node* pa = la->next;
while (pa != nullptr)
{
if (pa->exp == exp)
{
if (pa->res + res != 0)
pa->res += res;
else
{
pa->res += res;
--la->exp;
}
return;
}
pa = pa->next;
}
Node* pa1 = la->next;
while (pa1 != nullptr)
{
if (compare(res, la->next->exp))
{
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->exp = exp;
newNode->res = res;
newNode->next = la->next;
la->next = newNode;
la->exp++;
return;
}
if (pa1->next == nullptr || compare(pa1->res, res) && compare(res, pa1->next->res))
{
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->exp = exp;
newNode->res = res;
newNode->next = pa1->next;
pa1->next = newNode;
la->exp++;
return;
}
pa1 = pa1->next;
}
}
void showList(LinkList& la)
{
Node* p = la->next;
cout << la->exp;
while (p != nullptr)
{
if (p->res != 0)
cout << " " << p->exp << " " << p->res;
p = p->next;
}
}
void addList(LinkList& la, LinkList& lb)
{
Node* pb = lb->next;
while (pb != nullptr)
{
handleList(la, pb->exp, pb->res, compare);
pb = pb->next;
}
showList(la);
}
int main()
{
char A[1000], B[1000];
int size = 0;
cin.getline(A, 1000);
cin.getline(B, 1000);
LinkList LA, LB;
InitList(LA, A);
InitList(LB, B);
addList(LA, LB);
return 0;
}