㈠ 一元稀疏多項式計算器的課程設計(數據結構)
//頭文件
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//定義多項式的項
typedefstructPolynomial{
floatcoef;
intexpn;
structPolynomial*next;
}*Polyn,Polynomial;
voidInsert(Polynp,Polynh){
if(p->coef==0)free(p);//系數為0的話釋放結點
else
{
Polynq1,q2;
q1=h;
q2=h->next;
while(q2&&p->expn<q2->expn)
{//查找插入位置
q1=q2;
q2=q2->next;
}
if(q2&&p->expn==q2->expn)
{//將指數相同相合並
q2->coef+=p->coef;
free(p);
if(!q2->coef)
{//系數為0的話釋放結點
q1->next=q2->next;
free(q2);
}
}
else
{//指數為新時將結點插入
p->next=q2;
q1->next=p;
}
}
}
PolynCreatePolyn(Polynhead,intm){
//建立一個頭指針為head、項數為m的一元多項式
inti;
Polynp;
p=head=(Polyn)malloc(sizeof(structPolynomial));
head->next=NULL;
for(i=0;i<m;i++)
{
p=(Polyn)malloc(sizeof(structPolynomial));//建立新結點以接收數據
printf("請輸入第%d項的系數與指數:",i+1);
scanf("%f%d",&p->coef,&p->expn);
Insert(p,head);//調用Insert函數插入結點
}
returnhead;
}
voidDestroyPolyn(Polynp){
//銷毀多項式p
Polynq1,q2;
q1=p->next;
q2=q1->next;
while(q1->next)
{
free(q1);
q1=q2;
q2=q2->next;
}
}
voidPrintPolyn(PolynP){
Polynq=P->next;
intflag=1;//項數計數器
if(!q)
{//若多項式為空,輸出0
putchar('0');
printf(" ");
return;
}
while(q)
{
if(q->coef>0&&flag!=1)putchar('+');//系數大於0且不是第一項
if(q->coef!=1&&q->coef!=-1)
{//系數非1或-1的普通情況
printf("%g",q->coef);
if(q->expn==1)putchar('X');
elseif(q->expn)printf("X^%d",q->expn);
}
else
{
if(q->coef==1)
{
if(!q->expn)putchar('1');
elseif(q->expn==1)putchar('X');
elseprintf("X^%d",q->expn);
}
if(q->coef==-1)
{
if(!q->expn)printf("-1");
elseif(q->expn==1)printf("-X");
elseprintf("-X^%d",q->expn);
}
}
q=q->next;
flag++;
}
printf(" ");
}
intcompare(Polyna,Polynb){
if(a&&b)
{
if(!b||a->expn>b->expn)return1;
elseif(!a||a->expn<b->expn)return-1;
elsereturn0;
}
elseif(!a&&b)return-1;//a多項式已空,但b多項式非空
elsereturn1;//b多項式已空,但a多項式非空
}
PolynAddPolyn(Polynpa,Polynpb){//求解並建立多項式a+b,返回其頭指針
Polynqa=pa->next;
Polynqb=pb->next;
Polynheadc,hc,qc;
hc=(Polyn)malloc(sizeof(structPolynomial));//建立頭結點
hc->next=NULL;
headc=hc;
while(qa||qb)
{
qc=(Polyn)malloc(sizeof(structPolynomial));
switch(compare(qa,qb)){
case1:
{
qc->coef=qa->coef;
qc->expn=qa->expn;
qa=qa->next;
break;
}
case0:
{
qc->coef=qa->coef+qb->coef;
qc->expn=qa->expn;
qa=qa->next;
qb=qb->next;
break;
}
case-1:
{
qc->coef=qb->coef;
qc->expn=qb->expn;
qb=qb->next;
break;
}
}
if(qc->coef!=0)
{
qc->next=hc->next;
hc->next=qc;
hc=qc;
}
elsefree(qc);//當相加系數為0時,釋放該結點
}
returnheadc;
}
PolynSubtractPolyn(Polynpa,Polynpb){//求解並建立多項式a-b,返回其頭指針
Polynh=pb;
Polynp=pb->next;
Polynpd;
while(p)
{//將pb的系數取反
p->coef*=-1;
p=p->next;
}
pd=AddPolyn(pa,h);
for(p=h->next;p;p=p->next)//恢復pb的系數
p->coef*=-1;
returnpd;
}
intValuePolyn(Polynhead,intx){
//輸入x值,計算並返回多項式的值
Polynp;
inti;
intsum=0,t;
for(p=head->next;p;p=p->next)
{
t=1;
for(i=p->expn;i!=0;)
{
if(i<0){t/=x;i++;}//指數小於0,進行除法
else{t*=x;i--;}//指數大於0,進行乘法
}
sum+=p->coef*t;
}
returnsum;
}
PolynDerivative(Polynhead){
//求解並建立導函數多項式,並返回其頭指針
Polynq=head->next,p1,p2,hd;
hd=p1=(Polyn)malloc(sizeof(structPolynomial));//建立頭結點
hd->next=NULL;
while(q)
{
if(q->expn!=0)
{//該項不是常數項時
p2=(Polyn)malloc(sizeof(structPolynomial));
p2->coef=q->coef*q->expn;
p2->expn=q->expn-1;
p2->next=p1->next;//連接結點
p1->next=p2;
p1=p2;
}
q=q->next;
}
returnhd;
}
PolynMultiplyPolyn(Polynpa,Polynpb){
//求解並建立多項式a*b,返回其頭指針
Polynhf,pf;
Polynqa=pa->next;
Polynqb=pb->next;
hf=(Polyn)malloc(sizeof(structPolynomial));//建立頭結點
hf->next=NULL;
for(;qa;qa=qa->next)
{
for(qb=pb->next;qb;qb=qb->next)
{
pf=(Polyn)malloc(sizeof(structPolynomial));
pf->coef=qa->coef*qb->coef;
pf->expn=qa->expn+qb->expn;
Insert(pf,hf);//調用Insert函數以合並指數相同的項
}
}
returnhf;
}
voidmain()
{
intm,n,a,x;
charflag;
Polynpa=0,pb=0,pc;
printf("歡迎使用多項式操作程序 ");
printf("請輸入a的項數:");
scanf("%d",&m);
pa=CreatePolyn(pa,m);//建立多項式a
printf("請輸入b的項數:");
scanf("%d",&n);
pb=CreatePolyn(pb,n);//建立多項式b
//輸出菜單
printf("******************************************************* ");
printf("*多項式操作程序* ");
printf("** ");
printf("*A:輸出多項式B:輸出多項式b* ");
printf("** ");
printf("*C:輸出a的導數D:輸出b的導數* ");
printf("** ");
printf("*E:代入x的值計算aF:代入x的值計算b* ");
printf("** ");
printf("*G:輸出a+bH:輸出a-b* ");
printf("** ");
printf("*I:輸出a*bJ:退出程序* ");
printf("** ");
printf("******************************************************* ");
while(a)
{
printf(" 請選擇操作:");
scanf("%c",&flag);//空格符號一定要注意
switch(flag)
{
case'A':
case'a':
{
printf(" 多項式a=");
PrintPolyn(pa);
break;
}
case'B':
case'b':
{
printf(" 多項式b=");
PrintPolyn(pb);
break;
}
case'C':
case'c':
{
pc=Derivative(pa);
printf(" 多項式a的導函數為:a'=");
PrintPolyn(pc);
break;
}
case'D':
case'd':
{
pc=Derivative(pb);
printf(" 多項式b的導函數為:b'=");
PrintPolyn(pc);
break;
}
case'E':
case'e':
{
printf("輸入x的值:x=");
scanf("%d",&x);
printf(" x=%d時,a=%d ",x,ValuePolyn(pa,x));
break;
}
case'F':
case'f':
{
printf("輸入x的值:x=");
scanf("%d",&x);
printf(" x=%d時,b=%d ",x,ValuePolyn(pb,x));
break;
}
case'G':
case'g':
{
pc=AddPolyn(pa,pb);
printf(" a+b=");
PrintPolyn(pc);
break;
}
case'H':
case'h':
{
pc=SubtractPolyn(pa,pb);
printf(" a-b=");
PrintPolyn(pc);
break;
}
case'I':
case'i':
{
pc=MultiplyPolyn(pa,pb);
printf(" a*b=");
PrintPolyn(pc);
break;
}
case'J':
case'j':
{
printf(" 感謝使用此程序! ");
DestroyPolyn(pa);
DestroyPolyn(pb);
a=0;
break;
}
default:
printf(" 您的選擇錯誤,請重新選擇! ");
}
}
}
把樓上的回答用代碼格式重新排版了一下,方便閱讀
㈡ 基本內容:設計一個一元稀疏多項式簡單計算器。輸入並建立多項式、按指數降序輸出多項式、多項式相加、多
#include <iostream.h>
#include<string.h>
#include<malloc.h>
#define N 40
typedef struct node{
int x,z;
struct node *next;
}*pnode;
int isnum(char c)
{
if(c>='0'&&c<='9') return 1;
else return 0;
}
pnode create(char *c,int i,int j)
{
if(j<i) return NULL;
int a=0,b=0,flag=0;
//處理系數。
if(!isnum(c[i])) a=1;
else
while(isnum(c[i])&&i<=j)
{
a=a*10+c[i]-'0';
i++;
}
//跳過系數與指數間非數字字元。
while(!isnum(c[i])&&i<=j)
{
flag=1;
i++;
}
//處理指數。
if(i>j&&flag==1) b=1;
else
{
if(c[i-1]=='-'&&c[i-2]=='^') flag=2;//指數是負數情況記錄。
while(isnum(c[i])&&i<=j)
{
b=b*10+c[i]-'0';
i++;
}
}
if(flag==2) b=-b;//指數是負數情況處理。
pnode p;
p=(pnode)malloc(sizeof(node));
p->x=a;
p->z=b;
return p;
}//創建一個結點,表示多項式的一項。把"12X^3"這樣字元串轉化成一個只有系數、指數、後繼的結構體。
pnode create_o(char *c,int m)
{
if(c[m]=='\0') return NULL;
int i,j;
pnode p,q;
i=m;
if(c[i]=='+'||c[i]=='-')i++;
j=i;
while(c[j]!='\0'&&c[j]!='+'&&(c[j]!='-'||c[j-1]=='^'))
{
j++;
}//移動到多項式字元串的從下標m起第一項末。
if(c[i]!='0')
{
p=create(c,i,j-1);
if(i>0&&c[i-1]=='-') p->x=-(p->x);
q=create_o(c,j);
p->next=q;
return p;
}
else
return create_o(c,j); //系數為0項,不建立,跳過。
}//把一元多項式的字元串用鏈式存儲。
pnode plus(pnode p,pnode q)
{
pnode P,H,t,m,n;
m=p;
n=q;
H=P=(pnode)malloc(sizeof(node));
while(m!=NULL&&n!=NULL)
{
t=(pnode)malloc(sizeof(node));
if(m->z>n->z)
{
t->x=m->x;
t->z=m->z;
m=m->next;
}
else
if(m->z==n->z)
{
if(m->x==-(n->x))
{
m=m->next;
n=n->next;
continue;
}//指數相同,系數相反,情況處理。
t->x=m->x+n->x;
t->z=n->z;
m=m->next;
n=n->next;
}
else
{
t->x=n->x;
t->z=n->z;
n=n->next;
}
P->next=t;
P=P->next;
}
while(m!=NULL)
{
t=(pnode)malloc(sizeof(node));
t->x=m->x;
t->z=m->z;
m=m->next;
P->next=t;
P=P->next;
}
while(n!=NULL)
{
t=(pnode)malloc(sizeof(node));
t->x=n->x;
t->z=n->z;
n=n->next;
P->next=t;
P=P->next;
}
P->next=NULL;
P=H;
H=H->next;
free(P);
return H;
}//兩個一元多項式的相加。
pnode minus(pnode p,pnode q)
{
if(q==NULL) return p;
pnode t,h,g,q1;
t=q;
h=(pnode)malloc(sizeof(node));
h->x=-(t->x);
h->z=t->z;
t=t->next;
q1=h;
g=h;
while(t!=NULL)
{
h=(pnode)malloc(sizeof(node));
h->x=-(t->x);
h->z=t->z;
g->next=h;
g=g->next;
t=t->next;
}
g->next=NULL;
if(p==NULL) return q1;
return (plus(p,q1));
}//兩個一元多項式的差。
pnode chen(pnode p,pnode q)
{
pnode k,h,t,g;
k=p;
t=(pnode)malloc(sizeof(node));
h=t;
h->x=(k->x)*(q->x);
h->z=k->z+q->z;
k=k->next;
g=h;
while(k!=NULL)
{
h=(pnode)malloc(sizeof(node));
h->x=(k->x)*(q->x);
h->z=k->z+q->z;
g->next=h;
g=g->next;
k=k->next;
}
g->next=NULL;
return t;
}//多項式中的一項與另一個多項式的乘。
pnode cheno(pnode p1,pnode p2)
{
void free_pnode(pnode p);//釋放一個鏈表空間。
if(p1==NULL||p2==NULL) return NULL;
pnode m,n,t,g;
n=p2;
t=NULL;
while(n!=NULL)
{
m=chen(p1,n);
g=plus(t,m);
free_pnode(m);
free_pnode(t);
t=g;
n=n->next;
}
return t;
}//兩個多項式的乘。
void print(pnode p)
{
if(p==NULL)
{
cout<<"0"<<endl;
return;
}
while(p!=NULL)
{
if(p->x==-1&&p->z!=0)cout<<"-";
else if(p->x!=1||p->z==0)
cout<<p->x;
if(p->z)
{
cout<<"X";
if(p->z!=1)
cout<<"^"<<p->z;
}
p=p->next;
if(p!=NULL&&p->x>0) cout<<"+";
}
cout<<endl;
}//輸出鏈式存儲多項式。
void main()
{
cout<<"****************************************************************************"<<endl;
cout<<"***********************一元多項式的計算(和差積)*****************************"<<endl;
cout<<"****************************************************************************"<<endl;
char ch1[N];//="30X^45-X-9";
char ch2[N];//="-4X^3-2X+1";
int n=1;
pnode p1,p2;
cout<<"輸入第一個多項式(行式如.22X^31+X^22+X-1):\n";
cin>>ch1;
p1=create_o(ch1,0);
cout<<"輸入第二個多項式(行式如.22X^31+X^24+X-1):\n";
cin>>ch2;
p2=create_o(ch2,0);
cout<<"多項式p1:";
print(p1);
cout<<"多項式p2:";
print(p2);
cout<<"******************************************"<<endl;
cout<<"********* 用 戶 選 擇 ************"<<endl;
cout<<"********* ************"<<endl;
cout<<"********* 1 . 兩 多 項 式 和 ************"<<endl;
cout<<"********* ************"<<endl;
cout<<"********* 2 . 兩 多 項 式 差 ************"<<endl;
cout<<"********* ************"<<endl;
cout<<"********* 3 . 兩 多 項 式 積 ************"<<endl;
cout<<"********* ************"<<endl;
cout<<"********* 0 . 退 出 ************"<<endl;
cout<<"********* ************"<<endl;
cout<<"******************************************"<<endl;
while(n)
{ cout<<"請輸入你的選擇:";
cin>>n;
switch(n)
{
case 1:
cout<<"兩多項式和(p1+p2)為:";
print(plus(p1,p2));
break;
case 2:
cout<<"兩多項式差(p1-p2)為:";
print(minus(p1,p2));
break;
case 3:
cout<<"兩多項式積(p1*p2)為:";
print(cheno(p1,p2));
break;
default: cout<<" 錯誤選擇! "<<endl;
}
}
}
void free_pnode(pnode p)
{
pnode t;
while(p!=NULL)
{
t=p;
p=p->next;
free(t);
}
}
採納吧,100%能用,我測試過了
㈢ 程序設計 一元多項式
一個用數組的程序,這個我已在win-tc下調試通過。數據用數組存放,是順序存儲結構,沒有使用鏈表。使用鏈表的程序我也有,但還需要完善。這題只是多項式的加法,所以演算法很簡單的,應該多看看下面的乘法的演算法。
/*
本題的一個完整的c程序如下,在win-tc和Dev-c++下調試通過。
需要說明的是這里的m,n表示x的冪分別是m-1次和n-1次,
同時p[]和q[]的各系數是從x^(m-1)和x^(n-1)到x^0前的系數,
比如px=3x^3+2x+1,qx=x^2-11x+3,那麼m=4,n=3,px和qx的系數分別為
3,0,2,1和1,-11,3
*/
/*多項式加法程序*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX 50
void npadd(double p[],int m,double q[],int n,double s[])
{
int i,j;
for(i=0;i<m-n;i++)
s[i]=p[i]; /*計算各項系數,將冪指數高的多項式中高出的各項系數先復制到數組s[]中*/
for (i=m-n,j=0; i<=m-1; i++,j++)
s[i]=p[i]+q[j]; /*計算各項系數,剩下的冪指數相同的各項系數對應相加,減法運算只要將這里的加號改成減號即可*/
return;
}
double compute(double s[],int k,double x) /*計算所給多項式的值*/
{
int i;
double multip = 1,sum = 0;
for (i=0;i<k-1;i++)
multip = multip * x; /*先求出x的最高次項的值*/
for (i=0;i<=k-1;i++)
{
sum = sum + s[i] * multip; /*依次從高到低求出相對應次項的值*/
if (x!=0)
multip = multip / x;
}
return sum;
}
int main()
{
int i,j,m,n;
double px[MAX],qx[MAX],rx[MAX],x;
system("cls");
for(i=0;i<MAX;i++)
rx[i]=0;
puts("Please input two polynomials one by one");
puts("P(x)=Pm-1*x^(m-1)+Pm-2*x^(m-2)+...+P1*x+P0");
puts("Q(x)=Qn-1*x^(n-1)+Qn-2*x^(n-2)+...+Q1*x+Q0");
printf("\nPlease input m (>=1): ");
scanf("%d",&m);
printf("Please input P%d, ... P0 one by one:\n",m-1);
for(i=0;i<m;i++)
scanf("%lf",&px[i]);
printf("\nPlease input n (1=<n<=m): ");/* 為簡化程序設冪次數低的後輸入 */
scanf("%d",&n);
printf("Please input Q%d, ... Q0 one by one:\n",n-1);
for(i=0;i<n;i++)
scanf("%lf",&qx[i]);
npadd(px,m,qx,n,rx);
printf("\nThe addition of two polynomials R(x) is :\n");
for (i=m,j=0;i>=1;i--) /*逐行逐項列印出結果多項式*/
{
printf(" (%f*x^%d) ",rx[m-i],i-1);
if(i-1>0)
printf(" + ");
else
printf(" . ");
if(j==2)
{
printf("\n");
j=0;
}
else
j++;
}
printf("\n");
printf("Input the value of x: ");
scanf("%lf",&x);
printf("\nThe value of the R(%f) is: %13.7f\n",x,compute(rx,m,x));
system("pause");
return 0;
}
用數組表示的相乘的地址如下:
http://..com/question/76281392.html
用鏈表的網上有,給你個鏈接,但是正確性我不能保證:
http://..com/question/80603134.html
㈣ 如何用C語言實現一元多項式簡單計算器的設計
/*:--------------一元稀疏多項式計算(部分)--------------*
* 基本功能:(1)輸入並建立多項式; *
* (2)多項式輸出,以 c1,e1,c2,e2,...輸出 *
* 其中ci為系數,ei為指數; *
* (3)多項式相加,c=a+b。 *
* 說明: (1)多項式一指數升序排序,但輸入時不檢查; *
* (2)以帶頭指針的單鏈表存儲。 *
*-------------------------------------------------------*/
#define OK 1
#define FAILE 0
#define ERROR 0
#define OVERFLOW 0
#include <iostream>
using namespace std;
typedef struct PolynNode { /*某一項*/
double coef; /*系數*/
int expn; /*指數*/
} ElemType,term;
typedef struct LNode {
ElemType data;
struct LNode *next;
}LNode,*LinkList;
typedef LinkList Polyn; /*帶頭結點*/
int init_polyn(Polyn head,int n)
{/*創建有n項的多項式,n應大於0,但不作檢查*/
/*指數e1<e2<e3...,但不作檢查,間隔地輸入系數與指數,即c1 e1 ...*/
Polyn p,q = head;
double coef;
int expn,count;
if(head == NULL)
return ERROR;
if((p = (Polyn)malloc(sizeof(LNode))) == NULL)
return OVERFLOW;
printf("Please input n pairs of coef and expn.\n");
for(count = 0;count < n;count++) {
q->next = p;
q = p;
scanf("%f%d",&coef,&expn);
p->data.coef = coef;
p->data.expn = expn;
if((p = (Polyn)malloc(sizeof(LNode))) == NULL)
return OVERFLOW;
}
q->next = NULL;/*尾*/
return OK;
}
int print_polyn(Polyn head)
{/*輸出*/
Polyn p=head->next;
int count;
if(head == NULL)
return ERROR;
while(p != NULL) {
printf("%.4lf % 3d",p->data.coef,p->data.expn);
count++;
if((count % 10 == 0) && (!count))
printf("\n");
p = p->next;
}
return OK;
}
int add_polyn(Polyn ha,Polyn hb,Polyn hc)
{/*多項式相加*/
Polyn p1 = ha,p2 = ha,q1 = hb,q2 = hb;
hc = ha;
while( (p1 != NULL) && (q1 != NULL)) {
if(p1->data.expn < q1->data.expn) { /*p1指數<q1指數*/
p2 = p1;
p1 = p1->next;
}
else {
if(p1->data.expn == q1->data.expn) { /*q1指數==p1指數*/
if(!(p1->data.coef + q1->data.coef)) {/*系數之和為0*/
p1 = p1->next;
free(p2->next);
p2->next = p1;
q1 = q1->next;
free(q2->next);
q2->next =q1;
}
else { /*系數之和不為0*/
p1->data.coef += q1->data.coef;
p2 = p1;
p1 = p1->next;
q1 = q1->next;
free(q2->next);
q2->next =q1;
}
}
else { /*q1指數<p1指數*/
p2->next = q1;
q1->next = p1;
p2 = p2->next;
q1 = q1->next;
q2->next = q1;
}
}
}
if(p1 == NULL) { /*p1結束了,q1未結束*/
p2->next = q1;
}
ha->next = NULL;
free(ha);
free(hb);
return OK;
}
int main()
{
int creat_polyn(Polyn head);
int init_polyn(Polyn head,int n);
int print_polyn(Polyn head);
int add_polyn(Polyn ha,Polyn hb,Polyn hc);
LNode polyn1,polyn2;
Polyn ha = &polyn1,hb = &polyn2,hc;
int n;
printf("How many terms do you want to initial the polynomial ha?Input a number.\n");
scanf("%d",&n);
init_polyn(ha,n);
print_polyn(ha);
printf("How many terms do you want to initial the polynomial hb?Input a number.\n");
scanf("%d",&n);
init_polyn(hb,n);
print_polyn(hb);
add_polyn(ha,hb,hc);
print_polyn(hc);
return 0;
}
㈤ 一元多項式的運算 程序功能簡介: 一元多項式的加法、減法和乘法的實現,已知如下兩個多項式
dim x as int
dim i as int
//記錄p(x)
for (i<x-1;i++);//數組是從0開始的所以成員數上限是x-1
p(i)=p*i+p*i+p
Q(i)=q*i+q*i+q
s(i)=p(i)
S(x+i)=S(i)
next
大概就是這樣
㈥ C語言課程設計 急求! 100懸賞!!多項式計算(用數組儲存)!
#include<stdio.h>
#defineN10
//字元串s按c字元分隔成小字元串t
intsplit(char*s,chart[][20],charc){
inti=0,k=0,ii;
while(s[i]!=0){
while(s[i]==c&&s[i]!=0)i++;
if(s[i]==0)break;
ii=i;
while(s[i]!=c&&s[i]!=0){
t[k][i-ii]=s[i];
i++;
}
t[k][i-ii]=0;
k++;
}
returnk;
}
//輸入多項式
voidinput(floata[],intn){
chars[200]="1234";
chart[N][20];
intm,i;
printf("請在一行內輸入多項式各系數 ");
fflush(stdin);//清除輸入緩沖
gets(s);
m=split(s,t,'');//把s以''為分隔為數組
for(i=0;i<n-m;i++)a[i]=0;
for(i=n-m;i<n;i++){
sscanf(t[i-n+m],"%f",&a[i]);
}
}
//輸出多項式
voidprintit(floata[],intn){
inti=0;
while(a[i]==0&&i<n-1)i++;
for(;i<n;i++)
printf("%.2f",a[i]);
}
voidmenu(){//顯示主菜單
printf("============================================ ");
printf("1.多項式加法 ");
printf("2.多項式減法 ");
printf("3.多項式乘法 ");
printf("0.退出 ");
printf("請選擇:");
}
//多項式相加
voidaddit(floata[],floatb[],floatc[],intn){
inti;
for(i=0;i<2*n;i++)c[i]=0;
for(i=0;i<n;i++)
c[n+i]=a[i]+b[i];
}
//多項式相減
voidsubit(floata[],floatb[],floatc[],intn){
inti;
for(i=0;i<2*n;i++)c[i]=0;
for(i=0;i<n;i++)
c[n+i]=a[i]-b[i];
}
//多項式相乘
voidmulit(floata[],floatb[],floatc[],intn){
inti,j;
for(i=0;i<2*n;i++)c[i]=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
c[i+j+1]+=a[i]*b[j];
}
intmain(){
floata[N],b[N],c[N*2];
intx;
printf("多項式運算,運算項數<=%d項 ",N);
while(1){
menu();
fflush(stdin);//清除輸入緩沖
scanf("%d",&x);
switch(x){
case1:
printf("輸入第一個多項式,");
input(a,N);
printf("輸入第二個多項式,");
input(b,N);
addit(a,b,c,N);//多項式相加
printf("相加的結果是: ");
printit(c,2*N);//輸出結果
printf(" ");
break;
case2:
printf("輸入第一個多項式,");
input(a,N);
printf("輸入第二個多項式,");
input(b,N);
subit(a,b,c,N);//多項式相減
printf("相減的結果是: ");
printit(c,2*N);//輸出結果
printf(" ");
break;
case3:
printf("輸入第一個多項式,");
input(a,N);
printf("輸入第二個多項式,");
input(b,N);
mulit(a,b,c,N);//多項式相乘
printf("相乘的結果是: ");
printit(c,2*N);//輸出結果
printf(" ");
break;
}
if(x==0)break;
}
}
㈦ 編寫一元多項式的計算器程序
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
float coef;
int expn;
struct LNode *next;
}LNode, *LinkList, *Link;
Link MakeNode(float c, int e){
Link p;
p=(Link)malloc(sizeof(LNode));
p->coef=c; p->expn=e; p->next=NULL;
return p;
}
void InitPoly(LinkList &P){
P=MakeNode(0,-1);
}
void Create(LinkList &P){
Link rear;
float c; int e;
InitPoly(P);
rear=P;
printf("Input coef expn, (0 0)Exit\n");
while(1){
scanf("%f%d",&c,&e);
if(c==0) break;
rear->next=MakeNode(c,e);
rear=rear->next;
}
}
void PrintPoly(LinkList P){
Link p;
if(P==NULL)
printf("NULL\n");
else if(P->next==NULL)
printf("0\n");
else{
p=P->next;
while(p){
printf("%fX^%d",p->coef,p->expn);
p=p->next;
if(p && p->coef>0) printf("+");
}
printf("\n");
}
}
void Copy(LinkList P1, LinkList &P2){
Link p1, p2;
if(P1==NULL) return;
InitPoly(P2);
p1=P1->next;
p2=P2;
while(p1){
p2->next=MakeNode(p1->coef,p1->expn);
p1=p1->next; p2=p2->next;
}
}
void AddPoly(LinkList P1, LinkList P2, LinkList &P3){
Link q1,q2,q3;
if(!P1 || !P2) return;
InitPoly(P3);
q3=P3;
q1=P1->next; q2=P2->next;
while(q1&&q2){
if(q1->expn<q2->expn){
q3->next=MakeNode(q1->coef,q1->expn);
q3=q3->next; q1=q1->next;
}
else if(q1->expn>q2->expn){
q3->next=MakeNode(q2->coef,q2->expn);
q3=q3->next; q2=q2->next;
}
else{
if(q1->coef+q2->coef!=0){
q3->next=MakeNode(q2->coef+q1->coef,q2->expn);
q3=q3->next;
}
q1=q1->next;q2=q2->next;
}
}
while(q1){
q3->next=MakeNode(q1->coef,q1->expn);
q3=q3->next; q1=q1->next;
}
while(q2){
q3->next=MakeNode(q2->coef,q2->expn);
q3=q3->next; q2=q2->next;
}
}
void SubPoly(LinkList P1, LinkList P2, LinkList &P3){
Link q1,q2,q3;
if(!P1 || !P2) return;
InitPoly(P3);
q3=P3;
q1=P1->next; q2=P2->next;
while(q1&&q2){
if(q1->expn<q2->expn){
q3->next=MakeNode(q1->coef,q1->expn);
q3=q3->next; q1=q1->next;
}
else if(q1->expn>q2->expn){
q3->next=MakeNode(-(q2->coef),q2->expn);
q3=q3->next; q2=q2->next;
}
else{
if(q1->coef+q2->coef!=0){
q3->next=MakeNode(q2->coef-q1->coef,q2->expn);
q3=q3->next;
}
q1=q1->next;q2=q2->next;
}
}
while(q1){
q3->next=MakeNode(q1->coef,q1->expn);
q3=q3->next; q1=q1->next;
}
while(q2){
q3->next=MakeNode(-(q2->coef),q2->expn);
q3=q3->next; q2=q2->next;
}
}
void Qiu(LinkList P1, LinkList &P2){
Link p1, p2;
if(P1==NULL) return;
InitPoly(P2);
p1=P1->next;
p2=P2;
while(p1){
p2->next=MakeNode((p1->coef)*(p1->expn),p1->expn-1);
p1=p1->next; p2=p2->next;
}
}
void jifenpolyn(LinkList P1, LinkList &P2){
Link p1, p2;
if(P1==NULL) return;
InitPoly(P2);
p1=P1->next;
p2=P2;
while(p1){
p2->next=MakeNode((p1->coef)/(p1->expn+1),p1->expn+1);
p1=p1->next; p2=p2->next;
}
}
void IS(LinkList P1, LinkList &P2,float c, int e){
if(P1==NULL) return;
Link q1,q2;
InitPoly(P2);
q1=P1->next;
q2=P2;
while(q1){
q2->next=MakeNode((q1->coef)*c,q1->expn+e);
q1=q1->next; q2=q2->next;
}
}
void Multiplypolynl(LinkList P1, LinkList P2, LinkList &P3,LinkList &P4){
Link q2;
q2=P2;
if(!P1 || !P2) return;
InitPoly(P3);
InitPoly(P4);
while(q2){
q2=q2->next;
IS(P1,P3,q2->coef,q2->expn);
AddPoly(P3,P4,P4 );
}
}
void Destroypolyn(LinkList P){
Link rear;
while(rear){
rear=P->next;
P->next=rear->next;
free(rear);}
free(P);
}
void Changepolyn(LinkList P,float c, int e){
Link rear;
while(rear->expn<e)
rear=rear->next;
rear->coef=c;
}
void Insert( LinkList P1,LinkList P3,float c, int e){
LinkList P2;
P2=MakeNode(c,e);
AddPoly(P1,P2,P3);}
#define N 12
void main(){
LinkList P[N]={NULL};
int i1,i2,i3,i4,menu,i;
while(1){
printf(" 0 -- Exit\n");
printf(" 1 -- Create\n");
printf(" 2 -- Print\n");
printf(" 3 -- Copy\n");
printf(" 4 -- Add\n");
printf(" 5 -- sub\n");
printf(" 6 -- qiu\n");
printf(" 7 -- jifeng\n");
printf(" 8 -- multi\n");
printf(" 9 -- destory\n");
printf(" 10 -- change\n");
printf(" 11 -- insert\n");
printf(" Select: ");
scanf("%d", &menu);
switch(menu){
case 0: return;
case 1:
printf(" Address: ");
scanf("%d", &i1);
Create(P[i1]);
break;
case 2:
printf("\n");
for(i=0;i<N; i++){
printf(" P(%d)= ", i);
PrintPoly(P[i]);
}
printf("\n");
break;
case 3:
printf(" A-->B, Input A,B: ");
scanf("%d%d",&i1,&i2);
Copy(P[i1],P[i2]);
break;
case 4:
printf(" A+B=C, Input A,B,C: ");
scanf("%d%d%d",&i1,&i2,&i3);
AddPoly(P[i1],P[i2],P[i3]);
break;
case 5:
printf(" A-B=C, Input A,B,C: ");
scanf("%d%d%d",&i1,&i2,&i3);
SubPoly(P[i1],P[i2],P[i3]);
break;
case 6:
printf(" 對A求導, Input A,B:");
scanf("%d%d",&i1,&i2);
Qiu(P[i1],P[i2]);
break;
case 7:
printf(" 對A積分 Input A,B:");
scanf("%d%d",&i1,&i2);
jifenpolyn(P[i1],P[i2]);
break;
case 8:
printf(" A*B=C, Input A,B,C: ");
scanf("%d%d%d%d",&i1,&i2,&i3,&i4);
Multiplypolynl(P[i1],P[i2],P[i3],P[i4]);
break;
case 9:
printf("銷毀A Input A:");
scanf("%d",&i1);
Destroypolyn(P[i1]);
break;
case 10:
float c; int e;
printf("change Input A,e,c:");
scanf("%d%d%f",&i1,&e,&c);
Changepolyn(P[i1],c,e);
break;
case 11:
float d; int f;
printf("insert Input A,B,e,c: ");
scanf("%d%d%d%f",&i1,&i2,&f,&d);
Insert(P[i1],P[i2],c,e);
break;
default: ;
}
}
}
㈧ 簡單的整系數一元多項式計算系統(絕對高分)
#include<stdio.h>
#include<stdlib.h>
typedef struct
{ float coef; //系數
int expn; //指數
}term;
typedef struct LNode
{ term data; //term多項式值
struct LNode *next;
}LNode,*LinkList;
typedef LinkList polynomail;
/*比較指數*/
int cmp(term a,term b)
{ if(a.expn>b.expn) return 1;
if(a.expn==b.expn) return 0;
if(a.expn<b.expn) return -1;
else exit(-2);
}
/*又小到大排列*/
void arrange1(polynomail pa)
{ polynomail h=pa,p,q,r;
if(pa==NULL) exit(-2);
for(p=pa;p->next!=NULL;p=p->next); r=p;
for(h=pa;h->next!=r;)//大的沉底
{ for(p=h;p->next!=r&&p!=r;p=p->next)
if(cmp(p->next->data,p->next->next->data)==1)
{ q=p->next->next;
p->next->next=q->next;
q->next=p->next;
p->next=q;
}
r=p;//r指向參與比較的最後一個,不斷向前移動
} }
/*由大到小排序*/
void arrange2(polynomail pa)
{ polynomail h=pa,p,q,r;
if(pa==NULL) exit(-2);
for(p=pa;p->next!=NULL;p=p->next); r=p;
for(h=pa;h->next!=r;)//小的沉底
{ for(p=h;p->next!=r&&p!=r;p=p->next)
if(cmp(p->next->next->data,p->next->data)==1)
{ q=p->next->next;
p->next->next=q->next;
q->next=p->next;
p->next=q;
}
r=p;//r指向參與比較的最後一個,不斷向前移動
} }
/*列印多項式,求項數*/
int printpolyn(polynomail P)
{ int i;
polynomail q;
if(P==NULL) printf("無項!\n");
else if(P->next==NULL) printf("Y=0\n");
else
{ printf("該多項式為Y=");q=P->next;i=1;
if(q->data.coef!=0&&q->data.expn!=0)
{ printf("%.2fX^%d",q->data.coef,q->data.expn); i++; }
if(q->data.expn==0&&q->data.coef!=0)
printf("%.2f",q->data.coef);//列印第一項
q=q->next;
if(q==NULL)
{printf("\n");return 1;}
while(1)//while中,列印剩下項中系數非零的項,
{ if(q->data.coef!=0&&q->data.expn!=0)
{ if(q->data.coef>0) printf("+");
printf("%.2fX^%d",q->data.coef,q->data.expn); i++;
}
if(q->data.expn==0&&q->data.coef!=0)
{ if(q->data.coef>0) printf("+");
printf("%f",q->data.coef);
}
q=q->next;
if(q==NULL)
{ printf("\n"); break; }
}
}
return 1;
}
/*1、創建並初始化多項式鏈表*/
polynomail creatpolyn(polynomail P,int m)
{ polynomail r,q,p,s,Q;
int i;
P=(LNode*)malloc(sizeof(LNode));
r=P;
for(i=0;i<m;i++)
{ s=(LNode*)malloc(sizeof(LNode));
printf("請輸入第%d項的系數和指數:",i+1);
scanf("%f%d",&s->data.coef,&s->data.expn);
r->next=s; r=s;
}
r->next=NULL;
if(P->next->next!=NULL)
{ for(q=P->next;q!=NULL/*&&q->next!=NULL*/;q=q->next)//合並同類項
for(p=q->next,r=q;p!=NULL;)
if(q->data.expn==p->data.expn)
{ q->data.coef=q->data.coef+p->data.coef;
r->next=p->next;
Q=p;p=p->next;
free(Q);
}
else
{ r=r->next;
p=p->next;
}
}
return P;
}
/*2、兩多項式相加*/
polynomail addpolyn(polynomail pa,polynomail pb)
{ polynomail s,newp,q,p,r;int j;
p=pa->next;q=pb->next;
newp=(LNode*)malloc(sizeof(LNode));
r=newp;
while(p&&q)
{ s=(LNode*)malloc(sizeof(LNode));
switch(cmp(p->data,q->data))
{case -1: s->data.coef=p->data.coef;
s->data.expn=p->data.expn;
r->next=s; r=s;
p=p->next;
break;
case 0: s->data.coef=p->data.coef+q->data.coef;
if(s->data.coef!=0.0)
{ s->data.expn=p->data.expn;
r->next=s;
r=s;
}
p=p->next;
q=q->next;
break;
case 1: s->data.coef=q->data.coef;
s->data.expn=q->data.expn;
r->next=s; r=s;
q=q->next;
break;
}//switch
}//while
while(p)
{ s=(LNode*)malloc(sizeof(LNode));
s->data.coef=p->data.coef;
s->data.expn=p->data.expn;
r->next=s; r=s;
p=p->next;
}
while(q)
{ s=(LNode*)malloc(sizeof(LNode));
s->data.coef=q->data.coef;
s->data.expn=q->data.expn;
r->next=s; r=s;
q=q->next;
}
r->next=NULL;
for(q=newp->next;q->next!=NULL;q=q->next)//合並同類項
for(p=q;p!=NULL&&p->next!=NULL;p=p->next)
if(q->data.expn==p->next->data.expn)
{ q->data.coef=q->data.coef+p->next->data.coef;
r=p->next;
p->next=p->next->next;
free(r);
}
printf("升序 1 , 降序 2\n");
printf("選擇:");
scanf("%d",&j);
if(j==1) arrange1(newp);
else arrange2(newp);
return newp;
}
/*3、兩多項式相減*/
polynomail subpolyn(polynomail pa,polynomail pb)
{ polynomail s,newp,q,p,r,Q; int j;
p=pa->next;q=pb->next;
newp=(LNode*)malloc(sizeof(LNode));
r=newp;
while(p&&q)
{ s=(LNode*)malloc(sizeof(LNode));
switch(cmp(p->data,q->data))
{case -1: s->data.coef=p->data.coef;
s->data.expn=p->data.expn;
r->next=s; r=s;
p=p->next;
break;
case 0: s->data.coef=p->data.coef-q->data.coef;
if(s->data.coef!=0.0)
{ s->data.expn=p->data.expn;
r->next=s;
r=s;
}
p=p->next;
q=q->next;
break;
case 1: s->data.coef=-q->data.coef;
s->data.expn=q->data.expn;
r->next=s; r=s;
q=q->next;
break;
}//switch
}//while
while(p)
{ s=(LNode*)malloc(sizeof(LNode));
s->data.coef=p->data.coef;
s->data.expn=p->data.expn;
r->next=s; r=s;
p=p->next;
}
while(q)
{ s=(LNode*)malloc(sizeof(LNode));
s->data.coef=-q->data.coef;
s->data.expn=q->data.expn;
r->next=s; r=s;
q=q->next;
}
r->next=NULL;
if(newp->next!=NULL&&newp->next->next!=NULL)//合並同類項
{ for(q=newp->next;q!=NULL;q=q->next)
for(p=q->next,r=q;p!=NULL;)
if(q->data.expn==p->data.expn)
{ q->data.coef=q->data.coef+p->data.coef;
r->next=p->next;
Q=p;p=p->next;
free(Q); }
else
{ r=r->next;
p=p->next; }
} printf("升序 1 , 降序 2\n");
printf("選擇:");
scanf("%d",&j);
if(j==1) arrange1(newp);
else arrange2(newp);
return newp;}
/*4兩多項式相乘*/
polynomail mulpolyn(polynomail pa,polynomail pb)
{ polynomail s,newp,q,p,r;
int i=20,j;
newp=(LNode*)malloc(sizeof(LNode));
r=newp;
for(p=pa->next;p!=NULL;p=p->next)
for(q=pb->next;q!=NULL;q=q->next)
{ s=(LNode*)malloc(sizeof(LNode));
s->data.coef=p->data.coef*q->data.coef;
s->data.expn=p->data.expn+q->data.expn;
r->next=s;
r=s;}
r->next=NULL;
printf("升序 1 , 降序 2\n");
printf("選擇:");
scanf("%d",&j);
if(j==1) arrange1(newp);
else arrange2(newp);
for(;i!=0;i--)
{for(q=newp->next;q->next!=NULL;q=q->next)//合並同類項
for(p=q;p!=NULL&&p->next!=NULL;p=p->next)
if(q->data.expn==p->next->data.expn)
{ q->data.coef=q->data.coef+p->next->data.coef;
r=p->next;
p->next=p->next->next; free(r);
}
}
return newp;
}
/*5、銷毀已建立的兩個多項式*/
void delpolyn(polynomail pa,polynomail pb)
{ polynomail p,q;
p=pa;
while(p!=NULL)
{ q=p;
p=p->next;
free(q);
}
p=pb;
while(p!=NULL)
{ q=p;
p=p->next;
free(q);
}
printf("兩個多項式已經銷毀\n");
}
void main()
{ polynomail pa=NULL,pb=NULL;
polynomail p,q;
polynomail addp=NULL,subp=NULL,mulp=NULL;
int n,m;
int sign='y';
printf("1、創建兩個一元多項式\n");
printf("2、兩多項式相加得一新多項式\n");
printf("3、兩多項式相減得一新多項式\n");
printf("4、兩多項式相乘得一新多項式\n");
printf("5、銷毀已建立的兩個多項式\n");
printf("6、退出\n");
printf("\n");
while(sign!='n')
{ printf("請選擇:");
scanf("%d",&n);
switch(n)
{case 1:
if(pa!=NULL)
{ printf("已建立兩個一元多項式,請選擇其他操作!");
break;
}
printf("請輸入第一個多項式:\n");
printf("要輸入幾項:");
scanf("%d",&m);
while(m==0)
{ printf("m不能為0,請重新輸入m:");
scanf("%d",&m);
}
pa=creatpolyn(pa,m);
printpolyn(pa);
printf("請輸入第二個多項式:\n");
printf("要輸入幾項:");
scanf("%d",&m);
pb=creatpolyn(pb,m);
printpolyn(pb);
break;
case 2:
if(pa==NULL)
{ printf("請先創建兩個一元多項式!\n");
break;
}
addp=addpolyn(pa,pb);
printpolyn(addp);
break;
case 3:
if(pa==NULL)
{ printf("請先創建兩個一元多項式!\n");
break;
}
subp=subpolyn(pa,pb);
printpolyn(subp);
break;
case 4:
if(pa==NULL)
{ printf("請先創建兩個一元多項式!\n");
break;
}
mulp=mulpolyn(pa,pb);
printpolyn(mulp);
break;
case 5:
if(pa==NULL)
{ printf("請先創建兩個一元多項式!\n");
break;
}
delpolyn(pa,pb);
pa=pb=NULL;
break;
case 6:
if(addp!=NULL)
{ p=addp;
while(p!=NULL)
{ q=p;
p=p->next;
free(q);
}
}
if(subp!=NULL)
{ p=subp;
while(p!=NULL)
{ q=p;
p=p->next;
free(q);
}
}
exit(-2);
}//switch
}//while
}
㈨ 數據結構課程設計報告(一元多項式的計算)
【問題描述】
編程實現一元多項式的加法計算。
【基本要求】
能用鏈表實現一元多項式的加法計算,並能列印出計算結果。
【所需知識】
(1)基本編程方法和程序設計知識。
(2)鏈表的理解和運算與運用。
【所用演算法】
遍歷演算法和遞歸演算法。
【操作平台】
Visual C++
#include<stdio.h>
#include<graphics.h>
#define MAX 100
typedef struct polynode
{ float coef;
int expn;
struct polynode *next;
}node;
node * create(void) /*指針函數,返回指針類型;用尾插法建立一元多項式的鏈表的函數*/
{
node *h,*r,*s;
float c;
int e;
h=(node *)malloc(sizeof(node)); /*建立多項式的頭結點,為頭結點分配存儲空間*/
r=h; /*r指針始終動態指向鏈表的當前表尾,以便於做尾插入,其初值指向頭結點*/
printf("coef:");
scanf("%f",&c); /*輸入系數*/
printf("expn: ");
scanf("%d",&e); /*輸入指數*/
while(c!=0.0) /*輸入系數為0時,表示多項式的輸入結束*/
{
s=(node *)malloc(sizeof(node)); /*申請新結點*/
s->coef=c; /*申請新結點後賦值*/
s->expn=e; /*申請新結點後賦值*/
r->next=s; /*做尾插,插入新結點*/
r=s; /*r始終指向單鏈表的表尾*/
printf("coef:");
scanf("%f",&c);
printf("expn: ");
scanf("%d",&e);
}
r->next=NULL; /*將表的最後一個結點的next置NULL,以示表結束*/
return(h);
}
void polyadd(node *pa, node *pb) /*一元多項式相加函數,用於將兩個多項式相加,
然後將和多項式存放在多項式pa中,並將多項式pb刪除*/
{
node *p,*q,*pre,*temp;
int sum;
p=pa->next; /*令p和q分別指向pa和pb多項式鏈表中的第一個結點*/
q=pb->next;
pre=pa; /*位置指針,指向和多項式pa*/
while(p!=NULL&&q!=NULL) /*當兩個多項式均未掃描結束時,執行以下操作*/
{
if(p->expn<q->expn) /*若p指向的多項式指數小於q指的指數*/
{
pre->next=p; /*將p結點加入到和多項式中*/
pre=pre->next;
p=p->next;
}
if(p->expn==q->expn) /*若指數相等,則相應的系數相加*/
{
sum=p->coef+q->coef;
if(sum!=0)
{
p->coef=sum;
pre->next=p;pre=pre->next;p=p->next;
temp=q;q=q->next;free(temp);
}
else /*如果系數和為零,則刪除結點p與q,並將指針指向下一個結點*/
{
temp=p->next;free(p);p=temp;
temp=q->next;free(q);q=temp;
}
}
if (q->expn<p->expn)
{
pre->next=q; /*將q結點加入到和多項式中*/
pre=pre->next;
q=q->next;
}
}
if(p!=NULL) /*多項式A中還有剩餘,則將剩餘的結點加入到和多項式中*/
pre->next=p;
else /*否則將B的結點加入到和多項式中*/
pre->next=q;
}
void print(node * p) /*輸出函數,列印出一元多項式*/
{
while(p->next!=NULL)
{
p=p->next;
printf(" %f*x^%d",p->coef,p->expn);
}
}
void calculate() /*給多項式賦值並計算*/
{ float cal=1.0,mid=0.0,las;
int j;
float num, x;
int i=0;
float later=0.0;
int e[MAX];float c[MAX];
printf("Please input num:"); /*輸入常數的值*/
scanf("%f",&num);
printf("Please input x:"); /*輸入未知數X的值*/
scanf("%f",&x);
printf("Please input e[0]:"); /*輸入數組的初值以判斷是否循環*/
scanf("%d",&e[0]);
printf("Please input c[0]:");
scanf("%f",&c[0]);
while(e[i]!=0 && c[i]!=0.0 ) /*此循環用於多項式的計算*/
{ cal=1;
for(j=0;j<e[i];j++) /*表示出X的幾次方*/
{
cal=cal*x;
}
i++;
mid=cal*c[i-1]; /*表示出單項*/
later+=mid;
printf("Please input e[%d] and c[%d] :",i,i);
scanf("%d%f",&e[i],&c[i]);
}
las=later+num; /*表示出完整的多項式*/
printf("The Result is :\n");
printf("%f",las); /*最終的計算結果*/
sleep(3);
}
void main()
{
node * pa,* pb,*pc,*p,*q,*pre;
int driver=VGA,mode=VGAHI;
initgraph(&driver,&mode,"c:\\tc ");
setbkcolor(BLUE);
setcolor(RED);
printf("Welcome,Let's go!\n");
printf("Next, you will see the process of computing !");
printf("\nPlease input the coef and expn of pa:\n");
pa=create(); /*調用建立鏈表函數,創建多項式A*/
print(pa);
printf("\nPlease input the coef and expn of pb:\n");
pb=create(); /*同理,創建B*/
print(pb);
p=pa->next; /*以下代碼用於排序*/
pa->next=NULL;
while(p!=NULL)
{
if(pa->next==NULL)
{
pa->next=p;p=p->next;
pa->next->next=NULL;
}
else
{ pre=pa;q=pre->next;
while(q!=NULL && p->expn>q->expn)
{
pre=q;q=q->next;
}
q=p->next;
p->next=pre->next;
pre->next=p;
p=q;
}
}
printf("\nthe first ordered one:\n");print(pa); /*輸出排序後的pa*/
p=pb->next; /*以下代碼用於給pb排序*/
pb->next=NULL;
while(p!=NULL)
{
if(pb->next==NULL)
{
pb->next=p;p=p->next;
pb->next->next=NULL;
}
else
{ pre=pb;q=pre->next;
while(q!=NULL && p->expn>q->expn)
{
pre=q;q=q->next;
}
q=p->next;
p->next=pre->next;
pre->next=p;
p=q;
}
}
printf("\nthe second ordered one:\n");print(pb); /*輸出排序後的pb*/
printf("\nSum of the polys is:\n");
polyadd(pa,pb); /*調用一元多項式相加函數*/
print(pa); /*調用輸出函數,列印結果*/
printf("\n");
setbkcolor(RED);
calculate(); /*調用計算多項式值的函數*/
}
【編後總結】
本程序在邏輯設計,詳細設計,程序編碼和程序調試階段時本來都城有設計save()保存函數,和load()下載函數,分別用來保存創建的多項式,和下載其它需計算的多項式數據,這樣這個系統才能更加實用,void createadj()原來的函數原型為arcnode *createdj()函數中用鏈表結構把adjmatrix[][]的數據都保存其中,這樣就能實現數據的保存,但隨之要把Dijkstra中的adjmatrix[][]轉換成用arcnode 指針的形式進行表示,因為只有這樣,下載後的數據才能使用。但在最後的調試階段中,發現dijkstra無法運行,但又苦於無法用save()函數保存adjmatrix[][],最後只放棄save()和load()函數,在 main()主函數中初始化該算式。從這次程序設計中我看到自己的不足之處,今後要更努力的學習和掌握好數據結構程序設計的知識。
㈩ 數據結構一元多項式計算(急求)
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct polynode
{
int coef; //多項式的系數
int exp; //指數
struct polynode *next;
}node;
node *create() //用尾插法建立一元多項式的鏈表
{
node *h,*r,*s;
int c,e;
h=(node*)malloc(sizeof(node));
r=h;
printf("coef:");
scanf("%d",&c);
printf("exp: ");
scanf("%d",&e);
while(c!=0) //輸入系數為0時,多項式的輸入結束
{
s=(node*)malloc(sizeof(node));
s->coef=c;
s->exp=e;
r->next=s;
r=s;
printf("coef:");
scanf("%d",&c);
printf("exp: ");
scanf("%d",&e);
}
r->next=NULL;
return(h);
}
void print(node *p) //輸出函數,列印出一元多項式
{
while(p->next!=NULL)
{
p=p->next;
printf(" %d*x^%d",p->coef,p->exp);
}
}
void polyadd(node *ha, node *hb)//一元多項式相加函數,用於將兩個多項式相加,然後將和多項式存放在多項式ha中,並將多項式hb刪除
{
node *p,*q,*pre,*temp;
int sum;
p=ha->next;
q=hb->next;
pre=ha;
while(p!=NULL&&q!=NULL)
{
if(p->exp<q->exp)
{
pre->next=p;
pre=pre->next;
p=p->next;
}
else if(p->exp==q->exp)
{
sum=p->coef+q->coef;
if(sum!=0)
{
p->coef=sum;
pre->next=p;pre=pre->next;p=p->next;
temp=q;q=q->next;free(temp);
}
else //如果系數和為零,則刪除結點p與q,並將指針指向下一個結點
{
temp=p->next;free(p);p=temp;
temp=q->next;free(q);q=temp;
}
}
else
{
pre->next=q;
pre=pre->next;
q=q->next;
}
}
if(p!=NULL) //將多項式A中剩餘的結點加入到和多項式中
pre->next=p;
else
pre->next=q;
}
void multipoly(node *ha,node *hb)
{ node *p,*q,*n,*m;
p=ha->next;
n=(node*)malloc(sizeof(node));
n->next=NULL;
while(p!=NULL)
{ m=(node*)malloc(sizeof(node));
for(q=hb->next;q;q=q->next)
{ m->coef=p->coef*q->coef;
m->exp=p->exp+q->exp;
m->next=NULL;
}
p=p->next;
polyadd(n,m);
}
printf("多項式的積是:\n");
print(n);
}
void main()
{
node *ha,*hb;
printf("請輸入多項式ha的系數與指數:\n");
ha=create();
print(ha);
printf("\n");
printf("請輸入多項式hb的系數與指數:\n");
hb=create();
print(hb);
printf("\n");
printf("多項式的和是:\n");
polyadd(ha,hb);
print(ha);
printf("\n");
multipoly(ha,hb);
}