实验报告2一元稀疏多项式计算器.docx
- 文档编号:6138920
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:12
- 大小:121.75KB
实验报告2一元稀疏多项式计算器.docx
《实验报告2一元稀疏多项式计算器.docx》由会员分享,可在线阅读,更多相关《实验报告2一元稀疏多项式计算器.docx(12页珍藏版)》请在冰豆网上搜索。
实验报告2一元稀疏多项式计算器
华北水利水电学院一元稀疏多项式计算器实验报告
2010~2011学年第一学期09级计算机科学与技术专业
班级:
2009119学号:
200911902姓名:
万婷婷
一、实验目的
设计一个医院稀疏多项式简单计算器
熟练掌握线性表的基本操作在两种存储结构上的实现,其中以各种链表的操作和应用
二、实验要求
a)输入并建立多项式
b)输出多项式,输出形式为整数序列:
n,c1,e1,c2,e2……cn,en,其中n是多项式的项数,ci,ei分别为第i项的系数和指数。
序列按指数降序排列。
c)多项式a和b相加,建立多项式a+b,输出相加的多项式。
d)多项式a和b相减,建立多项式a-b,输出相减的多项式。
用带表头结点的单链表存储多项式。
测试数据:
(1)(2x+5x8-3.1x11)+(7-5x8+11x9)
(2)(6x-3-x+4.4x2-1.2x9)-(-6x-3+5.4x2+7.8x15)
(3)(1+x+x2+x3+x4+x5)+(-x3-x4)
(4)(x+x2+x3)+0
(5)(x+x3)-(-x-x-3)
(6)(x+x2+x3)+0
三、实验内容
主要算法设计
typedefstructNode
{
floatcoef;
intindex;
structNode*next;
}LinkList;
本程序涉及到多项式的建立、多项式的输出、两个多项式的相加减。
用带头结点的单链表存储多项式;
程序中共定义了5个函数:
voidInsert(LinkList*p,LinkList*h)//把节点p插入到链表h中
LinkList*Creat_L(LinkList*head,intm)//创建一个链表,项数为m
voidPrintf(LinkList*L)
LinkList*ADDlist(LinkList*head,LinkList*pb)
LinkList*MinusList(LinkList*head,LinkList*pb)
四、程序源代码
#include
#include
#include
#include
typedefstructNode
{
floatcoef;
intindex;
structNode*next;
}LinkList;
voidInsert(LinkList*p,LinkList*h)//把节点p插入到链表h中
{
LinkList*q1,*q2;
intflag=0;
q1=h;
if(p->coef==0)
free(p);
else
{
if(q1->next==NULL)
{
q1->next=p;
}
else
{
q2=q1->next;
while(flag==0)
{
if(p->index
{
if(q2->next==NULL)
{
q2->next=p;
flag=1;
}
else
{
q1=q2;
q2=q2->next;
}
}
else
if(p->index>q2->index)
{
p->next=q2;
q1->next=p;
flag=1;
}
else
{
q2->coef=p->coef+q2->coef;
if(q2->coef==0)
{
q1->next=q2->next;
free(q2);
}
flag=1;
free(p);
}
}
}
}
}
LinkList*Creat_L(LinkList*head,intm)//创建一个链表,项数为m
{
inti;
LinkList*q;
head=(LinkList*)malloc(sizeof(LinkList));
head->next=NULL;
for(i=1;i<=m;i++)
{
q=(LinkList*)malloc(sizeof(LinkList));
q->next=NULL;
printf("请输入第%d项的系数和指数:
",i);
scanf("%f,%d",&q->coef,&q->index);
Insert(q,head);
}
returnhead;
}
voidPrintf(LinkList*L)
{
LinkList*p,*q,*pa;
inti=0;
p=L->next;
q=L->next;
if(p==NULL)
{
printf("0\n");
return;
}
while(p)
{
p=p->next;
i++;
}
printf("%d,",i);
while(q)
{
printf("%g,",q->coef);
printf("%d,",q->index);
q=q->next;
}
}
LinkList*ADDlist(LinkList*head,LinkList*pb)
{
LinkList*pc;
intflag=0;
while(flag==0)
{
if(pb->next==NULL)
flag=1;
else
{
pb=pb->next;
pc=(LinkList*)malloc(sizeof(LinkList));
pc->coef=pb->coef;
pc->index=pb->index;
pc->next=NULL;
Insert(pc,head);
}
}
returnhead;
}
LinkList*MinusList(LinkList*head,LinkList*pb)
{
LinkList*pc;
intflag=0;
while(flag==0)
{
if(pb->next==NULL)
flag=1;
else
{
pb=pb->next;
pc=(LinkList*)malloc(sizeof(LinkList));
pc->coef=-pb->coef;
pc->index=pb->index;
pc->next=NULL;
Insert(pc,head);
}
}
returnhead;
}
voidmain()
{
inti,m,n;
LinkList*pa=0,*pb=0,*pc;
while
(1)
{
system("cls");
printf("................欢迎使用一元稀疏多项式计算器..............\n");
printf("请输入多项式a的项数:
");
scanf("%d",&m);
pa=Creat_L(pa,m);
printf("请输入多项式b的项数:
");
scanf("%d",&n);
pb=Creat_L(pb,n);
printf("................欢迎使用一元稀疏多项式计算器..............\n");
printf("0.退出系统\n");
printf("1.输出多项式a\n");
printf("2.输出多项式b\n");
printf("3.输出多项式a+b\n");
printf("4.输出多项式a-b\n");
while
(1)
{
printf("\n请选择操作:
");
scanf("%d",&i);
switch(i)
{
case0:
return;
case1:
{
printf("输出多项式a的整数序列为:
");
Printf(pa);
break;
}
case2:
{
printf("输出多项式b的整数序列为:
");
Printf(pb);
break;
}
case3:
{
pc=ADDlist(pa,pb);
printf("输出多项式a+b的整数序列为:
");
Printf(pc);
break;
}
case4:
{
pc=MinusList(pa,pb);
printf("输出多项式a-b的整数序列为:
");
Printf(pc);
break;
}
default:
printf("\n输入有误,请重新输入:
\n");
}
}
}
}
五、运行结果
六、小结(不少于100字)
虽然数据结构是一门公认的比较难的课程,自己学起来也觉得有些吃力,但在本次课程设计之前,我系统地把教科书复习了一遍,大大加深了对各种数据结构的理解,运用起来更加自如。
不断地翻阅各种参考书,以及在老师和同学的帮助下,基本上考虑到了所有的边界情况,反复测试各种类型的数据,强化程序的健壮性,最终顺利完成了本次课程设计。
虽然课程设计做的不够完善,但在设计的过程中受益匪浅,通过查资料等学到了很多以前不知道或不太会应用的知识,对单向链表的使用有了更深刻的了解和掌握,因为多项式的计算要求用单向链表来实现,所以在做课程设计之前通过网上找资料,查参考书及问辅导老师等对单向链表的使用比以前掌握的更加到位,并且能够灵活运用,通篇几乎用的都是单向链表,这是受益的一大重点。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 报告 一元 稀疏 多项式 计算器