数据库课程设计报告07 1.docx
- 文档编号:28525727
- 上传时间:2023-07-18
- 格式:DOCX
- 页数:15
- 大小:52.15KB
数据库课程设计报告07 1.docx
《数据库课程设计报告07 1.docx》由会员分享,可在线阅读,更多相关《数据库课程设计报告07 1.docx(15页珍藏版)》请在冰豆网上搜索。
数据库课程设计报告071
数据结构
课程设计报告书
年级2005级
学号200508371407
姓名
班级0504
一、一元多项式计算
1、能够按照指数降序排列建立并输出多项式;
2、能够完成两个多项式的相加,并将结果输入;
其中,存储结构:
采用线性表的链式存储结构,每个结点都有三个域,其中两个域为数据域分别存储一元多项式的指数和系数,另外一个为指针域,指向下一个结点。
一元多项式相加的基本过程的算法(可以使用程序流程图)
源程序
#include"stdafx.h"
#include"stdio.h"
#include"stdlib.h"
#include"iostream.h"
typedefstructnode{
floatcoef;
intexp;
structnode*next;
}linklist;
linklist*create(linklist*head)//建立一个带表头结点的单链线性表
{
linklist*p,*s;
floata;
intb;
p=(linklist*)malloc(sizeof(linklist));
head=p;
p->next=NULL;//先建立一个带头结点的单链表
s=p;
scanf("%f%d",&a,&b);//用键盘输入一元多项式的系数和指数,分别存入a,b
while(a!
=0||b!
=0)
{
p=(linklist*)malloc(sizeof(linklist));
p->coef=a;//把a的值赋给给p->coef
p->exp=b;//把b的值赋给p->exp
p->next=NULL;
s->next=p;
s=s->next;//指针s右移
scanf("%f%d",&a,&b);
}
returnhead;
}
linklist*addpoly(linklist*ha,linklist*hb)//实现两个多项式的相加
{
printf("请入第一个多项式的各系数和各指数:
");
ha=create(ha);//调用create建立一个单链表
printf("请入第二个多项式的各系数和各指数:
");
hb=create(hb);//调用create建立一个单链表
linklist*p,*q,*pre,*r;
floatx;
p=ha->next;
q=hb->next;
pre=ha;
while(p!
=NULL&&q!
=NULL)
{
if(p->exp>q->exp)//如果第一个多项式的指数大于第二个多项式的指数
{
pre=p;//指针pre右移
p=p->next;
}
elseif(p->exp==q->exp)//如果第一个多项式的指数等于第二个多项式的指数
{
x=p->coef+q->coef;//这两项的系数相加
if(x!
=0)
{
p->coef=x;//如果相加后系数不等于0,把x的值存入p->coef
pre=p;//指针右移
p=p->next
}
else{
pre->next=p->next;//如果相加后系数等于0,则在ha上指针pre直接指象p的后继
free(p);//释放p
//pre->next=p;
p=pre->next;
}
r=q;
q=q->next;//如果相加后系数等于0,则在hb上指针r直接指象q的后继
free(r);
}
else//ha系数小于hb系数
{
r=q->next;
q->next=p;
pre->next=q;//将q所指的结点插到结点pre与结点p之间
pre=pre->next;//指针pre右移
q=r;
}
}
if(q!
=NULL)
pre->next=q;
free(hb);//如果q不为空,pre就指向q,并释放hb所占的空间
returnha;
}
linklist*display(linklist*head)
{
linklist*p;
p=head;
while(p->next!
=NULL)//只要p->next不为空
{
p=p->next;//p就右移
printf("%f,%d\t",p->coef,p->exp);//逐项打印个项的系数和指数
}
returnhead;
}
intmain(intargc,char*argv[])
{
linklist*ha,*hb;
ha=addpoly(ha,hb);
ha=display(ha);
return0;
}
测试数据和结果:
第一个多项式为:
x5+3x4+5x2
第二个多项式为:
x5+2x3+8x2
结果为:
2x5+3x4+2x3+13x2
另外觉得在提示输入数据的地方,提示语句不清晰。
可以稍微改进一点:
(粗体为改进部分)
linklist*create(linklist*head)
{
linklist*p,*s;
floata;
intb;
p=(linklist*)malloc(sizeof(linklist));
head=p;
p->next=NULL;
s=p;
printf("coef:
");
scanf("%f",&a);
printf("exp:
");
scanf("%d",&b);
while(a!
=0||b!
=0)
{
p=(linklist*)malloc(sizeof(linklist));
p->coef=a;
p->exp=b;
p->next=NULL;
s->next=p;
s=s->next;
printf("coef:
");
scanf("%f",&a);
printf("exp:
");
scanf("%d",&b);
}
returnhead;
}
linklist*display(linklist*head)
{
linklist*p;
p=head;
while(p->next!
=NULL)
{
p=p->next;
printf("%f*x^%d",p->coef,p->exp);
}
returnhead;
}
intmain(intargc,char*argv[])
{
linklist*ha,*hb;
printf("Welcometouse!
\n");
ha=addpoly(ha,hb);
printf("thesumofpolyis:
\n");
ha=display(ha);
return0;
}
截图如下:
二、猴子选大王
问题定义:
m只猴子要选大王,选举方法如下:
所有猴子按1,2,………m编号并按照顺序围成一圈。
从第一个开始数,每数到第n个,该猴子就跳出圈外,如此循环报数,直到圈内剩下一只猴子时,这只猴子就是大王。
m和n由键盘输入,打印出成为猴王的猴子号。
问题分析:
通过对“猴子选大王”问题的分析,由于本题目的数据元素的个数不可预知,所以使用链表。
链表是动态的,可以在需要的时候增长和减小其长度,而数组是在编译时分配内存的,所以其大小是不可改变的,而且会出现内存浪费的情况。
我认为单循环链表能较好的解决问题。
在建立循环链表时,因为链表的大小由输入决定,因此与其匹配的结点数也是变化的,所以要进行动态内存分配。
研究意义:
单循环链表及动态存储的实现。
1、输入数据:
输入开始的那个猴子序号;数到N就退出的数N;以及参加游戏的所有猴子的序号.
2、输出形式:
中文提示按照m个猴子,数n个数的方法,输出为大王的猴子是几号,建立一个函数来实现此功能
其中,存储结构是循环链表,每个结点都含有两个域,,一个用来存储int型的数据元素,另一个是指向下一个结点的指针域。
源程序
#include"stdafx.h"
#include"stdio.h"
#include"stdlib.h"
typedefintelemtype;
typedefstructnode{
elemtypedata;//存储数据元素
structnode*next;//指向下一个结点的指针
intlength;
}kingmonkey;//定义结点结构
kingmonkey*create(kingmonkey*head)
{
kingmonkey*p,*r;
elemtypex;
inti=0;
head=NULL;
r=head;
printf("请输入所有参加游戏的猴子(并以0结尾):
");
scanf("%d",&x);
while(x!
=0)
{
i++;
p=(kingmonkey*)malloc(sizeof(kingmonkey));
p->data=x;
p->next=NULL;
if(head==NULL)
{
head=p;
r=head;
}
else
{
r->next=p;
r=p;
}
if(r!
=NULL)
r->next=head;
scanf("%d",&x);
}
head->length=i;
returnhead;
}
kingmonkey*process(kingmonkey*head,inti,intj)
{
kingmonkey*q,*r,*p;
intk=1,m=1;
p=head;
if(i<=0||i>head->length)
printf("\nerror!
\n");
else{
printf("被退出的猴子:
");
while(k
{
p=p->next;
k++;
}
while(head->next!
=head)
{
while(m { q=p; p=p->next; m++; } if(p->next==head) { printf("%d\t",p->data); q->next=head; p=head; } else if(p==head) { printf("%d\t",p->data); head=p->next; q->next=p->next; p=head; } else { printf("%d\t",p->data); r=p->next; q->next=p->next; p=r; } m=1; } printf("\n最后获胜的猴子: "); printf("%d\n",head->data); returnhead; } } voiddisplay(kingmonkey*head) { kingmonkey*p; p=head; while(p->next! =head) { printf("%d\t",p->data); p=p->next; } printf("%d",p->data); } intmain(intargc,char*argv[]) { inti,j; kingmonkey*head; printf("请输入开始游戏的猴子: "); scanf("%d",&i); printf("请输入数N个数就退出的数N: "); scanf("%d",&j); head=create(head); display(head); printf("\n"); head=process(head,i,j); } 测试数据和结果: 1、开始猴子的位置-2;数n个猴子,n=3;所有参加游戏的猴子的编号: 1结果: error! 2、开始猴子的位置1;数n个猴子,n=3;所有参加游戏的猴子的编号: 12345678910 结果: 被退出的猴子: 3692718510 最后获胜的猴子为: 4 课程设计的体会 俗话说: “温故而知新。 ”通过对课程的设计,不仅回故了原来学习的知识,而且通过自己动手,理论与实践相结合,学会了不少新的东西。 虽然也遇到过不懂的问题,最后通过自己的努力解决了问题,使知识更加巩固。 在课程设计过程中,通过和老师同学的交流,学习到了很多自己的知识盲点,也升华了彼此的关系。 同时让我感到了团队精神的重要。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库课程设计报告07 数据库 课程设计 报告 07