一元多项式的数据结构设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Polyn q1,q2;
q1=p->next;
q2=q1->next;
while(q1->next){
free(q1);
q1=q2;//指针后移
q2=q2->next;
}
}
/*******************以下函数实现显示输出多项式**************** ***/
void PrintPolyn(Polyn P){
《数据结构》
课程设计报告
课程设计题目:一元多项式计算
学生姓名**
专业信息管理与信息系统
班级*******
指导教师***
****年*月**日
一、课程设计目的
数据结构课程与其他科目不同,具有较强的实践性,内容丰富且抽象,数据结构课程设计主要是将数据结构的理论知识应用于生产实践之中以达到提高学生解决问题能力的目的到提高学生解决问题能力的目的。
for(p=h->next;p;p=p->next) //恢复pb的系数
p->coef*=-1;
return pd;
}//SubtractPolyn
/*******************以下函数实现乘法*********************/
Polyn MultiplyPolyn(Polyn pa,Polyn pb){//求解并建立多项式a*b,返回其头指针(该函数实现乘法)
二、题目简介
一元多项式的表示在计算机内可以用链表来表示,为了节省存储空间,只存储多项式中系数非零的项。链表中的每一个结点存放多项式的一个系数非零项,它包含三个域,分别存放该项的系数、指数以及指向下一个多项式项结点的指针。创建一元多项式链表,对一元多项式的运算中会出现的各种可能情况进行分析,实现一元多项式的相加、相减、相乘操作。
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;
DestroyPolyn(pd);continue;
}
if(flag==4){
pf=MultiplyPolyn(pa,pb);
printf("多项式a*b:");PrintPolyn(pf);
DestroyPolyn(pf);continue;
}
if(flag==5) break;
if(flag<1||flag>5) printf("Error\n");continue;
}//while
printf("\n");
}//PrintPolyn
/*********************在下面的辅助乘法和加法运算****************/
int compare(Polyn a,Polyn b){
if(a&&b){
if(!b||a->expn>b->expn) return 1;
Insert(p,head); //调用Insert函数插入结点
}
return head;
}//CreatePolyn
/**********************以下函数实现多项式的销毁**********************/
void DestroyPolyn(Polyn p){//销毁多项式p
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);
pf=(Polyn)malloc(sizeof(struct Polynomial));
pf->coef=qa->coef*qb->coef;
pf->expn=qa->expn+qb->expn;
Insert(pf,hf);//调用Insert函数以合并指数相同的项
}
}
return hf;
}//MultiplyPolyn
通过分析多项式的特征,不难看出多项式是由单项式构成的,而每个单项式都具有系数和指数,当系数为0时,该项就失去了意义,在计算机内要表示一个多项式,至少以下数据信息:系数信息、指数信息和指向下一个单项式的指针。通过指针,我们就可以把多个单项式连接起来,形式一个多项式,需要说明的是从广义的角度讲,单项式也是一个多项式。
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));//建立头结点
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(flag==2){
pc=AddPolyn(pa,pb);
printf("多项式a+b:");PrintPolyn(pc);
DestroyPolyn(pc);continue;
}
if(flag==3){
pd=SubtractPolyn(pa,pb);
printf("多项式a-b:");PrintPolyn(pd);
}
}//switch
if(qc->coef!=0){
qc->next=hc->next;
hc->next=qc;
hc=qc;
}
else free(qc);//当相加系数为0时,释放该结点
}//while
return headc;
}//AddPolyn
/********************以下函数实现减法***********************/
三、流程图
四、程序清单和运行结果
#include<stdio.h>
#include<malloc.h>
/******************************************************/
typedef struct Polynomial{
fFra Baidu bibliotekoat coef;//系数
int expn;//指数
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多项式非空
}//compare
/*********************以下函数实现加法*********************/
q2->coef+=p->coef;
free(p);
if(!q2->coef){ //系数为0的话释放结点
q1->next=q2->next;
free(q2);
}
}
else{ //指数为新时将结点插入
p->next=q2;
q1->next=p;
}
}
}//Insert
/*********************以下函数实现建立一个多项式****************/
printf("\t4.计算多项式a*b的值\n\t5.退出\n");
for(;;flag=0){
printf("\n");
scanf("%d",&flag);
if(flag==1){
printf("多项式a:");PrintPolyn(pa);
printf("多项式b:");PrintPolyn(pb);continue;
struct Polynomial *next;//指向下一个结点
}*Polyn,Polynomial; //Polyn为结点指针类型
/**********************************************************/
void Insert(Polyn p,Polyn h){
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);
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的普通情况
Polyn CreatePolyn(Polyn head,int m){//建立一个头指针为head、项数为m的一元多项式
//在主程序初始时,先输入的多项式中的项数m、n在这里为m。主程序中的pa、pb在此为head
int i;//用来计数
Polyn p;//定义一个p链表
p=head=(Polyn)malloc(sizeof(struct Polynomial));
/********************主函数实现显示与功能选择**********************/
int main(){
int m,n,flag=0;//m、n为分别为a、b两个多项式的项数
Polyn pa=0,pb=0,pc,pd,pf;//定义各式的头指针,pa与pb在使用前付初值NULL
if(p->coef==0) free(p); //系数为0的话释放结点
else{//如果系数不为0
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){ //将指数相同相合并
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++;
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){
//pc头指针所在的多项式用在加法中作为结果,pd用在加法中,pf乘法中
printf("****************欢迎使用一元多项式运算程序*****************\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\t1.输出多项式a和b\n\t2.建立多项式a+b\n\t3.建立多项式a-b\n");
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');
相关文档
最新文档