多項式之加減乘

多項式計算也就是在動用鏈表  鏈表中存下多項式的係數和指數  使鏈表之間進行運算  

加法:A+B的運算就等同於單鏈表的插入  使指數相同的係數相加減

減法:就是使相加法的後一項取餘然後再做加法

乘法:使其A中鏈表節點與之B中鏈表所以節點依次相乘  然後按順序插入進新建的鏈表中。。



#include<stdio.h>

#include<stdlib.h>
typedef struct s
{
int coef;  //多項式係數
int expn;    //多項式指數
struct s *next;
}duoxiangshi;




duoxiangshi *creat()   //創建多項式鏈表
{
duoxiangshi *head,*p,*rear;
int  coef,expn;
head=rear=(duoxiangshi*)malloc(sizeof(duoxiangshi));
printf("請輸入多項式數值\n");
scanf("%d%d",&coef,&expn);
while(coef)
{
//5printf("xxxxx");
p=(duoxiangshi*)malloc(sizeof(duoxiangshi));
p->coef=coef;
p->expn=expn;
rear->next=p;
rear=p;
scanf("%d%d",&coef,&expn);


}
rear->next=NULL;
return head;


}




int  print(duoxiangshi *p)
{
duoxiangshi *q;
int flag=1;
q=p->next;
if(!q)
{
putchar('0');
printf("\n");
return 1;
}
while(q)
{
if(q->coef>0&&flag!=1)
putchar('+');
printf("%d",q->coef);
if(q->expn==1)
putchar('X');
else if(q->expn)
printf("X^%d",q->expn);
q=q->next;
flag++;


}
printf("\n");
return 0;
}




duoxiangshi * add(duoxiangshi *pa,duoxiangshi *pb)
{
duoxiangshi *qa=pa->next;
duoxiangshi *qb=pb->next;
duoxiangshi *qc,*pc,*headc;
pc=(duoxiangshi *)malloc(sizeof(duoxiangshi));
pc->next=NULL;
headc=pc;
while(qa!=NULL  &&  qb!=NULL)
{
qc=(duoxiangshi *)malloc(sizeof(duoxiangshi));
if(qa->expn<qb->expn)  //第一個多項式所指的項指數小於第二個多項式所指的項指數
{
qc->coef=qa->coef;
qc->expn=qa->expn;
qa=qa->next;
}
else if(qa->expn==qb->expn)  //第一個多項式所指的項指數等於第二個多項式所指的項指數
{
qc->coef=qa->coef+qb->coef;
qc->expn=qa->expn;
qa=qa->next;
qb=qb->next;
}
else              //第一個多項式所指的項指數大於第二個多項式所指的項指數
{
qc->coef=qb->coef;
qc->expn=qb->expn;
qb=qb->next;
}
if(qc->expn!=0)
{
qc->next=pc->next;
pc->next=qc;
pc=qc;

}
else
free(qc);
}




while(qa!=NULL)  //第一個多項式有剩餘,將剩餘項插入
{
qc=(duoxiangshi *)malloc(sizeof(duoxiangshi));
qc->coef=qa->coef;
qc->expn=qa->expn;
qa=qa->next;
qc->next=pc->next;
pc->next=qc;
pc=qc;
}
while(qb!=NULL)  //第二個多項式有剩餘,將剩餘項插入
{
qc=(duoxiangshi *)malloc(sizeof(duoxiangshi));
qc->coef=qb->coef;
qc->expn=qb->expn;
qb=qb->next;
qc->next=pc->next;
pc->next=qc;
pc=qc;
}
return headc;
}




duoxiangshi * jianfa(duoxiangshi *pa,duoxiangshi *pb)
{
duoxiangshi *pd;
duoxiangshi *h=pb;
duoxiangshi *p=h->next;
while(p)
{
p->coef*=-1;
p=p->next;
}
pd=add(pa,h);
return pd;
}


void insert(duoxiangshi *head,duoxiangshi *inpt)
{
duoxiangshi *pre,*now;
int flag=0;
pre=head;//pre定義爲現在的前一個鏈節 
if(pre->next==NULL) 
{
pre->next=inpt;
flag=1;

else 
{
now=pre->next; 
}
while(flag==0)
{
if(inpt->expn>now->expn)//當新鏈節大於現在的連接時向後移一個鏈節 

if(now->next==NULL) 

now->next=inpt; 
flag=1; 

else 

pre=now; 
now=pre->next; 


if(inpt->expn<now->expn)//如果發現比現在的鏈節小了就插入到這個連接的前面 

inpt->next=now; 
pre->next=inpt; 
flag=1; 

if(inpt->expn==now->expn) //如果指數相等

now->coef=now->coef+inpt->coef; 
flag=1; 
free(inpt); 
if(now->coef==0) 

pre->next=now->next; 
free(now); 

}
}


}




duoxiangshi *xiangcheng(duoxiangshi*pa,duoxiangshi *pb)   //多項式相乘
{
duoxiangshi *inpt,*res,*pre;
int flag= 0;
res=(duoxiangshi *)malloc(sizeof(duoxiangshi));
res->next=NULL;
pa=pa->next;
pre=pb;
while(flag==0)
{
if(pre->next==NULL)
{
pre=pb;
pa=pa->next;


}
if(pa==NULL)
{
flag=1;
break;


}
pre=pre->next;
inpt=(duoxiangshi *)malloc(sizeof(duoxiangshi));
inpt->coef=pa->coef*pre->coef;
inpt->expn=pa->expn+pre->expn;
inpt->next=NULL;
insert(res,inpt);  //把新創立的節點插入進頭res節點中


}
return res;
}


jiemian()   //界面選擇函數
{
duoxiangshi *pa,*pb,*pc;
int choice,temp=1;

while(temp)
{
printf("輸入你的選擇\n");
printf("  ****************************************************  \n");
printf("  輸入1  進行加法                     輸入2   進行減法  \n");
printf("  輸入3  進行乘法                     輸入0   退出      \n");
printf("  ****************************************************  \n");
scanf("%d",&choice);
switch(choice)
{
case(1):
printf("請輸入第一個多項式\n");
pa=creat();
printf("請輸入第二個多項式\n");
pb=creat();
  pc=add(pa,pb);
print(pc);
break;
case(2):
printf("請輸入第一個多項式\n");
pa=creat();
printf("請輸入第二個多項式\n");
pb=creat();
pc=jianfa(pa,pb);
print(pc);
break;
case(3):
printf("請輸入第一個多項式\n");
pa=creat();
printf("請輸入第二個多項式\n");
pb=creat();
pc=xiangcheng(pa,pb);
print(pc);
break;
case(0):
temp=0;
break;
if(temp==0)
break;
}
}
}


main()
{
jiemian();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章