数据结构C语言一元稀疏多项式计算器.docx

上传人:b****5 文档编号:2898971 上传时间:2022-11-16 格式:DOCX 页数:15 大小:20.12KB
下载 相关 举报
数据结构C语言一元稀疏多项式计算器.docx_第1页
第1页 / 共15页
数据结构C语言一元稀疏多项式计算器.docx_第2页
第2页 / 共15页
数据结构C语言一元稀疏多项式计算器.docx_第3页
第3页 / 共15页
数据结构C语言一元稀疏多项式计算器.docx_第4页
第4页 / 共15页
数据结构C语言一元稀疏多项式计算器.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

数据结构C语言一元稀疏多项式计算器.docx

《数据结构C语言一元稀疏多项式计算器.docx》由会员分享,可在线阅读,更多相关《数据结构C语言一元稀疏多项式计算器.docx(15页珍藏版)》请在冰豆网上搜索。

数据结构C语言一元稀疏多项式计算器.docx

数据结构C语言一元稀疏多项式计算器

实验报告一

题目:

编制一个一元稀疏多项式计算器

班级:

*******姓名:

王雪学号:

130****8030完成日期:

2014.4.5

一、需求分析

1、一元稀疏多项式简单计算器的功能是:

1.1输入并建立多项式;

1.2输出多项式,输出形式为整数序列:

n,c1,e1,c2,e2,………cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;

1.3多项式a和b相加,建立多项式a+b;

1.4多项式a和b相减,建立多项式a-b。

2、设计思路:

2.1定义线性表的动态分配顺序存储结构;

2.2建立多项式存储结构,定义指针*next

2.3利用链表实现队列的构造。

每次输入一项的系数和指数,可以输出构造的一元多项式

2.4演示程序以用户和计算机的对话方式执行,即在计算机终站上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运行命令;最后根据相应的输入数据(滤去输入中的非法字符)建立的多项式以及多项式相加的运行结果在屏幕上显示。

多项式显示的格式为:

c1x^e1+c2x^e2+…+cnx^en

3、设计思路分析

要解决多项式相加,必须要有多项式,所以必须首先建立两个多项式,在这里采用链表的方式存储链表,所以我将结点结构体定义为

序数coef

指数expn

指针域next

运用尾插法建立两条单链表,以单链表polynp和polynh分别表示两个一元多项式a和b,a+b的求和运算等同于单链表的插入问题(将单链表polynp中的结点插入到单链表polynh中),因此“和多项式”中的结点无须另生成。

为了实现处理,设p、q分别指向单链表polya和polyb的当前项,比较p、q结点的指数项,由此得到下列运算规则:

①若p->expnexpn,则结点p所指的结点应是“和多项式”中的一项,令指针p后移。

②若p->expn=q->expn,则将两个结点中的系数相加,当和不为0时修改结点p的系数。

③若p->expn>q->expn,则结点q所指的结点应是“和多项式”中的一项,将结点q插入在结点p之前,且令指针q在原来的链表上后移。

二、概要设计

为实现上述程序的功能,应以带头结点的单链表表示多项式。

为此,需要一个抽象数据类型:

单链表。

2.1单链表的抽象数据类型定义

ADTLinkList{

数据对象:

D={ai|ai∈TermSet,i=1,2,…,m,m≥0

TermSet中的每个元素包含一个表示系数的实数和表示指数的整数}

数据关系:

R1={ai-1,ai∈D且ai-1中的指数值

基本操作:

CreatLinkList(&p,m)

操作结果:

输入m项的系数和指数,建立一元多项式p。

DestoryLinkList(&p)

初始条件:

一元多项式p已存在。

操作结果:

销毁一元多项式p.

PrintLinkList(p)

初始条件:

一元多项式p已存在。

操作结果:

打印输出一元多项式p.

AddLinkList(&pa,&pb)

初始条件:

一元多项式pa和pb已存在。

操作结果:

完成多项式的相加运算,即:

pa=pa+pb,并销毁一元多项式pb.

SubtractLinkList(&pa,&pb)

初始条件:

一元多项式pa和pb已存在。

操作结果:

完成多项式的想减运算,即:

pa=pa-pb,并销毁一元多项式pb.

}ADTLinkList

2.2本程序包括个模块:

1)主程序模块:

Voidmain(){

初始化;

输出菜单;

While

(1){

接受命令;

处理命令;

}(循环一直为真直至接受退出命令);

2)单链表单元模块——实现单链表的抽象数据类型;

3)结点结构单元模块——定义单链表的结点结构。

三、详细设计

3.1元素类型、结点类型和指针类型

typedefintStatus;

typedefintElemType;

typedefstructLNode{

  float   coef;                    //系数

  ElemType expn;                 //指数

  struct  LNode*next;           

}LNode,*LinkList;

StatusMakeNode(LinkList&p,LinkListhead)

{//分配由p指向下一个多项式的头结点head、后继为空的结点,并返回TRUE,

//若分配失败,则返回FALSE

p=(LinkList)malloc(sizeof(structLNode));

if(!

p)returnfalse;

p=head;p->next=null;returnture;

voidFreeNode(LinkList&p)

{//释放p所指结点

free(q1);

      q1=q2;

      q2=q2->next;

}

3.2单链表的基本操作设置如下:

voidInsert(LinkListp,LinkListh);

//将节点p插入到多项式链表h

LinkListCreateLinkList(LinkListhead,intm);

//建立一个头指针为head、项数为m的一元多项式,并返回该多项式的头结点;

//若分配空间失败,则返回FALSE

voidDestroyLinkList(LinkListp);

 //销毁多项式p

voidPrintLinkList(LinkListP);

//输出构造的一元多项式P

Statuscompare(LinkLista,LinkListb)

//节点进行比较:

a的指数>b的指数 return1;a的指数==b的指数 return0;

a的指数

LinkListAddLinkList(LinkListpa,LinkListpb)

//求解并建立多项式a+b,返回其头指针

LinkListSubtractLinkList(LinkListpa,LinkListpb)

//求解并建立多项式a-b,返回其头指针

其中部分操作的伪码如下:

LinkListCreateLinkList(LinkListhead,intm)

{

 p=head=(LinkList)malloc(sizeof(structLNode));

  head->next=NULL;

  for(i=0;i

 {

      p=(LinkList)malloc(sizeof(structLNode)); //建立新结点以接收数据

      printf("请输入第%d项的系数与指数:

",i+1);

      scanf("%f%d",&p->coef,&p->expn);

      Insert(p,head);                           //调用Insert函数插入结点

 }

  returnhead;

}//CreateLinkList

Statuscompare(LinkLista,LinkListb){

  if(a&&b){

      if(!

b||a->expn>b->expn)return1;

      elseif(!

a||a->expnexpn)return-1;

      elsereturn0;}

  elseif(!

a&&b)return-1;//a多项式已空,但b多项式非空

  elsereturn1;//b多项式已空,但a多项式非空

}//compare

floatValueLinkList(LinkListhead,intx){ //输入x值,计算并返回多项式的值

    for(p=head->next;p;p=p->next){

      t=1;for(i=p->expn;i!

=0;)     //i为指数的系数pow(x,i)

 {if(i<0){t/=x;i++;}     //指数小于0,进行除法

          else{t*=x;i--;}  }//指数大于0,进行乘法      sum+=p->coef*t;

 }returnsum;}//ValueLinkList

LinkListMultiplyLinkList(LinkListpa,LinkListpb){//求解并建立多项式a*b,返回其头指针

   LinkListqa=pa->next;

  LinkListqb=pb->next;

  hf=(LinkList)malloc(sizeof(structLNode));//建立头结点

  hf->next=NULL;

  for(;qa;qa=qa->next) {for(qb=pb->next;qb;qb=qb->next)

 {pf=(LinkList)malloc(sizeof(structLNode));

          pf->coef=qa->coef*qb->coef;

          pf->expn=qa->expn+qb->expn;

          Insert(pf,hf);}//调用Insert函数以合并指数相同的项

  }returnhf;}//MultiplyLinkList

3.3主函数和其他函数的伪码算法

voidmain(){//主函数

Initiation(); //多项式初始化

   PrintCommand();//输出菜单

   while

(1){ //循环一直为真知道选择j||J即退出命令时,程序退出

      printf("\n请选择操作:

");

      scanf("%c",&flag);      Interpter(flag); //具体的操作命令

 }}  //main

voidInitiation()

{

   printf("请输入a的项数:

");

  scanf("%d",&m);

  pa=CreateLinkList(pa,m);//建立多项式a

  printf("请输入b的项数:

");

  scanf("%d",&n);

  pb=CreateLinkList(pb,n);//建立多项式b

 printf("多项式已创建\n");

}//Initiation

voidPrintCommand(){ //输出菜单

显示键入命令的提示信息;

Printf(’A’,’B’,’C’,’D’,’E’);

}//PrintCommand

 voidInterpter(charflag){ //具体的操作命令

 switch(flag)

 {case'A':

case'a':

{PrintLinkList(pa);break;}

case'B':

case'b':

{PrintLinkList(pb);break;}

case'C':

case'c':

 {AddLinkList(pa,pb)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 调查报告

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1