题目要求:编写将两个多项式相加的函数
。不要毁掉输入数据。用一个链表实现
#include <stdlib.h>
#include <stdio.h>
typedef struct Node *ptrToNode;
typedef ptrToNode Position;
typedef ptrToNode Head;
/*
总体思路:加入两个多项式分别为p1、p2,则先按顺序遍历p1中的指数,如在p1中的某项中的指数是exp,则在p2中查找是否有exp,
如果有,则把系数合并,并放入p3,且把多项式p2中的此项的flag标记为1(找到了)
如果p2中没有exp,则直接把p1中的此项“挪”到p3,一次类推,知道把p1挪空。
现在p1已经没有了,p2中部分的项flag==0 需要把这些项直接挪到p3
*/
struct Node
{
int exp;
int coefficient;
int flag;
Position next;
};
int main()
{
void createAdd(int coefficient, int exp, Head head);
void printfList(Head head3);
void Add(Head head1, Head head2, Head head3);
Head head1, head2, head3;
head1 = malloc(sizeof(struct Node));
head2 = malloc(sizeof(struct Node));
head3 = malloc(sizeof(struct Node));
int exp;
int coefficient;
int n1, n2;
int i;
printf("请输入第一个多项式有几项:\n");
scanf("%d", &n1);
printf("请输入多项式1的系数和指数\n");
for (i = 0; i < n1; i++)
{
scanf("%d%d", &coefficient, &exp);
createAdd(coefficient, exp, head1);
}
Position px = head1;
while (px != NULL)
{
printf("test:%d^%d\n", px->coefficient, px->exp);
px = px->next;
}
printf("请输入第二个多项式有几项:\n");
scanf("%d", &n2);
printf("请输入多项式1的系数和指数\n");
for (i = 0; i < n2; i++)
{
scanf("%d%d", &coefficient, &exp);
createAdd(coefficient, exp, head2);
}
Add(head1, head2, head3);
printfList(head3);
}
void createAdd(int coefficient, int exp, Head head)
{
Position toLast(Head head);
Position pnew = malloc(sizeof(struct Node));
if (pnew == NULL)
{
exit(-1);
}
Position last = toLast(head);
pnew->exp = exp;
pnew->coefficient = coefficient;
pnew->flag = 0;
pnew->next = NULL;
last->next = pnew;
last = pnew;
}
void Add(Head head1, Head head2, Head head3)
{
Position findInP(int x, Head head2);
Position p1, p2;
p1 = head1->next;
p2 = head2->next;
while (p1 != NULL) //知道把第一个多项式搞空!
{
Position expInHead2; // 如果能返回非空,则说明在head2中找到了,否则没有
expInHead2 = findInP(p1->exp, head2);
if (expInHead2 != NULL) //证明在两个多项式中有相同指数的项,合并该项
{
createAdd(p1->coefficient + expInHead2->coefficient, p1->exp, head3);
expInHead2->flag = 1;
}
else //在p1 的该此项在p2 中没有,不用合并,直接弄过去
{
createAdd(p1->coefficient, p1->exp, head3);
}
p1 = p1->next;
}
while (p2 != NULL)
{
if (p2->flag == 0)
{
createAdd(p2->coefficient, p2->exp, head3);
}
p2 = p2->next;
}
}
Position findInP(int x, Head head2)
{
Position p = head2;
while (p != NULL)
{
if (p->exp == x)
{
return p;
}
else
{
p = p->next;
}
}
return NULL;
}
void printfList(Head head3)
{
Position p = head3->next;
while (p != NULL)
{
printf("将两个多项式合并之后的结果是:\n");
printf("%d^%d\n", p->coefficient, p->exp);
p = p->next;
}
}
Position toLast(Head head)
{
Position p = head;
while (p->next != NULL)
{
p = p->next;
}
return p;
}