『壹』 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語言用鏈表實現多項式的加減法,減法處理過程中出現的問題。
你把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語言程序題:編寫程序實現多項式計算
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#defineEPS1E-6
typedefstructitem{
doublecoefficient;
intpower;
structitem*next;
}*POLYNOMIAL,*pItem;
POLYNOMIALCreate(){//創建多項式
pItemhead,p;
doublecoe;
intpwr;
head=p=(pItem)malloc(sizeof(item));
while(1){
printf("系數冪次(00結束):");
scanf("%lf%d",&coe,&pwr);
if(fabs(coe)<=EPS&&!pwr)break;
p->next=(pItem)malloc(sizeof(item));
p->next->coefficient=coe;
p->next->power=pwr;
p=p->next;
}
p->next=NULL;
returnhead;
}
voidSort(POLYNOMIALhead){//按冪次降排序
pItempt,q,p=head;
while(p->next){
q=p->next;
while(q->next){
if(p->next->power<q->next->power){
pt=p->next;
p->next=q->next;
q->next=p->next->next;
p->next->next=pt;
}
elseq=q->next;
}
p=p->next;
}
}
voidShow(POLYNOMIALhead){//顯示多項式
POLYNOMIALp=head->next;
intflag=1;
if(p==NULL)return;
while(p){
if(flag){
if(fabs(p->coefficient)>=EPS){
if(p->power==0)printf("%.2lf",p->coefficient);
elseif(p->power==1){
if(p->coefficient==1.0)printf("x");
elseif(p->coefficient==-1.0)printf("-x");
elseprintf("%.2lfx",p->coefficient);
}
elseif(p->coefficient==1.0)printf("x^%d",p->power);
elseif(p->coefficient==-1.0)printf("-x^%d",p->power);
elseprintf("%.2lfx^%d",p->coefficient,p->power);
flag=0;
}
}
elseif(p->coefficient>0.0&&fabs(p->coefficient)>=EPS){
if(p->power==0)printf("+%.2lf",p->coefficient);
elseif(p->power==1){
if(p->coefficient==1.0)printf("+x");
elseprintf("+%.2lfx",p->coefficient);
}
elseif(p->coefficient==1.0)printf("+x^%d",p->power);
elseprintf("+%.2lfx^%d",p->coefficient,p->power);
}
elseif(p->coefficient<0.0&&fabs(p->coefficient)>=EPS){
if(p->power==0)printf("-%.2lf",-p->coefficient);
elseif(p->power==1){
if(p->coefficient==-1.0)printf("-x");
elseprintf("-%.2lfx",-p->coefficient);
}
elseif(p->coefficient==-1.0)printf("-x^%d",p->power);
elseprintf("-%.2lfx^%d",-p->coefficient,p->power);
}
p=p->next;
}
printf(" ");
}
doublePower(doublex,intn){
doublevalue=1.0;
inti;
for(i=0;i<n;++i)value*=x;
returnvalue;
}
doubleValue(POLYNOMIALhead,doublex){//多項式求值
POLYNOMIALp;
doublevalue=0.0;
for(p=head->next;p;p=p->next)
value+=p->coefficient*Power(x,p->power);
returnvalue;
}
POLYNOMIALCopy(POLYNOMIALA){
POLYNOMIALhead,t,p;
head=t=(pItem)malloc(sizeof(item));
for(p=A->next;p;p=p->next){
t->next=(pItem)malloc(sizeof(item));
t->next->coefficient=p->coefficient;
t->next->power=p->power;
t=t->next;
}
t->next=NULL;
returnhead;
}
POLYNOMIALAdditive(POLYNOMIALA,POLYNOMIALB){//多項式相加
POLYNOMIALhead,p,q,t;
head=Copy(A);
for(p=B;p->next;p=p->next){
q=head;
while(q->next){
if(p->next->power==q->next->power){
q->next->coefficient+=p->next->coefficient;
if(fabs(q->next->coefficient)<=EPS){
t=q->next;
q->next=t->next;
free(t);
}
break;
}
q=q->next;
}
if(q->next==NULL){
q->next=(pItem)malloc(sizeof(item));
q->next->coefficient=p->next->coefficient;
q->next->power=p->next->power;
q->next->next=NULL;
}
}
Sort(head);
returnhead;
}
POLYNOMIALSubtract(POLYNOMIALA,POLYNOMIALB){//多項式相減
POLYNOMIALhead,p,q,t;
head=Copy(A);
for(p=B;p->next;p=p->next){
q=head;
while(q->next){
if(p->next->power==q->next->power){
q->next->coefficient-=p->next->coefficient;
if(fabs(q->next->coefficient)<=EPS){
t=q->next;
q->next=t->next;
free(t);
}
break;
}
q=q->next;
}
if(q->next==NULL){
q->next=(pItem)malloc(sizeof(item));
q->next->coefficient=-p->next->coefficient;
q->next->power=p->next->power;
q->next->next=NULL;
}
}
Sort(head);
returnhead;
}
POLYNOMIALMultiplication(POLYNOMIALA,POLYNOMIALB){//多項式相乘
POLYNOMIALhead,t,p,q;
head=t=(pItem)malloc(sizeof(item));
for(p=A->next;p;p=p->next){//完成相乘過程
for(q=B->next;q;q=q->next){
t->next=(pItem)malloc(sizeof(item));
t->next->coefficient=p->coefficient*q->coefficient;
t->next->power=p->power+q->power;
t=t->next;
}
}
t->next=NULL;
Sort(head);//排序
p=head;
while(p->next){//合並同類項
q=p->next;
while(q->next){
if(p->next->power==q->next->power){
p->next->coefficient+=q->next->coefficient;
t=q->next;
q->next=t->next;
free(t);
}
elseq=q->next;
}
p=p->next;
}
returnhead;
}
voidFreeMemory(POLYNOMIALhead){
POLYNOMIALq,p=head;
while(p){
q=p;
p=q->next;
free(q);
}
}
intmain(){
printf("創建多項式A: ");
POLYNOMIALA=Create();
Sort(A);
printf("A(x)=");Show(A);
printf("創建多項式B: ");
POLYNOMIALB=Create();
Sort(B);
printf("B(x)=");Show(B);
POLYNOMIALC=Additive(A,B);
printf("C(x)=");Show(C);
POLYNOMIALD=Subtract(A,B);
printf("D(x)=");Show(D);
POLYNOMIALE=Multiplication(A,B);
printf("E(x)=");Show(E);
printf("A(%.2lf)=%.4lf ",2.0,Value(A,2.0));
printf("B(%.2lf)=%.4lf ",2.0,Value(B,2.0));
printf("C(%.2lf)=%.4lf ",2.0,Value(C,2.0));
printf("D(%.2lf)=%.4lf ",2.0,Value(D,2.0));
printf("E(%.2lf)=%.4lf ",2.0,Value(E,2.0));
FreeMemory(A);
FreeMemory(B);
FreeMemory(C);
FreeMemory(D);
FreeMemory(E);
return0;
}
『陸』 如何用C語言實現設計和實現多項式運算
【知識點】
若矩陣A的特徵值為λ1,λ2,...,λn,那麼|A|=λ1·λ2·...·λn
【解答】
|A|=1×2×...×n= n!
設A的特徵值為λ,對於的特徵向量為α。
則 Aα = λα
那麼 (A²-A)α = A²α - Aα = λ²α - λα = (λ²-λ)α
所以A²-A的特徵值為 λ²-λ,對應的特徵向量為α
A²-A的特徵值為 0 ,2,6,...,n²-n
【評注】
對於A的多項式,其特徵值為對應的特徵多項式。
線性代數包括行列式、矩陣、線性方程組、向量空間與線性變換、特徵值和特徵向量、矩陣的對角化,二次型及應用問題等內容。