Ⅰ 求助:用c語言實現多項式的加減法
這個內容有點多,沒法回答,其實相當於編個計算器
Ⅱ C語言寫多項式相加怎麼寫求解
分都不給。。。算了,以前寫了個就給你吧。/*此程序結構比較清晰,用單鏈表實現了多項式的加法。具體原理可以參考清華大學嚴蔚敏數據《結構C語言版》第二章注意:此程序假設輸入的多項式已經排好序(從低到高)程序在VC6下編譯通過*/#includenbsp;amp;lt;stdio.hamp;gt;#includenbsp;amp;lt;stdlib.hamp;gt;#includenbsp;amp;lt;malloc.hamp;gt;#includenbsp;amp;lt;conio.hamp;gt;nbsp;/*getchnbsp;function*/typedefnbsp;structnbsp;NODEnbsp;{nbsp;floatnbsp;nbsp;coef;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;//系數為實數nbsp;intnbsp;nbsp;nbsp;nbsp;expn;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;//指數為整數nbsp;structnbsp;NODEnbsp;*next;nbsp;nbsp;}NODE;NODEnbsp;*Creat(intnbsp;n);voidnbsp;print(NODEnbsp;*head);NODEnbsp;*AddPolyn(NODEnbsp;*head1,nbsp;NODEnbsp;*head2);NODEnbsp;*Delfirst(NODEnbsp;*head,nbsp;NODEnbsp;*q);voidnbsp;InsertBefore(NODEnbsp;*p1,nbsp;NODEnbsp;*p2);intnbsp;nbsp;compare(intnbsp;a,nbsp;intnbsp;b);main(){nbsp;NODEnbsp;*head1,nbsp;*head2,nbsp;*head3;nbsp;intnbsp;n1,nbsp;n2;nbsp;printf(「
請輸入第一個多項式的項數nbsp;n1:「);nbsp;scanf(「%d「,nbsp;amp;n1);nbsp;head1nbsp;=nbsp;Creat(n1);nbsp;printf(「
第一個多項式為:
「);nbsp;print(head1);nbsp;nbsp;nbsp;nbsp;nbsp;printf(「
請輸入第二個多項式的項數nbsp;n2:「);nbsp;scanf(「%d「,nbsp;amp;n2);nbsp;head2nbsp;=nbsp;Creat(n2);nbsp;printf(「
第二個多項式為:
「);nbsp;print(head2);nbsp;head3nbsp;=nbsp;AddPolyn(head1,nbsp;head2);nbsp;printf(「
相加結果為:
「);nbsp;getch();}/*創建鏈表*/NODEnbsp;*Creat(intnbsp;n){nbsp;NODEnbsp;*current,nbsp;*previous,nbsp;*head;nbsp;intnbsp;i;nbsp;headnbsp;=nbsp;(NODEnbsp;*)malloc(sizeof(NODE));nbsp;/*創建頭結點*/nbsp;previousnbsp;=nbsp;head;nbsp;nbsp;for(inbsp;=nbsp;0;nbsp;inbsp;amp;lt;nbsp;n;nbsp;i++)nbsp;{nbsp;nbsp;currentnbsp;=nbsp;(NODEnbsp;*)malloc(sizeof(NODE));nbsp;nbsp;nbsp;nbsp;printf(「請輸入項數%d的系數和指數nbsp;:nbsp;「,i+1);nbsp;nbsp;scanf(「%f%d「,nbsp;amp;current-amp;gt;coef,nbsp;amp;current-amp;gt;expn);nbsp;nbsp;previous-amp;gt;nextnbsp;=nbsp;current;nbsp;nbsp;previousnbsp;=nbsp;current;nbsp;nbsp;}nbsp;previous-amp;gt;nextnbsp;=nbsp;NULL;nbsp;returnnbsp;head;}/*nbsp;一元多項式的加法nbsp;,總體考慮,可分qa的指數比qb小i組成一部分*/NODEnbsp;nbsp;*AddPolyn(NODEnbsp;*head1,nbsp;NODEnbsp;*head2){nbsp;NODEnbsp;*ha,nbsp;*hb,nbsp;*qa,nbsp;*qb;nbsp;intnbsp;a,nbsp;b;nbsp;floatnbsp;sum;nbsp;hanbsp;=nbsp;head1;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;/*ha和hb指向頭結點*/nbsp;hbnbsp;=nbsp;head2;nbsp;qanbsp;=nbsp;ha-amp;gt;next;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;/*qa和qb指向頭結點的下一個結點*/nbsp;qbnbsp;=nbsp;hb-amp;gt;next;nbsp;while(qanbsp;amp;amp;nbsp;qb)nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;/*qa和qb均非空*/nbsp;{nbsp;nbsp;anbsp;=nbsp;qa-amp;gt;expn;nbsp;nbsp;nbsp;bnbsp;=nbsp;qb-amp;gt;expn;nbsp;nbsp;switch(compare(a,nbsp;b))nbsp;{nbsp;nbsp;casenbsp;-1nbsp;: 查看原帖>>
Ⅲ C語言用鏈表實現多項式的加減法,減法處理過程中出現的問題。
你把B移到鏈表末尾去了,你要用一個指針記錄B鏈表頭,用指針移動操作*(-1)。
Ⅳ C語言寫一個程序,用鏈表實現多項式相加相減
//要求:多項式按降冪排列
#include<stdafx.h>
#include<iostream.h>
structnode
{
intcoef;//系數
intexp;//指數
node*next;
};
node*h1=NULL;//第一個多項式的頭指針
node*h2=NULL;//第二個多項式的頭指針
node*insert(intc,inte)//創建一個系數為c,指數為e的結點,並返回其地址
{
node*newnode=newnode;//創建新結點
newnode->coef=c;//系數等於c
newnode->exp=e;//指數等於e
newnode->next=NULL;
returnnewnode;
}
node*create(node*h)
{
intcoef;
intexp;
charc;
cout<<"請輸入系數:";
cin>>coef;
cout<<"請輸入指數:";
cin>>exp;
h=insert(coef,exp);
cout<<"是否輸入完畢?(Y/N)";
cin>>c;
if(c=='y'||c=='Y')
{
returnh;//如果輸入完畢,返回頭指針地址
}
else
{
h->next=create(h->next);//否則遞歸建立下一個結點
returnh;//返回頭指針地址
}
}
node*(node*source)//將一個結點的內容復制到另一個結點,並返回該結點地址
{
if(source!=NULL)//如果源結點不為空
{
node*des=newnode;//創建新結點
des->coef=source->coef;//新結點的系數等於源結點的系數
des->exp=source->exp;//新結點的指數等於源結點的指數
des->next=NULL;
returndes;//返回新結點地址
}
returnNULL;
}
voidprint(node*head)//輸出頭指針為head的多項式鏈表
{
node*h=head;
if(h==NULL)
{
cout<<"0";//如果鏈表為空,輸出0
}
else
{
while(h->next!=NULL)//否則,當其下一個結點不為空時
{
if(h->exp==0)//如果指數為0,即常數
{
if(h->coef>0)//如果系數大於0
{
cout<<h->coef;//輸出系數
}
else
{
cout<<""<<h->coef;//否則,退一格(消除前面的+號),輸出系數
}
}
elseif(h->exp==1)//否則,如果指數為1
{
if(h->coef>0)//如果系數大於0
{
if(h->coef==1)//如果系數等於1
{
cout<<"x"<<"+";//輸出x+
}
else
{
cout<<h->coef<<"*x"<<"+";//否則,輸出相應的系數
}
}
else
{
if(h->coef==-1)//否則,如果系數等於-1
{
cout<<""<<"-x"<<"+";//退一格,輸出-x
}
else
{
cout<<""<<h->coef<<"*x"<<"+";//否則,退一格,輸出相應的系數
}
}
}
else//否則,指數大於1
{
if(h->coef>0)//如果系數大於0
{
if(h->coef==1)//如果系數等於1
{
cout<<"x"<<h->exp<<"+";
}
else
{
cout<<h->coef<<"*x"<<h->exp<<"+";
}
}
else
{
if(h->coef==-1)//否則,如果系數等於-1
{
cout<<""<<"-x"<<h->exp<<"+";
}
else
{
cout<<""<<h->coef<<"*x"<<h->exp<<"+";
}
}
}
h=h->next;
}
//輸出最後一項
if(h->exp==0)//如果指數為0,即常數
{
if(h->coef>0)//如果系數大於0
{
cout<<h->coef;//輸出系數
}
else
{
cout<<""<<h->coef;//否則,退一格,輸出系數
}
}
elseif(h->exp==1)//否則,如果指數為1
{
if(h->coef>0)//如果系數大於0
{
if(h->coef==1)//如果系數等於1
{
cout<<"x";//輸出x
}
else
{
cout<<h->coef<<"*x";
}
}
else
{
if(h->coef==-1)//否則,如果系數等於-1
{
cout<<""<<"-x";//退一格,輸出-x
}
else
{
cout<<""<<h->coef<<"*x";
}
}
}
else//否則,指數大於1
{
if(h->coef>0)//如果系數大於0
{
if(h->coef==1)//如果系數等於1
{
cout<<"x"<<h->exp;
}
else
{
cout<<h->coef<<"*x"<<h->exp;
}
}
else
{
if(h->coef==-1)//否則,如果系數等於-1
{
cout<<""<<"-x"<<h->exp;
}
else
{
cout<<""<<h->coef<<"*x"<<h->exp;
}
}
}
}
}
voidprints(node*p1,node*p2,node*r)//輸出相加結果,形如p1+p2=r
{
print(p1);
cout<<endl<<"+"<<endl;
print(p2);
cout<<endl<<"="<<endl;
print(r);
cout<<endl;
}
charcompare(node*n1,node*n2)//比較兩個結點的指數大小
{
if(n1->exp==n2->exp)
{
return'=';
}
elseif(n1->exp>n2->exp)
{
return'>';
}
else
{
return'<';
}
}
node*add(node*p1,node*p2)//計算兩個多項式相加,返回結果鏈表首地址
{
node*fr;
//如果有一個為空,就把另外一個鏈表其後的部分復制到結果鏈表的尾部
if(p1==NULL)
{
node*x=(p2);
node*temp=x;
while(p2!=NULL)
{
x->next=(p2->next);
x=x->next;
p2=p2->next;
}
returntemp;
}
elseif(p2==NULL)
{
node*x=(p1);
node*temp=x;
while(p1!=NULL)
{
x->next=(p1->next);
x=x->next;
p1=p1->next;
}
returntemp;
}
//如果都不為空
else
{
switch(compare(p1,p2))//比較兩個結點的指數大小
{
case'='://相等
if(p1->coef+p2->coef!=0)//如果系數和不為0
{
fr=insert(p1->coef+p2->coef,p1->exp);//新結點的系數為兩個結點的系數和,指數為這兩個結點的指數
fr->next=add(p1->next,p2->next);
returnfr;
}
else
{
fr=add(p1->next,p2->next);//否則,新結點地址為這兩個結點之後的部分鏈表的和鏈表的首地址
returnfr;
}
case'>'://大於
fr=(p1);//新結點的內容與p1相同
fr->next=add(p1->next,p2);//以p1->next為新的p1,遞歸調用add,創建鏈表餘下的部分
returnfr;
case'<'://小於
fr=(p2);//新結點的內容與p2相同
fr->next=add(p1,p2->next);//以p2->next為新的p2,遞歸調用add,創建鏈表餘下的部分
returnfr;
default:
returnNULL;
}
}
}
voidmain(void)
{
cout<<"先建立第一個多項式:"<<endl;
h1=create(h1);
cout<<"再建立第二個多項式:"<<endl;
h2=create(h2);
cout<<"和:"<<endl;
prints(h1,h2,add(h1,h2));
}
Ⅳ C語言實現的一元多項式的表示及相減
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int data;
struct Node *next;
}Node;//鏈表結點
typedef struct LinkList//定義鏈表數據類型
{
Node *head;//表頭結點
void PrintMform()//輸出多項式
{
Node *p=head->next;
int exp = head->data-1;
while(p!=NULL)
{
if(exp==head->data-1)
printf("%dX^%d",p->data,exp);
else
{
if(p->data>0)
printf("+%dX^%d",p->data,exp);
if(p->data==0)
printf("+0");
if(p->data<
0)
printf("%dX^%d",p->data,exp);
}
exp--;
p=p->next;
}
printf("\n");
}
void CreateByInput(int length)//通過輸入元素建立鏈表
{
head=(Node *)malloc(sizeof(Node));
head->data=0;//表頭節點存儲鏈表真實長度
head->next=NULL;
int i,temp;
Node *p,*cur = head;
for(i=1;i<=length;i++)
{
printf("structing LinkList,Please input the value:\n");
scanf("%d",&temp);
p = (Node *)malloc(sizeof(Node));
p->data=temp;
p->next=cur->next;
cur->next=p;
cur = cur->next;
head->data++;
}
}
}LinkList;
void main()
{
LinkList L1,L2;
int length;//就是多項式的項數
printf("Please input the first LinkList's length:\n");
scanf("%d",&length);
printf("begin to struct the first LinkList\n");//開始構造第一個多項式
L1.CreateByInput(length);
printf("begin to struct the second LinkList\n");//開始構造第二個多項式
L2.CreateByInput(length);
printf("the first oxiangshi is:\n");
L1.PrintMform();//輸出第一個多項式
printf("the second oxiangshi is:\n");
L2.PrintMform();//輸出第二個多項式
Node *p = L1.head->next;/////////////////從這里開始
Node *q = L2.head->next;//是計算多項式L1-L2,結果存入L1
while(p!=NULL)
{
p->data-=q->data;
p=p->next;
q=q->next;
}/////////////////////////////////////到這里結束
printf("the substract is:\n");
L1.PrintMform();
system("pause");
}
Ⅵ c語言怎麼用堆棧實現多項式的加法運算
//已經幫忙調整,對比下代碼吧,就知道是什麼問題了
typedefstructPolyNode*Polynomial;
structPolyNode{
intcoef;
intexpon;
Polynomiallink;
};
PolynomialReadPoly();
PolynomialPolyAdd(PolynomialP1,PolynomialP2);
voidAttach(intc,inte,Polynomial*pRear);
intCompare(intp1,intp2);//未定義函數,自己寫實現
intmain()
{
PolynomialP1,P2,PP,PS;
P1=ReadPoly();
P2=ReadPoly();
// PP=Mult(P1,P2);
// PrintPoly(PP);
PS=PolyAdd(P1,P2);
// PrintPoly(PS);
return0;
}
PolynomialReadPoly()
{
PolynomialP,Rear,t;
intc,e,N;
scanf("%d",&N);
P=(Polynomial)malloc(sizeof(structPolyNode));
P->link=NULL;
Rear=P;
while(N--){
scanf("%d%d",&c,&e);
Attach(c,e,&Rear);
}
t=P;P=P->link;
free(t);
//retrunP;//return寫錯
returnP;
}
voidAttach(intc,inte,Polynomial*pRear)
{
PolynomialP;
P=(Polynomial)malloc(sizeof(structPolyNode));
P->coef=c;
P->expon=e;
P->link=NULL;
(*pRear)->link=P;
*pRear=P;
}
PolynomialPolyAdd(PolynomialP1,PolynomialP2)
{
Polynomialfront,rear,temp;
intsum;
rear=(Polynomial)malloc(sizeof(structPolyNode));
front=rear;
while(P1&&P2);
switch(Compare(P1->expon,P2->expon)){//這里要用指針->
case1:
Attach(P1->coef,P1->expon,&rear);//這里要用指針->
P1=P1->link;
break;
case-1:
Attach(P2->coef,P2->expon,&rear);//這里要用指針->
P2=P2->link;
break;
case0:
sum=P1->coef+P2->coef;//這里要用指針->
if(sum)Attach(sum,P1->expon,&rear);//這里要用指針->
P1=P1->link;
P2=P2->link;
break;
}
for(;P1;P1=P1->link)Attach(P1->coef,P1->expon,&rear);
for(;P2;P2=P2->link)Attach(P2->coef,P2->expon,&rear);
rear->link=NULL;
temp=front;
front=front->link;
free(temp);
returnfront;
}
Ⅶ 如何用C語言實現兩個一元多項式的相加和相乘
沒有別的好辦法,你看這樣行不行,不行你自己再想想吧
#include
void
main()
{
int
a1,b1,c1,d1,e1,f1,a2,b2,c2,d2,e2,f2;
printf("ax^5+bx^4+cx^3+dx^2+ex+f=0\n");
printf("請輸入:a
b
c
d
e
f\n");
printf("第一個:");
scanf("%d%d%d%d%d%d",&a1,&b1,&c1,&d1,&e1,&f1);
printf("第二個:");
scanf("%d%d%d%d%d%d",&a2,&b2,&c2,&d2,&e2,&f2);
printf("兩式相加後得:\n");
printf("%dx^5+%dx^4+%dx^3+%dx^2+%dx+%d=0\n",a1+a2,b1+b2,c1+c2,d1+d2,e1+e2,f1+f2);
}
由於變數太多!輸出時要注意哦
希望回答對你有幫助!
Ⅷ 用C語言鏈表實現多元多項式及其乘法,加法。
用C語言鏈表實現多項式, 例如f(x_{i,k}^{l})=3+x_{1,2}^2x_{3,2}+x_{1,3}x_{4,3}^3 (變數x_{i,k}^{l}有3個指標i,k,l, i,k,l可以取遍1到n的整數)。要求多項式由鍵盤輸入,用鏈表存儲單項式(節點是x_{i,k}^{l}),用鏈表存儲多項式(節點是單項式)。編寫3個函數分別是實現多項式加法,乘法的函數,以及輸出多項式的函數。
Ⅸ C語言:用單鏈表實現任意兩個一元多項式的加、減法運算
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 7
typedef enum { add, nul, sub, div1, yu, l, r }OP;
int a[N][N] = {
{ 0, 0, -1, -1, -1, 1, 2 },
{ 0, 0, -1, -1, -1, 1, 2 },
{ 1, 1, 0, 0, 0, 1, 2 },
{ 1, 1, 0, 0, 0, 1, 2 },
{ 1, 1, 0, 0, 0, 1, 2 },
};
int top;
OP beg;
int b[1024];
OP op[1024];
void init_nu( ){ top = 0; }
void push_nu( int term ){ b[top++] = term; }
int pop_nu( ){ return b[--top]; }
int is_empty_nu( ){ return top == 0; }
void destory_nu( ) { top = 0; }
void init_sign( ){ beg = 0; }
void push_sign( OP sign ){ op[beg++] = sign; }
void destory_sign( ){ beg = 0; }
OP pop_sign( ){ return op[--beg];}
OP get_sign( ){ return op[beg - 1]; }
int is_empty_sign( ){return beg == 0; }
int eval()
{
int i, j;
i = pop_nu();
j = pop_nu();
switch( pop_sign() )
{
case '+': push_nu( j + i ); break;
case '-': push_nu( j - i ); break;
case '*': push_nu( j * i ); break;
case '/': push_nu( j / i ); break;
case '%': push_nu( j & i ); break;
defult: break;
}
}
int change( char *s )
{
int i;
int n = strlen( s );
for( i = 0; i < n; i++ )
{
if( s[i] >= '0' && s[i] <= '9' )
push_nu( 0 );
while( s[i] >= '0' && s[i] <= '9' )
push_nu( 10 * pop_nu() + s[i++] - '0' );
switch( s[i] )
{
case '+': while( a[add][get_sign()] <= 0 )
eval();
push_sign( add ); break;
case '-': while( a[nul][get_sign()] <= 0 )
eval();
push_sign( nul ); break;
case '*': while( a[sub][get_sign()] <= 0 )
eval();
push_sign( sub ); break;
case '/': while( a[div1][get_sign()] <= 0 )
eval();
push_sign( div1 ); break;
case '%': while( a[yu][get_sign()] <= 0 )
eval();
push_sign( yu ); break;
case '(': push_sign( l ); break;
case ')': while( (get_sign()) != l )
eval();
pop_sign();
break;
defult: break;
}
}
return pop_nu();
}
int main( void )
{
char *s = "((5-3)*2+4/2&2+1)";
init_nu();
init_sign();
printf( "%d\n", change( s ));
destory_nu();
destory_sign();
return 0;
}
以前編的,希望對你有幫助。
別忘了給我分。
Ⅹ 如何用C語言實現多項式的加法和乘法
按題目要求應該是(1+X)*(1+X)=X2+1吧
可以用單鏈表表示多項的指數,比如1+X可以表示為0,1
X2+1可以表示為2,0,Xn+X(n-1)+...+1即n,n-1,.....0
所有的指數建議按大小排序,可以在單鏈表插入時進行。
加法,可以新建一個鏈表C做為結果,把鏈表A的內容復制到C,然後把另一個鏈表B中的每一項插入C,如果要插入的項已存在,則不插入並且刪除這個結點。
乘法,新建一個鏈表C作為結果,要用2層循環遍歷A和B中的每一項,對AB中的每個項都要算個加法,把和插入C中,如果這個和已存在,則不插入並且刪除這個結點。