#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(Polynode)
//節點型別定義
typedef struct Polynode{
int coef;
int expn;
struct Polynode * next;
}Polynode,*Polylist;//開辟串列
//建立一元多項式鏈表,尾插法
Polylist PolyCreate(){
Polynode *head,*rear,*s;
int coef,expn;//系數,指數
head=(Polynode *) malloc (sizeof(Polynode));//建立頭結點
rear=head;
scanf("請輸入多項式的系數和指數項:%d,%d",&coef,&expn);
while (coef!=0){
s=(Polynode *)malloc(sizeof(Polynode));//申請新的結點
s->coef=coef;
s->expn=expn;
rear->next=s;//在當前表尾做插入
rear=s;
scanf("%d,%d",&coef,&expn);
}
rear->next=NULL;
return(head);
}
/*
遍歷表p,每一個結點與s比較指數(查找)
若相同,q指向相同指數項的結點,回傳1
若不相同,根據s所指指數大小在鏈表p中的位置來確定q的指向結點,回傳0
*/
int LocateElem(Polylist p,Polylist s,Polylist &q){
Polylist p1=p->next;
Polylist p2=p;//存盤每一個多項式
while(p1){
if(s->expn > p1->expn){
p1=p1->next;
p2=p2->next;
}else if(s->expn==p1->expn){
q=p1;
return 1;
}else{
q=p2;
return 0;
}
}
if(!p1){
q=p2;
return 0;
}
return 0;
}
//創建帶頭結點的鏈表
void CreatePoly(Polylist &p,int m){
Polylist s,q;
int i;
p=(Polylist )malloc(LEN);
p->next=NULL;
for(i=0;i<m;i++){
s=(Polylist ) malloc (LEN);
printf("請輸入系數和指數(以空格隔開):");
scanf("%d %d",&s->coef,&s->expn);
if(!LocateElem(p,s,q)){
s->next=q->next;
q->next=s;
}else{
q->coef+=s->coef;
}
}
}
//比較兩結點指數大小,根據情況回傳不同的值
int cmp(Polylist pa,Polylist pb){
if(pa->expn < pb->expn) return -1;
else if(pa->expn == pb->expn) return 0;
else return 1;
}
//兩個多項式相加得一個新多項式,并且回傳新多項式的頭結點的指標
//指數遞增
Polylist AddPoly(Polylist pa,Polylist pb){ //pa,pb均指向頭結點
Polylist newP,p,q,s,pc;
int sum;
p=pa->next;
q=pb->next;
newP=(Polylist)malloc(LEN);
pc=newP;
while(p&&q){
switch(cmp(p,q)){
case -1:
s=(Polylist)malloc(LEN);//申請一個新結點
s->coef=p->coef;
s->expn=p->expn;
pc->next=s; //在新表中插入結點
pc=s;
p=p->next;//指標移動
break;
case 0:
sum=p->coef+q->coef;
if(sum!=0){
s=(Polylist)malloc(LEN);
s->coef=sum;
s->expn=p->expn;
pc->next=s;
pc=s;
}
p=p->next;
q=q->next;
break;
case 1:
s=(Polylist)malloc (LEN);
s->coef=q->coef;
s->expn=q->expn;
pc->next=s;
pc=s;
q=q->next;
break;
}
}
pc->next=p?p:q;
return newP;
}
//列印輸出一元多項式PL
void PrintPoly(Polylist PL){
Polylist s;
s=PL->next;
while(s){
printf("%d X^%d",s->coef,s->expn);
s=s->next;
if(s!=NULL)
if(s->coef>=0) printf(" +");
}
printf("\n");
}
int main(){
Polylist PA,PB,PC;
int la,lb;
printf("請輸入第一個多項式PA的項數:");
scanf("%d",&la);
CreatePoly(PA,la);
printf("第一個多項式為:");
PrintPoly(PA);
printf("請輸入第二個多項式PB的項數:");
scanf("%d",&lb);
CreatePoly(PB,lb);
printf("第二個多項式為:");
PrintPoly(PB);
printf("兩個多項式相加: ");
PC=AddPoly(PA,PB);
PrintPoly(PC);
return 0;
}
uj5u.com熱心網友回復:

uj5u.com熱心網友回復:
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/91655.html
標籤:C++ 語言
上一篇:C# 向其它視窗發送組合鍵shift+ctrl+ALT+其它不能用的原因
下一篇:C語言

