未解决问题;
加上链表的销毁的时候多项式乘法就乱码了。
总结;
1;一定记得加NULL;
/*
程序;多项式的加减乘;
*/
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int xishu;
int mishu;
struct node * next;
} Node;
void CreatPolyn(Node * s, int m);//创造一个多项式;
void PrintPolyn(const Node * s);//输出多项式
Node AddPolyn(Node * a, Node * b);//完成多项式加法
Node SubstractPolyn(Node *a, Node *b);//完成多项式的减法
Node MultiplyPolyn(Node * a,Node *b);//完成多项式的乘法;
void DestroyPolyn(Node * s);//完成多项式的销毁
int main()
{
int na, nb;
Node a, b;//采用头结点法
printf("请输入多项式a的项数\n");
scanf("%d",&na);
printf("请输入多项式a的系数和幂数\n");
CreatPolyn(&a,na);
printf("输出多项式\n");
PrintPolyn(&a);
printf("请输入多项式b的项数\n");
scanf("%d",&nb);
printf("请输入多项式b的系数和幂数\n");
CreatPolyn(&b,nb);
printf("输出多项式\n");
PrintPolyn(&b);
/*多项式加法
Node c = AddPolyn(&a,&b);
printf("多项式a+b的和为\n");
PrintPolyn(&c);*/
/*多项式减法
Node d = SubstractPolyn(&a,&b);
printf("多项式a-b为\n");
PrintPolyn(&d);*/
//多项式a*b
Node e = MultiplyPolyn(&a,&b);
printf("多项式a*b为\n");
PrintPolyn(&e);
/*
DestroyPolyn(&a);
printf("输出多项式\n");
PrintPolyn(&a);*/
return 0;
}
/*
完成多项式的a*b;
总是出错的原因;
一;总是忘记指向NULL。
二;借用进行部分乘法多项式放的链表,记得每次计算完毕之后要使得重新回到头结点。
*/
Node MultiplyPolyn(Node * a,Node *b)
{
Node * pa, *pc2, *pc3,*pc4;
Node c,c1;
c.next = NULL;
pa = a->next;
pc3 = NULL;
pc4 = &c1;
pc4->next = NULL;
while(pa!=NULL){
pc2 = b->next;
while(pc2 != NULL){
pc3 = (Node*)malloc(sizeof(Node));
pc3->mishu = pa->mishu+pc2->mishu;
pc3->xishu = pa->xishu*pc2->xishu;
pc4->next = pc3;
pc4 = pc4->next;
pc4->next = NULL;//记得移动pc4并且使得其next指向NULL;
pc2 = pc2->next;
}
//PrintPolyn(&c1);
c = AddPolyn(&c1,&c);
//PrintPolyn(&c);
pa = pa->next;
//DestroyPolyn(&c1);//添加销毁就出错了,????
pc4 = &c1;//出错的地方要记得使他重新开始;
pc4->next = NULL;
}
return c;
}
/*
完成多项式的减法;
传入多项式ab指向头结点的指针、
返回多项式a-b后的链表的头结点c;
代码与加法代码几乎一致。
注意一点的是,减法当系数为0的项则不再考虑了。
*/
Node SubstractPolyn(Node *a, Node *b)
{
Node * pa, *pb;
Node *pc;
Node c;
pc = &c;
pa = a->next;
pb = b->next;
pc->next = NULL;
while(pa != NULL && pb != NULL){
if(pa->mishu < pb->mishu){
pc->next = pa;
pc = pc->next;
pa = pa->next;
}
else if(pa->mishu == pb->mishu){
pc->next = pa;
pc->next->xishu -= pb->xishu;
if(pc->next->xishu != 0){//若系数为0则不要
pc = pc->next;
}
pa = pa->next;
pb = pb->next;
}
else{
pc->next = pb;
pc = pc->next;
pc->xishu = -pb->xishu;
pb = pb->next;
}
}
if(pa == NULL){
while(pb != NULL){
pc->next = pb;
pc = pc->next;
pc->xishu = -pb->xishu;
pb = pb->next;
}
}
else{
while(pa != NULL){
pc->next = pa;
pa = pa->next;
pc = pc->next;
}
}
pc->next = NULL;
return c;
}
/*
完成多项式加法;
传入多项式ab指向头结点的指针、
返回多项式a+b后的链表的头结点c;
之前出错问题;
一;结构体指针类型Node*;与Node之间的关系。
指针只有两种方法指向结构体,
1;例如pc = &c;pc指针直接指向头结点。
2;pc->next = c;pc指向的节点的下个节点是c;这个就要注意pc之前的指向;
二;之前陷入死循环while,以为不能使用指针==NULL做条件,其实是可以的,指针指向空的时候;
三;之前加法完成后没有输出,原因返回的是指针类型,并且返回的是pc,pc->next=NULL因此是空的,没有输出;
解决办法;设置头结点,用pc去指向,利用pc去进行链表的创建,头结点是不变的,返回头结点即可,
则可以通过头结点找到整个链表的节点。
*/
Node AddPolyn(Node * a, Node * b)// 完成多项式加法;
{
Node * pa, *pb;
Node *pc;
Node c;
pc = &c;
pa = a->next;
pb = b->next;
pc->next = NULL;
while(pa != NULL && pb != NULL){
if(pa->mishu < pb->mishu){
pc->next = pa;
pc = pc->next;
pa = pa->next;
//printf("%d %d\n",pc->xishu,pc->mishu);
}
else if(pa->mishu == pb->mishu){
pc->next = pa;
pc = pc->next;
pc->xishu += pb->xishu;
pa = pa->next;
pb = pb->next;
//printf("%d %d\n",pc->xishu,pc->mishu);
}
else{
pc->next = pb;
pc = pc->next;
pb = pb->next;
//printf("%d %d\n",pc->xishu,pc->mishu);
}
//printf("wei\n");
}
if(pa == NULL){
while(pb != NULL){
pc->next = pb;
pb = pb->next;
pc = pc->next;
}
}
else{
while(pa != NULL){
pc->next = pa;
pa = pa->next;
pc = pc->next;
}
}
pc->next = NULL;
return c;
}
/*
销毁多项式链表;
传入指向头结点的指针s;
出错地方;
不要去修改s,给s->next赋值也不行;
*/
void DestroyPolyn(Node * s)
{
Node * ps, *ps1;
ps = s->next;
while(ps != NULL){
ps1 = ps;
ps = ps->next;
free(ps1);
}
s->next = NULL;//指向NULL一定要记得。
}
/*
创造一个多项式使用尾插法,
传入指向头结点的指针和多项式项数。
*/
void CreatPolyn(Node * s, int m)
{
Node *p,*q;
p = (Node *)malloc(sizeof(Node));
scanf("%d %d",&p->xishu,&p->mishu);
p->next = NULL;
s->next = p;
for(int i = 1; i < m; i++){
q = (Node *)malloc(sizeof(Node));
scanf("%d %d",&q->xishu,&q->mishu);
p->next = q;
q->next = NULL;
p = q;
}
}
/*
输出多项式;
传入结构体指针
*/
void PrintPolyn(const Node * s)
{
Node * p;
p = s->next;
while(p != NULL){
printf("%d %d\n",p->xishu,p->mishu);
p = p->next;
}
}