70,022
社区成员




//已知:
struct Polynomial
{
int coef; //系数
int expn; //指数
struct Polynomial* next;
};
/*该函数用于实现合并同类项的第二步:(第一步系数相加)去掉相同项(p->expn == q->expn) 。为什么程序运行后自动停止呢?*/
void Delete(struct Polynomial * la )
{
struct Polynomial *p,*q;
p=la;
if(la)
{
do
{
q=p->next;
while(p->expn == q->expn && q)
{
p->next =q->next;
free(q);
q=p->next;
}
p=p->next;
}while(p->next);
printf("\nxx");
}
else exit(1);
}
合并同类项
struct Polynomial {
int coef; //系数
int expn; //指数
struct Polynomial* next;
};
bool MergeNode( Polynomial *a, Polynomial *b)
{
assert(a && b);
//if(!a ||!b)return false;
if(a->expn == b->expn){//指数相等,需要合并
a->coef += b->coef; //合并同类项的数学意义,系数相加。
return true; //返回true,表示执行了合并运算
}
return false; //返回false,表示没有,也不需要,合并。
}
Polynomial * MergeList( Polynomial *a)
{
assert(a );
if(!a)return NULL;
Polynomial *p=a,*q,*r;//当前节点p 初始化为a,前向指针r,要合并的节点指针q;
do{
r = p; //从下各节点开始,依次合并到本节点,前指针就是置为当前节点。
while(q = r->next ){ //下个节点是合并对象。
if(MergeNode( p,q)){ //需要合并,合并之并,删除被合并的节点
r ->next = q->next; //取下节点
free(q); //释放内存
}else { //不需要合并,不合并,向下走
r = r->next; //没合并,到下个节点,看看
};
}while(p = p->next);
return a;
}
#include<stdio.h>
#include<stdlib.h>
struct Polynomial
{
int coef; //系数
int expn; //指数
struct Polynomial* next;
};
#define LEN sizeof(struct Polynomial)
int n=0;
///////////////////////////////////////////////////
//函数声明:
struct Polynomial * Creat(); //建立一个多项式
void Print(struct Polynomial *head); //打印出多项式
struct Polynomial * AddPolyn(struct Polynomial *la,struct Polynomial *lb,struct Polynomial *lc);//合并操作
void Add(struct Polynomial * la,char way); //系数计算操作
void Delete(struct Polynomial * la ); //化简操作
///////////////////////////////////////////////////
void main()
{
struct Polynomial *la,*lb,*lc;
la = Creat();
Print(la);
lb = Creat();
lc = AddPolyn(la,lb,lc);
Add(lc,'+');
Print(lc);
Delete(lc);
Print(lc);
}
////////////////////////////////////////////////
struct Polynomial * Creat() //建立一个多项式
{
struct Polynomial *head;
struct Polynomial *p1,*p2;
int length;
printf("请输入总项数n=");
scanf("%d",&length);
if(length>0)
{
p1=p2=(struct Polynomial *)malloc(LEN);
printf("请输入第1项的系数,以及第1项的未知数的指数:");
scanf("%d %d",&p1->coef,&p1->expn);
head=NULL;
while(p1->coef!=0)
{
n=n+1;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(struct Polynomial *)malloc(LEN);
printf("请输入第%d项的系数,以及第%d项的未知数的指数:",n+1,n+1);
scanf("%d %d",&p1->coef,&p1->expn);
}
p2->next=NULL;
printf("该多项式创建完毕!\n");
n=0;
return(head);
}
else
{
printf("项数输入错误!该多项式不存在!");
exit(1);
}
}
struct Polynomial * AddPolyn(struct Polynomial *la,struct Polynomial *lb,struct Polynomial *lc) //完成多项式的相加,指数相同的计算,不同的插入。按大小次序加
{
//如果遇到指数相同的,就相加,如果走完都没有,就合并
struct Polynomial *pa,*pb,*pc;
pa=la;
pb=lb;
if (pa != NULL && pb != NULL && pa->expn <= pb->expn)
{
lc = pa;
pc = pa;
pa = pa -> next;
}
else if (pa != NULL && pb != NULL)
{
lc = pb;
pc = pb;
pb = pb -> next;
}
while(pa && pb)
{
if(pa->expn <= pb->expn)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{
pc->next = pb;
pc=pb;
pb=pb->next;
}
}
pc -> next = pb == NULL ? pa : pb;
pc = lc;
printf("合并后如下:\n");
return pc;
}
void Print(struct Polynomial *head) //打印出多项式
{
printf("该多项式如下:");
struct Polynomial *p;
p=head;
if(head!=NULL)
{
while(p!=NULL)
{
if(p->coef<0)
{
printf(" -%dx^%d",p->coef,p->expn);
}
else printf(" +%dx^%d",p->coef,p->expn);
p=p->next;
}
}
else printf("链表为空!");
}
void Add(struct Polynomial * la,char way)
{
int m = 1;
int flag = 0;
struct Polynomial *p,*p2;
p=la;
while(p->next!=NULL)
{
p2=p->next;
while(p2->expn == p->expn && !flag)
{
flag = 0;
switch(way)
{
case '+':p->coef = p->coef + p2->coef;break;
case '-':p->coef = p->coef - p2->coef;break;
default:printf("请输入 + 或 - 号!");exit(1);break;
}
if(p2->next)
p2=p2->next;
else flag =1;
// Delete(la,m+1); //这个位置为什么不行呢?在外面测试都可以
}
//这个位置为什么不行呢?
p=p->next;
// Delete(la,m+1);//可以
m++;
}
printf("计算结果如下:\n");
}
void Delete(struct Polynomial * la )
{
struct Polynomial *p,*q;
p=la;
if(la)
{
/*
do
{
q=p->next;
do
{
if(p->expn == q->expn)
{
p->next = q->next;
free(q);
q=p->next;
}
}while(q && q->next!=NULL);
p=p->next;
}while(p && p->next!=NULL);*/
do
{
q=p->next;
while(p->expn == q->expn && q)
{
p->next =q->next;
free(q);
q=p->next;
}
p=p->next;
}while(p->next);
printf("\nxx");
}
else exit(1);
}