一元稀疏多项式计算器的课程设计(数据结构)

作者&投稿:寇骅 (若有异议请与网页底部的电邮联系)
数据结构课程设计(严蔚敏版) 一元稀疏多项式计算器~

我刚做的课程设计,完全符合你的要求,老师给我打了A+,包你满意!!!

//头文件
#include
#include
#include

//定义多项式的项
typedef struct Polynomial{
float coef;
int expn;
struct Polynomial *next;
}*Polyn,Polynomial;

void Insert(Polyn p,Polyn h){
if(p->coef==0) free(p);//系数为0的话释放结点
else
{
Polyn q1,q2;
q1=h;
q2=h->next;
while(q2&&p->expnexpn)
{//查找插入位置
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;
}
}
}

Polyn CreatePolyn(Polyn head,int m){
//建立一个头指针为head、项数为m的一元多项式
int i;
Polyn p;
p=head=(Polyn)malloc(sizeof(struct Polynomial));
head->next=NULL;
for(i=0;i<m;i++)
{
p=(Polyn)malloc(sizeof(struct Polynomial));//建立新结点以接收数据
printf("请输入第%d项的系数与指数:",i+1);
scanf("%f %d",&p->coef,&p->expn);
Insert(p,head); //调用Insert函数插入结点
}
return head;
}

void DestroyPolyn(Polyn p){
//销毁多项式p
Polyn q1,q2;
q1=p->next;
q2=q1->next;
while(q1->next)
{
free(q1);
q1=q2;
q2=q2->next;
}
}

void PrintPolyn(Polyn P){
Polyn q=P->next;
int flag=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');
else if(q->expn) printf("X^%d",q->expn);
}
else
{
if(q->coef==1)
{
if(!q->expn) putchar('1');
else if(q->expn==1) putchar('X');
else printf("X^%d",q->expn);
}
if(q->coef==-1)
{
if(!q->expn) printf("-1");
else if(q->expn==1) printf("-X");
else printf("-X^%d",q->expn);
}
}
q=q->next;
flag++;
}
printf("
");
}

int compare(Polyn a,Polyn b){
if(a&&b)
{
if(!b||a->expn>b->expn) return 1;
else if(!a||a->expnexpn) return -1;
else return 0;
}
else if(!a&&b) return -1;//a多项式已空,但b多项式非空
else return 1;//b多项式已空,但a多项式非空
}

Polyn AddPolyn(Polyn pa,Polyn pb){//求解并建立多项式a+b,返回其头指针
Polyn qa=pa->next;
Polyn qb=pb->next;
Polyn headc,hc,qc;
hc=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点
hc->next=NULL;
headc=hc;
while(qa||qb)
{
qc=(Polyn)malloc(sizeof(struct Polynomial));
switch(compare(qa,qb)){
case 1:
{
qc->coef=qa->coef;
qc->expn=qa->expn;
qa=qa->next;
break;
}
case 0:
{
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;
}
else free(qc);//当相加系数为0时,释放该结点
}
return headc;
}

Polyn SubtractPolyn(Polyn pa,Polyn pb){//求解并建立多项式a-b,返回其头指针
Polyn h=pb;
Polyn p=pb->next;
Polyn pd;
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;
return pd;
}

int ValuePolyn(Polyn head,int x){
//输入x值,计算并返回多项式的值
Polyn p;
int i;
int sum=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;
}
return sum;
}

Polyn Derivative(Polyn head){
//求解并建立导函数多项式,并返回其头指针
Polyn q=head->next,p1,p2,hd;
hd=p1=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点
hd->next=NULL;
while(q)
{
if(q->expn!=0)
{ //该项不是常数项时
p2=(Polyn)malloc(sizeof(struct Polynomial));
p2->coef=q->coef*q->expn;
p2->expn=q->expn-1;
p2->next=p1->next;//连接结点
p1->next=p2;
p1=p2;
}
q=q->next;
}
return hd;
}

Polyn MultiplyPolyn(Polyn pa,Polyn pb){
//求解并建立多项式a*b,返回其头指针
Polyn hf,pf;
Polyn qa=pa->next;
Polyn qb=pb->next;
hf=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点
hf->next=NULL;
for(;qa;qa=qa->next)
{
for(qb=pb->next;qb;qb=qb->next)
{
pf=(Polyn)malloc(sizeof(struct Polynomial));
pf->coef=qa->coef*qb->coef;
pf->expn=qa->expn+qb->expn;
Insert(pf,hf);//调用Insert函数以合并指数相同的项
}
}
return hf;
}

void main()
{
int m,n,a,x;
char flag;
Polyn pa=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的值计算a F:代入x的值计算b *
");
printf(" * *
");
printf(" * G:输出a+b H:输出a-b *
");
printf(" * *
");
printf(" * I:输出a*b J:退出程序 *
");
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
#include
#include

//定义项式项
typedef struct Polynomial
{
float coef;
int expn;
struct Polynomial *next;
}*Polyn,Polynomial;

void Insert(Polyn p,Polyn h)
{
if(p->coef==0) free(p);//系数0释放结点
else
{
Polyn q1,q2;
q1=h;
q2=h->next;
while(q2&&p->expnexpn)
{
//查找插入位置
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;
}
}
}

Polyn CreatePolyn(Polyn head,int m)
{
//建立指针head、项数m元项式
int i;
Polyn p;
p=head=(Polyn)malloc(sizeof(struct Polynomial));
head->next=NULL;
for(i=0; i<m; i++)
{
p=(Polyn)malloc(sizeof(struct Polynomial));//建立新结点接收数据
printf("请输入第%d项系数与指数:",i+1);
scanf("%f %d",&p->coef,&p->expn);
Insert(p,head); //调用Insert函数插入结点
}
return head;
}

void DestroyPolyn(Polyn p)
{
//销毁项式p
Polyn q1,q2;
q1=p->next;
q2=q1->next;
while(q1->next)
{
free(q1);
q1=q2;
q2=q2->next;
}
}

void PrintPolyn(Polyn P)
{
Polyn q=P->next;
int flag=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');
else if(q->expn) printf("X^%d",q->expn);
}
else
{
if(q->coef==1)
{
if(!q->expn) putchar('1');
else if(q->expn==1) putchar('X');
else printf("X^%d",q->expn);
}
if(q->coef==-1)
{
if(!q->expn) printf("-1");
else if(q->expn==1) printf("-X");
else printf("-X^%d",q->expn);
}
}
q=q->next;
flag++;
}
printf("
");
}

int compare(Polyn a,Polyn b)
{
if(a&&b)
{
if(!b||a->expn>b->expn) return 1;
else if(!a||a->expnexpn) return -1;
else return 0;
}
else if(!a&&b) return -1;//a项式已空b项式非空
else return 1;//b项式已空a项式非空
}

Polyn AddPolyn(Polyn pa,Polyn pb) //求解并建立项式a+b返其指针
{
Polyn qa=pa->next;
Polyn qb=pb->next;
Polyn headc,hc,qc;
hc=(Polyn)malloc(sizeof(struct Polynomial));//建立结点
hc->next=NULL;
headc=hc;
while(qa||qb)
{
qc=(Polyn)malloc(sizeof(struct Polynomial));
switch(compare(qa,qb))
{
case 1:
{
qc->coef=qa->coef;
qc->expn=qa->expn;
qa=qa->next;
break;
}
case 0:
{
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;
}
else free(qc);//相加系数0释放该结点
}
return headc;
}

Polyn SubtractPolyn(Polyn pa,Polyn pb) //求解并建立项式a-b返其指针
{
Polyn h=pb;
Polyn p=pb->next;
Polyn pd;
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;
return pd;
}

int ValuePolyn(Polyn head,int x)
{
//输入x值计算并返项式值
Polyn p;
int i;
int sum=0,t;
for(p=head->next; p; p=p->next)
{
t=1;
for(i=p->expn; i!=0;)
{
if(i<0)
{
t/=x; //指数于0进行除
i++;
}
else
{
t*=x; //指数于0进行乘
i--;
}
}
sum+=p->coef*t;
}
return sum;
}

Polyn Derivative(Polyn head)
{
//求解并建立导函数项式并返其指针
Polyn q=head->next,p1,p2,hd;
hd=p1=(Polyn)malloc(sizeof(struct Polynomial));//建立结点
hd->next=NULL;
while(q)
{
if(q->expn!=0)
{
//该项数项
p2=(Polyn)malloc(sizeof(struct Polynomial));
p2->coef=q->coef*q->expn;
p2->expn=q->expn-1;
p2->next=p1->next;//连接结点
p1->next=p2;
p1=p2;
}
q=q->next;
}
return hd;
}

Polyn MultiplyPolyn(Polyn pa,Polyn pb)
{
//求解并建立项式a*b返其指针
Polyn hf,pf;
Polyn qa=pa->next;
Polyn qb=pb->next;
hf=(Polyn)malloc(sizeof(struct Polynomial));//建立结点
hf->next=NULL;
for(; qa; qa=qa->next)
{
for(qb=pb->next; qb; qb=qb->next)
{
pf=(Polyn)malloc(sizeof(struct Polynomial));
pf->coef=qa->coef*qb->coef;
pf->expn=qa->expn+qb->expn;
Insert(pf,hf);//调用Insert函数合并指数相同项
}
}
return hf;
}

void main()
{
int m,n,a,x;
char flag;
Polyn pa=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值计算a F:代入x值计算b *
");
printf(" * *
");
printf(" * G:输a+b H:输a-b *
");
printf(" * *
");
printf(" * I:输a*b J:退程序 *
");
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=%da=%d
",x,ValuePolyn(pa,x));
break;
}
case'F':
case'f':
{
printf("输入x值:x=");
scanf("%d",&x);
printf("
x=%db=%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<stdio.h>
#include<malloc.h>
#include<stdlib.h>

//定义多项式的项
typedef struct Polynomial{
    float coef;
    int expn;
    struct Polynomial *next;
}*Polyn,Polynomial;

void Insert(Polyn p,Polyn h){     
    if(p->coef==0) free(p);//系数为0的话释放结点
    else
 {
        Polyn q1,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;
  }
 }
}

Polyn CreatePolyn(Polyn head,int m){
 //建立一个头指针为head、项数为m的一元多项式
    int i;
    Polyn p;
    p=head=(Polyn)malloc(sizeof(struct Polynomial));
    head->next=NULL;
    for(i=0;i<m;i++)
 {
        p=(Polyn)malloc(sizeof(struct Polynomial));//建立新结点以接收数据
        printf("请输入第%d项的系数与指数:",i+1);
        scanf("%f %d",&p->coef,&p->expn);
        Insert(p,head);   //调用Insert函数插入结点
 }
    return head;
}

void DestroyPolyn(Polyn p){
 //销毁多项式p
    Polyn q1,q2;
    q1=p->next;
    q2=q1->next;
    while(q1->next)
 {
        free(q1);
        q1=q2;
        q2=q2->next;
 }
}

void PrintPolyn(Polyn P){
 Polyn q=P->next; 
    int flag=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');
            else if(q->expn) printf("X^%d",q->expn);
  }
        else
  {
            if(q->coef==1)
   {
                if(!q->expn) putchar('1'); 
                else if(q->expn==1) putchar('X'); 
                else printf("X^%d",q->expn);
   }
            if(q->coef==-1)
   {
                if(!q->expn) printf("-1"); 
                else if(q->expn==1) printf("-X"); 
                else printf("-X^%d",q->expn);
   }
  }
        q=q->next; 
        flag++;
 }
    printf("
");
}

int compare(Polyn a,Polyn b){
    if(a&&b)
 {
        if(!b||a->expn>b->expn) return 1;
        else if(!a||a->expn<b->expn) return -1;
        else return 0;
 }
    else if(!a&&b) return -1;//a多项式已空,但b多项式非空
    else return 1;//b多项式已空,但a多项式非空
}

Polyn AddPolyn(Polyn pa,Polyn pb){//求解并建立多项式a+b,返回其头指针
    Polyn qa=pa->next;
    Polyn qb=pb->next;
    Polyn headc,hc,qc;
    hc=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点
    hc->next=NULL;
    headc=hc;
    while(qa||qb)
 {
        qc=(Polyn)malloc(sizeof(struct Polynomial));
        switch(compare(qa,qb)){
        case 1:
   {
                qc->coef=qa->coef;
                qc->expn=qa->expn;
                qa=qa->next;
                break;
   }
        case 0:
   { 
                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;
  }
    else free(qc);//当相加系数为0时,释放该结点
 }
    return headc;
}

Polyn SubtractPolyn(Polyn pa,Polyn pb){//求解并建立多项式a-b,返回其头指针
    Polyn h=pb;
    Polyn p=pb->next;
    Polyn pd;
    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;
    return pd;
}

int ValuePolyn(Polyn head,int x){
 //输入x值,计算并返回多项式的值
    Polyn p;
    int i;
    int sum=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;
 }
    return sum;
}

Polyn Derivative(Polyn head){
 //求解并建立导函数多项式,并返回其头指针
    Polyn q=head->next,p1,p2,hd;
    hd=p1=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点
    hd->next=NULL;
    while(q)
 {
        if(q->expn!=0)
  {               //该项不是常数项时
            p2=(Polyn)malloc(sizeof(struct Polynomial));
            p2->coef=q->coef*q->expn;
            p2->expn=q->expn-1;
            p2->next=p1->next;//连接结点
            p1->next=p2;
            p1=p2;
  }
        q=q->next;
 }
    return hd;
}

Polyn MultiplyPolyn(Polyn pa,Polyn pb){
 //求解并建立多项式a*b,返回其头指针
    Polyn hf,pf;
    Polyn qa=pa->next;
    Polyn qb=pb->next;
    hf=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点
    hf->next=NULL;
    for(;qa;qa=qa->next)
 {
        for(qb=pb->next;qb;qb=qb->next)
  {
            pf=(Polyn)malloc(sizeof(struct Polynomial));
            pf->coef=qa->coef*qb->coef;
            pf->expn=qa->expn+qb->expn;
            Insert(pf,hf);//调用Insert函数以合并指数相同的项
  }
 }
    return hf;
}

void main()
{
    int m,n,a,x;
 char flag;
    Polyn pa=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的值计算a          F:代入x的值计算b   *
");
    printf("   *                                                      *
");
    printf("   *           G:输出a+b                H:输出a-b          *
");
    printf("   *                                                      *
");
    printf("   *           I:输出a*b                J:退出程序         *
");
    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("
       您的选择错误,请重新选择!
");
  }
 }
}

把楼上的回答用代码格式重新排版了一下,方便阅读



我刚做好的课程设计,得了个A+,免费给你了,包你满意,几乎没有漏洞!
//头文件
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

//定义多项式的项
typedef struct Polynomial{
float coef;
int expn;
struct Polynomial *next;
}*Polyn,Polynomial;

void Insert(Polyn p,Polyn h){
if(p->coef==0) free(p);//系数为0的话释放结点
else
{
Polyn q1,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;
}
}
}

Polyn CreatePolyn(Polyn head,int m){
//建立一个头指针为head、项数为m的一元多项式
int i;
Polyn p;
p=head=(Polyn)malloc(sizeof(struct Polynomial));
head->next=NULL;
for(i=0;i<m;i++)
{
p=(Polyn)malloc(sizeof(struct Polynomial));//建立新结点以接收数据
printf("请输入第%d项的系数与指数:",i+1);
scanf("%f %d",&p->coef,&p->expn);
Insert(p,head); //调用Insert函数插入结点
}
return head;
}

void DestroyPolyn(Polyn p){
//销毁多项式p
Polyn q1,q2;
q1=p->next;
q2=q1->next;
while(q1->next)
{
free(q1);
q1=q2;
q2=q2->next;
}
}

void PrintPolyn(Polyn P){
Polyn q=P->next;
int flag=1;//项数计数器
if(!q)
{ //若多项式为空,输出0
putchar('0');
printf("\n");
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');
else if(q->expn) printf("X^%d",q->expn);
}
else
{
if(q->coef==1)
{
if(!q->expn) putchar('1');
else if(q->expn==1) putchar('X');
else printf("X^%d",q->expn);
}
if(q->coef==-1)
{
if(!q->expn) printf("-1");
else if(q->expn==1) printf("-X");
else printf("-X^%d",q->expn);
}
}
q=q->next;
flag++;
}
printf("\n");
}

int compare(Polyn a,Polyn b){
if(a&&b)
{
if(!b||a->expn>b->expn) return 1;
else if(!a||a->expn<b->expn) return -1;
else return 0;
}
else if(!a&&b) return -1;//a多项式已空,但b多项式非空
else return 1;//b多项式已空,但a多项式非空
}

Polyn AddPolyn(Polyn pa,Polyn pb){//求解并建立多项式a+b,返回其头指针
Polyn qa=pa->next;
Polyn qb=pb->next;
Polyn headc,hc,qc;
hc=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点
hc->next=NULL;
headc=hc;
while(qa||qb)
{
qc=(Polyn)malloc(sizeof(struct Polynomial));
switch(compare(qa,qb)){
case 1:
{
qc->coef=qa->coef;
qc->expn=qa->expn;
qa=qa->next;
break;
}
case 0:
{
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;
}
else free(qc);//当相加系数为0时,释放该结点
}
return headc;
}

Polyn SubtractPolyn(Polyn pa,Polyn pb){//求解并建立多项式a-b,返回其头指针
Polyn h=pb;
Polyn p=pb->next;
Polyn pd;
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;
return pd;
}

int ValuePolyn(Polyn head,int x){
//输入x值,计算并返回多项式的值
Polyn p;
int i;
int sum=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;
}
return sum;
}

Polyn Derivative(Polyn head){
//求解并建立导函数多项式,并返回其头指针
Polyn q=head->next,p1,p2,hd;
hd=p1=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点
hd->next=NULL;
while(q)
{
if(q->expn!=0)
{ //该项不是常数项时
p2=(Polyn)malloc(sizeof(struct Polynomial));
p2->coef=q->coef*q->expn;
p2->expn=q->expn-1;
p2->next=p1->next;//连接结点
p1->next=p2;
p1=p2;
}
q=q->next;
}
return hd;
}

Polyn MultiplyPolyn(Polyn pa,Polyn pb){
//求解并建立多项式a*b,返回其头指针
Polyn hf,pf;
Polyn qa=pa->next;
Polyn qb=pb->next;
hf=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点
hf->next=NULL;
for(;qa;qa=qa->next)
{
for(qb=pb->next;qb;qb=qb->next)
{
pf=(Polyn)malloc(sizeof(struct Polynomial));
pf->coef=qa->coef*qb->coef;
pf->expn=qa->expn+qb->expn;
Insert(pf,hf);//调用Insert函数以合并指数相同的项
}
}
return hf;
}

void main()
{
int m,n,a,x;
char flag;
Polyn pa=0,pb=0,pc;

printf(" 欢迎使用多项式操作程序\n\n");
printf("请输入a的项数:");
scanf("%d",&m);
pa=CreatePolyn(pa,m);//建立多项式a
printf("请输入b的项数:");
scanf("%d",&n);
pb=CreatePolyn(pb,n);//建立多项式b

//输出菜单
printf(" *******************************************************\n");
printf(" * 多项式操作程序 *\n");
printf(" * *\n");
printf(" * A:输出多项式 B:输出多项式b *\n");
printf(" * *\n");
printf(" * C:输出a的导数 D:输出b的导数 *\n");
printf(" * *\n");
printf(" * E:代入x的值计算a F:代入x的值计算b *\n");
printf(" * *\n");
printf(" * G:输出a+b H:输出a-b *\n");
printf(" * *\n");
printf(" * I:输出a*b J:退出程序 *\n");
printf(" * *\n");
printf(" *******************************************************\n");

while(a)
{
printf("\n请选择操作:");
scanf(" %c",&flag);//空格符号一定要注意
switch(flag)
{

case'A':
case'a':
{
printf("\n 多项式a=");
PrintPolyn(pa);
break;
}
case'B':
case'b':
{
printf("\n 多项式b=");
PrintPolyn(pb);
break;
}
case'C':
case'c':
{
pc=Derivative(pa);
printf("\n 多项式a的导函数为:a'=");
PrintPolyn(pc);
break;
}
case'D':
case'd':
{
pc=Derivative(pb);
printf("\n 多项式b的导函数为:b'=");
PrintPolyn(pc);
break;
}
case'E':
case'e':
{
printf("输入x的值:x=");
scanf("%d",&x);
printf("\n x=%d时,a=%d\n",x,ValuePolyn(pa,x));
break;
}
case'F':
case'f':
{
printf("输入x的值:x=");
scanf("%d",&x);
printf("\n x=%d时,b=%d\n",x,ValuePolyn(pb,x));
break;
}
case'G':
case'g':
{
pc=AddPolyn(pa,pb);
printf("\n a+b=");
PrintPolyn(pc);
break;
}
case'H':
case'h':
{
pc=SubtractPolyn(pa,pb);
printf("\n a-b=");
PrintPolyn(pc);
break;
}
case'I':
case'i':
{
pc=MultiplyPolyn(pa,pb);
printf("\n a*b=");
PrintPolyn(pc);
break;
}
case'J':
case'j':
{
printf("\n 感谢使用此程序!\n");
DestroyPolyn(pa);
DestroyPolyn(pb);
a=0;
break;
}
default:
printf("\n 您的选择错误,请重新选择!\n");
}
}
}


设计一个一元稀疏多项式简单计算器。
一元稀疏多项式简单计算器的基本功能是:(1)输入并建立多项式;(2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,,,cn,en,其中n是多项式的项数,ci,ei,分别是第i项的系数和... 一元稀疏多项式简单计算器的基本功能是:(1) 输入并建立多项式;(2) 输出多项式,输出形式为整数序列:n,c1,e1, c2,e2,,, cn,en...

一元稀疏多项式计算器的课程设计(数据结构)
(2) 输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,...,Cn,en,其中n是多项式的相数,Ci和Ei分别是第i项的系数和指数,序列按指数降序排列 (3) 两个多项式相加,建立并输出和多项式 (4) 两个多项式相减,建立并输出差多项式 (5) 两个多项式相乘, 建立乘积多项式 (6) 计算多项式在x处的值 实现提示:用带...

一元稀疏多项式计算器 C语言编写
typedef struct list { int c; \/\/多项式的项数 int e; \/\/多项式的指数 struct list *next; \/\/下一结点 };typedef struct list *LinkList;typedef struct list Node;下面是线性表的操作相关函数声明,对应文件ListOper.h:\/\/File: ListOper.h ifndef DATASTRUCT define DATASTRUCT include...

求助C++编写———跳表的实现
1,输入并建立多项式;2,输出多项式,输出形式为整数序列:n,c1,e1,c2,c2,...,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;3,多项式a和b相加,建立多项式a+b;4,多项式a和b相减,建立多项式a-b.【测试数据】1,(2x+5x^8-3.1x^11)+(7-5x^8+11x^9...

数据结构要求做个多项式计算器 用C语言 哪位高人有代码谢谢
要求(不一定一模一样)一、问题描述在控制台下实现一个一元稀疏多项式的简易计算器。二、基本要求该计算器的基本功能如下:(1)多项式输入,输入格式如下:<系数><空格><指数><回车>以... 要求(不一定一模一样)一、问题描述 在控制台下实现一个一元稀疏多项式的简易计算器。二、基本要求 该计算器的基本功能如下:(...

如何用C语言实现一元多项式简单计算器的设计
\/*:---一元稀疏多项式计算(部分)--- 基本功能:(1)输入并建立多项式;(2)多项式输出,以 c1,e1,c2,e2,...输出 其中ci为系数,ei为指数;(3)多项式相加,c=a+b。说明: (1)多项式一指数升序排序,但输入时不检查;(2)以带头指针的单链表存储。---*\/ define OK 1 define FAILE 0 defin...

一元多项式计算器 (1)设Pn(x)和Qm(x)分别为两个一元多项式,利用单链表...
void createPolyList(PolyList *L){\/\/创建多项式 (*L) = (PolyList)malloc(sizeof(PolyNode));(*L)->next = NULL;r=(*L);int xs,zs;scanf("%d %d",&xs,&zs);while(xs!=0){ \/\/生成新节点;p = (PolyList)malloc(sizeof(PolyNode));p->next = NULL;p->xs = xs;p->zs =...

编写一元多项式的计算器程序
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;...

如何用matlab求解多项式方程?
【matlab计算代码】clc,clear all 步骤1:p=[4,-18,28,-18,4]; ← 多项式方程系数 p = p(:).'; ← 矩阵转置 步骤2:n = size(p,2); ← 求p的个数 inz = find(p); ← 查找各系数p的位置 fullPrototype = full(zeros('like',p)); ← 将稀疏矩阵 p 转换为满存储结构 nn...

MATLAB入门与实战的目录
第1章基础准备及入门1.1认识MATLAB1.1.1MATLAB的历史1.1.2MATLAB的主要功能1.1.3MATLAB7.0新增功能1.2视窗下的MATLAB环境1.2.1Desktop简介1.2.2CommandWindow运行入门1.2.3CommandWindow简介1.2.4最简单的计算器使用法1.2.5数值、变量和表达式1.2.6计算结果的图形表示1.3CommandWindow操作...

延寿县18934723637: 数据结构课程设计(C语言版) 一元稀疏多项式的运算 -
纵君普济: 数据关系:R=约定a1为栈底,an 为栈顶.基本操作:Push(&s,e) 初始条件:栈s已经存在.操作结果:插入元素e为新的栈顶元素 Pop(&s,&e) 初始条件:栈s已经存在且非空. 操作结果:删除s的栈顶元素,并用e返回其值

延寿县18934723637: 基本内容:设计一个一元稀疏多项式简单计算器.输入并建立多项式、按指数降序输出多项式、多项式相加、多 -
纵君普济: #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 ...

延寿县18934723637: 数据结构课程设计报告 -
纵君普济: 1、一元稀疏多项式相加详细设计4.1 程序头的设计: #include<stdio.h> #include<malloc.h> typedef struct pnode {int coef;/*系数 */ int exp;/*指数 */ struct pnode *next;/*下一个指针*/ }pnode;4.2 用头插法生成一个多项式,系数和...

延寿县18934723637: 计算一元稀疏多项式 -
纵君普济: 这是我以前做的数据结构课程设计,加减乘除、求值、求导等功能.希望可以帮上你的忙.#include<stdio.h>#include<malloc.h> typedef struct Polynomial{ float coef; int expn; struct Polynomial *next; }*Polyn,Polynomial; //Polyn为结点指针类型 void...

延寿县18934723637: 如何用C语言实现一元多项式简单计算器的设计
纵君普济: /*:--------------一元稀疏多项式计算(部分)--------------* * 基本功能:(1)输入并建立多项式; * * (2)多项式输出,以 c1,e1,c2,e2,...输出 * * 其中ci为系数,ei为指数; * * (3)多项式相加,c=a+b. * * 说明: (1)多项式一指数升序排序,...

延寿县18934723637: 数据结构课程设计 -- 一元多项式计算 -
纵君普济: #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(...

延寿县18934723637: 要求从键盘输入10个数,在屏幕上输出排序结果. 起泡法排序. 选择法排序.2种方法求解!! -
纵君普济: 、一元稀疏多项式相加 设计一个一元多项式加法器.实现: (1)输入并建立多项式; (2)两个多项式相加; (3)输出多项式:n, c1, e1, c2, e2, …cn , en, 其中,n是多项式项数,ci和ei分别是第 i 项的系数和指数,序列按指数降序排列....

延寿县18934723637: 设计一个一元多项式简单的计算器(数据结构C语言版)急 -
纵君普济: 除以上功能外,还有乘法和除法的计算和导数计算呢.这是我以前做的数据结构课程设计.希望能帮上你的忙.#include<stdio.h>#include<malloc.h> typedef struct Polynomial{ float coef; int expn; struct Polynomial *next; }*Polyn,Polynomial; //Polyn...

延寿县18934723637: 求高手帮帮忙:关于数据结构课程设计的问题描述:设有两个带表头的单链表表示两个一元稀疏多项式A、B,实现两个一元稀疏多项式的处理.实现要求:⑴ ... -
纵君普济:[答案] struct elem{ int coef; int exp; elem *next; };//class LinkList{ public: LinkList( ); //建立只有头结点的空链表 LinkList(elem a[], int n); //建立有n个元素的单链表 friend void printlist(LinkL...

延寿县18934723637: 数据结构一元多项式的代数运算 -
纵君普济: //多项式相加(用单链表实现,用尾插法建表,用墨守成连线法求新的多项式) #include<stdio.h> #include<stdlib.h> typedef struct LNode //单链表的结构 {int coef,exp;struct LNode *next; }LNode,*LinkList;void InitList(LinkList &L) //单链表的初始...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网