//This code is to calculate two main polynomial addition
// Created by Liuyao in 2016.
// Copyright (c) 2016 Liuyao. All rights reserved.
#include<stdio.h>
#include<stdlib.h>
typedef struct polynode
{
int coef;
int exp;
struct polynode *next;
}polynode, *polylist;
int initList(polylist *L);//初始化
int creatFromtail(polylist L);//头插法建立链表
int display(polylist L);//显示相加前的
void add(polylist pa, polylist pb);//相加
void display2(polylist L);//显示相加后的
int main(void)
{
polylist pa = NULL;
polylist pb = NULL;
int b;
b = initList(&pa);
if (b == -1)
{
printf("Init fail\n");
}
if (b == 1)
{
printf("Init success\n");
}
printf("Please input the coef and exp:(pa)\n");
b = creatFromtail(pa);
if (b == -1)
{
printf("Create fail\n");
}
b = display(pa);
b = initList(&pb);
if (b == -1)
{
printf("Init fail\n");
}
if (b == 1)
{
printf("Init success\n");
}
printf("Please input the coef and exp:(pb)\n");
b = creatFromtail(pb);
if (b == -1)
{
printf("Create fail\n");
}
b = display(pb);
add(pa, pb);
display2(pa);
getchar();
getchar();
return 0;
}
int initList(polylist *L)
{
(*L) = (polynode *)malloc(sizeof(polynode));
if ((*L) == NULL)
return -1;
else
(*L)->next = NULL;//不要忘了这个
return 1;
}
int creatFromtail(polylist L)
{
int a;
int b;
polynode *q = L;
polynode *p = NULL;
int flag = 1;
while (flag)
{
scanf("%d %d", &a, &b);
if ((a == 0) && (b == 0))//当输入的是两个0时结束
{
flag = 0;
break;
}
p = (polynode *)malloc(sizeof(polynode));
if (p == NULL)
{
return -1;
}
p->coef = a;
p->exp = b;
q->next = p;
q = p;
}
q->next = NULL;//注意
return 1;
}
int display(polylist L)
{
polynode *p = L->next;
while (p != NULL)
{
printf("%dx^%d\n", p->coef, p->exp);
p = p->next;
}
return 1;
}
void add(polylist pa, polylist pb)
{
polynode *p1 = pa->next;
polynode *p2 = pb->next;
polynode *tail = NULL;//tail用于指向多项式相加后的尾节点
polynode *temp = NULL;//临时变量节点
int sum;
tail = pa;//将tail也指向pa,与两个单链表合并类似
while (p1!=NULL && p2!=NULL)
{
/*规则一:p1指向的多项式指数项指数小于p2,将p1节点加入到和多项式中*/
if (p1->exp < p2->exp)
{
tail->next = p1;
tail = p1;
p1 = p1->next;
}
/*规则二:将p2节点加入到和多项式中*/
if (p2->exp < p1->exp)
{
tail->next = p2;
tail = p2;
p2 = p2->next;
}
/*规则三:如果两个多项式指数相等,则将相应的系数相加*/
if (p1->exp == p2->exp)
{
sum = p1->coef + p2->coef;
/*系数和非零,将系数和置入节点p1中,p1加到和多项式中,释放节点p2并将指针后移*/
if (sum != 0)//
{
p1->coef = sum;
tail->next = p1;
tail = p1;
p1 = p1->next;
temp = p2;//将临时变量指向p2所指向的地方
p2 = p2->next;
free(temp);
}
/*系数和为0,则删除p1节点和p2节点,并将指针后移*/
else
{
temp = p1;
p1 = p1->next;
free(p1);
temp = p2;
p2 = p2->next;
free(p2);
}
}
}
/*如果多项式p1中的节点还有剩余,则将剩余的节点加入到和多项式中*/
if (p1 != NULL)
{
tail->next = p1;
}
//否则将多项式p2中的节点加入到和多项式中
else
{
tail->next = p2;
}
}
void display2(polylist L)
{
polynode *p = L->next;
while (p!=NULL)
{
printf("%dx^%d",p->coef,p->exp);
p = p->next;
if (p!=NULL)
printf("+");
}
}
链表之两个多项式相加
最新推荐文章于 2023-04-10 21:03:18 发布