福州大学数据结构实验报告-线性表(精选10篇)
学号:
姓名:
线性表
一、问题描述 1.实现ADT表
2.设表的Reverse运算将表中元素的次序反转。扩充用数组实现表的结构List,增加函数Reverse(L),将表L中元素的次序反转,并要求就地实现Reverse运算。
二、算法描述
从i=0开始,将表中第N个元素与N-i-1个元素调换即可
三、核心代码
void ReverseList(List L){
ListItem tmp;int i;for(i=0;i
} tmp = L->table[i];L->table[i] = L->table[L->n-1-i];L->table[L->n-1-i] = tmp;}
磁场是一种看不见且又摸不着的特殊物质,它具有波粒的辐射特性。磁体周围存在磁场,磁体间的相互作用就是以磁场作为媒介的,因此,由磁场产生的相互作用具有非接触性。这一磁场特性被应用到各个领域,如磁悬浮、接近传感等等[1]。然而,由磁场产生的作用力往往不是线性的,因此,在一些领域,特别是传感领域,对线性要求较高,就大大抑制了磁场的作用。本文将采用结构差分的方式,探索一种获得线性磁场力的方法。研究结论是提出一种线性磁场力的方式,对应用于传感领域有一定的引导意义。
2 差分磁场结构模型分析
若两个柱形永磁体的磁轴在同一直线上,且磁极相对,那么由磁场相互作用产生的磁场力亦沿磁轴上,基于磁势能原理[2,3,4],柱形永磁体之间相互作用力如式(1)所示
其中:s为两磁极之间的中心距离,Um为与排斥力相关的磁势能,表达式为Um(s)=qs-1,q是永磁体边界形态和磁能特征决定的相关系数,i为磁极指数。
那么,可以得到:
如果在两个柱形永磁体中间放置另一柱形永磁体(如图2所示),若容器长度为Lv,运动块相对位移为x时,那么中间柱形永磁体受到两侧永磁体的磁场力分别为:
将式(3)和(4)分别在x=Lv/2和x=-Lv/2处进行泰勒展开[5],可得:
由式(5)减去(6)即可得到中间永磁体所受到两侧永磁体作用力的合力Fm:
令线性磁场力系数km=2i(i+1)qLv-(i+2)+4i(i+1)(i+2)·qLv-(i+3),并略去三次高阶项,则有:
3 磁场力关键参数分析
鉴于现今永磁体规格众多,参数多样,本文基于对实验数据严谨性,对于式(2)中的磁场力参数i和q值,将直接采用实验方式获取[6]。本文对永磁体相互作用力fm与位移s之间关系进行实验,选用永磁体材料为钕铁硼,剩余磁化强度为1.2T,初始距离为20mm,尺寸分别为30×φ16和5×φ16,测量得相互磁场力如表1。
下面应用最小二乘法对表1数据进行回归分析,首先对式(2)两边取对数得:
令fm'=lnfm,s'=lns,b=ln(iq),a=-(i+1),有:
由表1数据分别计算fm'和s'。
按最小二乘法计算,建立矩阵,则:
则可以求得:a=-1.375,b=-6.0932。那么可以求出i=0.375,q=0.006,则式(2)为:
上式为永磁体相互作用力与位移关系的拟合曲线。图2为实验数据的拟合曲线。
为了分析回归方程的拟合精度,采用最小二乘法对表2的数据进行线性分析[7],可得残余平方和Q=537.50;残余标准差σ=3.570612;相关系数R2=0.996;剩余标准差为0.657,因此所配置的曲线与试验点拟合是很好的。
4 线性磁场力实验分析
要实验验证差分结构中受力永磁体的受力与位移关系,必须测量其的受力情况,但现今众多测力仪器不容易直接应用于本文的差分结构,因此,本文设计将采用差分结构放置于恒定加速度装置下面,测量受力永磁体的位移,以此来验证式(8)。实验装置如图3所示。
差分结构安装在一个内径比受力柱形永磁体的直径稍大的玻璃器皿中,目的是防止其受力偏传,保证永磁体的磁轴一致,同时玻璃器皿内装入非磁性润滑剂,目的减小摩擦力对实验结构的影响。其中,永磁体中心距离L=25mm,即可求得线性磁场力系数km=735.54N/m。如图3所示,受力永磁体的位移由两侧线性霍尔元件组成的差分测量结构,实验前已将其进行了标定。实验装置放在伺服控制的回转平台,把实验装置放在回转平台上,然后磁轴置于回转平台的轴线上,当回转平台以恒定角速度旋转,回转半径R=0.1m,受力永磁体质量m=0.043kg,实验装置便可以得到恒定的加速度,受力永磁体受到恒定向心力驱动[8],将输出恒定的位移与理论值进行比对。实验结果如表2所示。
从上述结果分析,理论与实验相对误差在2%以内,结果表明理论分析与实验结论一致。
5 结论
(1)本文提出差分磁场结构,分析受力永磁体的受力情况,并采用磁势原理推导出永磁体的受力理论计算公式,从理论公式来看,受力永磁体的受力略去高阶项呈线性特性,证明此差分磁场结构可应用于有线性要求的场合。
(2)采用实验方法测量磁场力关键参数,并通过最小二乘法验证实验的正确性。
(3)设计差分磁场结构线性磁场力公式的验证实验,实验很好地证明了差分磁场结构受力与位移具有较好的线性关系,十分符合理论计算公式。
摘要:针对磁场的特性——永磁体相互作用力的非性线问题,提出一种采取永磁体差分结构,获得高阶线性磁场力的方法。文中以永磁体间相互作用力公式出发,推导永磁体差分结构线性磁场力的高阶近似公式,采用实验方式以及最小二乘法计算磁场力公式的参数,设计通过恒定加速度激励下差分结构的响应实验,有效地验证了差分结构磁场力与位移的关系与理论分析非常符合,相对误差在2%以内,这将对磁场力在各领域的应用有一定的意义。
关键词:差分磁场结构,线性磁场力,最小二乘法
参考文献
[1]王化祥,张淑英.传感器原理及应用[M].天津:天津大学出版社,2004.
[2]R Olaru,Dragoi D D.Inductive tilt sensor with magnets and magnetic fluid[J].SENSORS AND ACTUATORS A-PHYS-ICAL,2005,120(2):424-428.
[3]蔡圣善,朱耘.经典电动力学[M].上海:复旦大学出版社,1985.
[4]冯恩信傅.高等电磁理论[M].西安:西安交通大学出版社,2006.
[5]同济大学数学教研室.高等数学(第四版)[M].北京:高等教育出版社,1996.
[6]朱鹤年.基础物理实验教程(物理测量的数据处理与实验设计)[M].北京:高等教育出版社,2003.
[7]费业泰.误差理论与数据处理[M].北京:机械工业出版社,2007.
1.进一步掌握线性表的的基本操作。
2.掌握线性表的典型应用----多项式表示与计算。
二.实验内容
1. 设用线性表((a1, e1),(a2, e2), ……,(am, em))表示多项式P(x)= a1*xe1 + a2*xe2 +…+ am*xem,请编写用链式存储结构(带表头附加结点的单链表)存储该多项式时,多项式基本操作的实现函数。要求:把多项式线性表的结构定义及多项式基本操作实现函数存放在文件Linkpoly.h中。说明:基本操作可包括如下 ① 初始化多项式InitPoly(p)② 输出多项式TraversePoly(p)③ 清除多项式ClearPoly(p)④ 插入一项 InsertPoly(p, a, e)
⑤ 删除一项 DeletetPoly(p, a, e, pos)⑥ 多项式求值PolySum(p, x)
⑦ 多项式相加PolyAdd(p1, p2)
2. 建立主程序文件test1.cpp,在主函数main()中通过调用Linkpoly.h中的函数进行测试。
3. 编写用顺序存储结构存储多项式时,上述各多项式基本操作的实现函数。要求: 把多项式线性表的结构定义及多项式基本操作实现函数存放在文件Seqpoly.h中,在主程序文件test1.cpp中增加测试语句对Seqpoly.h中的函数进行测试。
4. 填写实验报告,实验报告文件取名为report1.doc。
5. 上传实验报告文件report1.doc与源程序文件test1.cpp及Linkpoly.h、Seqpoly.h 到Ftp服务器上自己的文件夹下。
三.函数的功能说明及算法思路
包括每个函数的功能说明,及一些重要函数的算法实现思路
四.实验结果与分析
包括运行结果截图等
五.心得体会
记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等。
【附录----源程序】 Test1.cpp: #include //初始化多项式 InitPoly(pb);cout<<“请输入要测试的项数:”;cin>>n;cout<<“请依次输入要测试的各项的系数和指数:”;for(i=0;i cin>>a; cin>>e; InsertPoly(pa, a, e); //插入一项 pa=pa->next;} pa=pa->next;cout<<“该多项式为:”;TraversePoly(pa); //输出多项式 cout< cout<<“删除成功!现在多项式为:”; TraversePoly(pa); cout< cout<<“删除失败!”< cin>>a; cin>>e; InsertPoly(pb, a, e); //插入一项 pb=pb->next;} pb=pb->next;pp=PolyAdd(pa, pb);cout<<“两多项式相加后得到的多项式为:”;TraversePoly(pp);cout< cout< cout< cout<<“现在进行第二次测试。(顺序表表示)”< cin>>a; cin>>e; InsertPoly1(s, a, e);} cout<<“该多项式为:”;TraversePoly1(s);cout< cout<<“删除成功!现在多项式为:”; TraversePoly1(s); cout< cout<<“删除失败!”< cin>>a; cin>>e; InsertPoly1(t, a, e); //插入一项 } q=PolyAdd1(s, t);cout<<“两多项式相加后得到的多项式为:”;TraversePoly1(q);cout< Linkploy.h: struct NodeType{ float coef; int exp; NodeType *next;};bool InitPoly(NodeType *&p) //初始化多项式 { if((p=new NodeType)==NULL) return false;p->next=p;return true;} void TraversePoly(NodeType *p) //输出多项式 { NodeType *h=p->next;if(h!=p){ cout< h=h->next;} while(h!=p){ if(h->coef>0) cout<<“+”; cout< h=h->next;} } void ClearPoly(NodeType *&p) //清除多项式 { NodeType *cp,*np;cp=p->next;while(cp!=p){ np=cp->next; delete cp; cp=np;} p->next=p;} bool InsertPoly(NodeType *&p, float a, int e) //插入一项 { NodeType *h;if((h=new NodeType)==NULL) return false;h->coef=a;h->exp=e;h->next=p->next;p->next=h;return true;} bool DeletetPoly(NodeType *&p, float a, int e, int pos) //删除一项 { if(pos>1||pos<-1) return false;NodeType *cp=p->next;NodeType *np=p;if(pos==0){ while(cp!=p){ if(cp->coef==a&&cp->exp==e) break; else{ np=cp; cp=cp->next; } } } else if(pos==-1) while(cp!=p){ np=cp; cp=cp->next; } np->next=cp->next;delete cp; return true;} double PolySum(NodeType *p, float x) //多项式求值 { int i;double sum=0,item; NodeType *cp=p->next;while(cp!=p){ item=1; for(i=1;i<=cp->exp;i++) item=item*x; sum=sum+item*cp->coef; cp=cp->next;} return sum;} NodeType *PolyAdd(NodeType *p1, NodeType *p2) //多项式相加 { float coef;NodeType *a=p1->next,*b=p2->next,*c,*pc; InitPoly(c);pc=c;while(a!=p1&&b!=p2){ if(a->exp==b->exp){ coef=a->coef+b->coef; if(coef!=0){ InsertPoly(pc, coef, a->exp); pc=pc->next; } a=a->next; b=b->next; } else if(a->exp InsertPoly(pc,a->coef,a->exp); pc=pc->next; a=a->next; } else{ InsertPoly(pc,b->coef,b->exp); pc=pc->next; b=b->next; } } while(a!=p1){ InsertPoly(pc,a->coef,a->exp); pc=pc->next; a=a->next; } while(b!=p2){ InsertPoly(pc,b->coef,b->exp); pc=pc->next; b=b->next; } return c;} Seqploy.h: #define MaxSize 10000 struct ListType{ float *list; int size;};void InitPoly1(ListType &p) //初始化多项式 { p.list=(float*)malloc(MaxSize*sizeof(float)); if(p.list==NULL){ cout<<“动态可分配的储存空间用完,退出运行!”< exit(1); } p.size=0;for(int i=0;i p.list[i]=0;} void TraversePoly1(ListType p) //输出多项式 { int i=0;if(p.list[i]!=0) cout< for(i=1;i if(p.list[i]!=0) break; cout< if(p.list[i]>0){ cout<<“+”; cout< } if(p.list[i]<0) cout< //清除多项式 { if(p.list!=NULL){ delete []p.list; p.list=NULL;} p.size=0;} void InsertPoly1(ListType &p, float a, int e) //插入一项 { p.list[e]=a;if(p.size p.size=e;} bool DeletetPoly1(ListType &p, float a, int e, int pos) //删除一项 { int i,n;if(p.size==0){ cout<<“多项式为空,删除无效!”< return false;} if(pos==0) if(p.list[e]==a) p.list[e]=0;else if(pos==-1) p.list[p.size]=0;return true;} double PolySum1(ListType p, float x) { double sum=0,item;int i,j;for(i=0;i<=p.size;i++){ item=1; for(j=1;j<=i;j++) item=item*x; sum=sum+item*p.list[i];} return sum;} ListType PolyAdd1(ListType p1, ListType p2){ ListType p;InitPoly1(p);float coef;int i,j;for(i=0;i<=p1.size;i++){ coef=p1.list[i]+p2.list[i]; InsertPoly1(p, coef, i);} //多项式求值 //多项式相加 if(i<=p1.size) for(j=i;j<=p1.size;j++) InsertPoly1(p, p1.list[j], j);if(i<=p2.size) for(j=i;j<=p2.size;j++) 课程名称金融计量学 实验项目名称多元线性回归模型 班级与班级代码 实验室名称(或课室) 专业 任课教师 xxx 学号 :xxx 姓名 :xxx 实验日期:2012 年 5 月 3 日 广东商学院教务处制 姓名 xxx 实验报告成绩 评语 : 指导教师(签名) 年月日 说明:指导教师评分后,实验报告交院(系)办公室保存 多 元线性回归模型 一、实验目的 通过上机实验,使学生能够使用 Eviews 软件估计可化为线性回归模型的非线性模型,并对线性回归模型的参数线性约束条件进行检验。 二、实验内容 (一)根据中国某年按行业分的全部制造业国有企业及规模以上制造业非国有企业的工业总产值 Y,资产合计 K 及职工人数 L 进行回归分析。 (二)掌握可化为线性多元非线性回归模型的估计和多元线性回归模型的线性约束条件的检验方法 (三)根据实验结果判断中国该年制造业总体的规模报酬状态如何? 三、实验步骤(一)收集数据 下表列示出来中国某年按行业分的全部制造业国有企业及规模以上制造业非国有企业的工业总产值 Y,资产合计 K 及职工人数 L。 序号 工业总产值 Y(亿元) 资产合计 K(亿元) 职工人数 L(万人) 序号 工业总产值 Y(亿元) 资产合计 K(亿元) 职工人数 L(万人)3722.7 3078.22 113 17 812.7 1118.81 43 2 1442.52 1684.43 67 18 1899.7 2052.16 61 3 1752.37 2742.77 84 19 3692.85 6113.11 240 4 1451.29 1973.82 27 20 4732.9 9228.25 222 5 5149.3 5917.01 327 21 2180.23 2866.65 80 6 2291.16 1758.77 120 22 2539.76 2545.63 96 7 1345.17 939.1 58 23 3046.95 4787.9 222 8 656.77 694.94 31 24 2192.63 3255.29 163 9 370.18 363.48 16 25 5364.83 8129.68 244 10 1590.36 2511.99 66 26 4834.68 5260.2 145 11 616.71 973.73 58 27 7549.58 7518.79 138 12 617.94 516.01 28 28 867.91 984.52 46 13 4429.19 3785.91 61 29 4611.39 18626.94 218 14 5749.02 8688.03 254 30 170.3 610.91 19 15 1781.37 2798.9 83 31 325.53 1523.19 45 16 1243.07 1808.44 33 表 1(二)创建工作文件(Workfile)。 1、启动Eviews5,在主菜单上依次点击FileNewWorkfile(如图),按确定。 2、在弹出的对话框中选择数据的时间频率(本实验为序列数据),输入数据数为31(如图1),然后点击OK(如图2)。 (图 1)(图 2)、(三)输入数据 1、在 Eviews 软件的命令窗口中键入数据输入/编辑命令:DATAYKL,按 Enter,则显示一个数组窗口(如图)。 2、分别在Y、K、L列输入相应的数据并以group01命名保存(如图): (四)、回归分析 1、在经济理论指导下,设定如下的理论模型: 2、运用OLS估计模型 经对数转换,式 e L AK Y 可变换对数形式如下: 3、对表1的Y、K、L的数据进行对数转换,得新的数据如表2所示: 序号 序号 18.222204 8.032107 4.727388 27.274147 7.429183 4.204693 37.468724 7.916724 4.430817 47.280208 7.587726 3.295837 58.546616 8.685587 5.78996 67.736814 7.47237 4.787492 77.204276 6.844922 4.060443 86.487334 6.543826 3.433987 95.913989 5.895724 2.772589 107.371716 7.828831 4.189655 116.424399 6.881134 4.060443 126.426391 6.246126 3.332205 138.395972 8.239042 4.110874 148.656785 9.069701 5.537334 15 7.485138 7.936982 4.418841 16 表2 4、对表2经对数转化后的数据进行相关性分析 ①重复数据输入步骤,输入取对数后的数据如图: ②在弹出的窗口中选择ViewGraphScatterSimpleScatter按确定,得取对数后的Y、K、L三者之间关系的散点图,结果如下: ③通过对以上散点图的观察可以看出,取对数后的K、L的联合值对取对数后的Y的值有着显着的线性影响。 5、在 Eviews 主窗口中点击 QuickEstimateEquation,在弹出的方程设定框内输入模型:log(y)clog(k)log(l)(如图): 再点击确定,系统将弹出一个窗口来显示有关估计结果(如图)。 由图显示的结果可知,样本回归方程为: Y ln =1.154+0.609 K ln +0.361 L ln (1.59)(3.45)(1.75)其中 8099.02 R,2R =0.7963,F=59.66 4、对以上实验结果做 t 检验分析: 给定显着性水平5%,自由度为(2,28)的 F 分布的临界值为34.3 28 2(05.0),F,因此总体上看,K ln , L ln 联合起来对 Y ln 有着显着的线性影响。在 5%的显着性水平下,自由度为 28 的 t 分布的临界值为048.2)28(05.0 t,因此,K ln 的参数通过了该显着性水平下的 t 检验,但L ln 未通过检验。如果设定显着性水平为 10%,t 分布的临界值为701.1)28(05.0 t,这时 L ln 的参数通过了显着性水平的检验。 2R =0.7963 表明,工业总产值对数值的 79.6%的变化可以由资产合计的对数与职工的对数的变化来解释,但仍有 20.4%的变化是由其他因素的变化影响的。 (五)参数的约束检验 由以上的实验结果可以看出,1 97.0 ,即资产与劳动的产出弹性之和近似为1,表明中国制造业在2000年基本呈现规模报酬不变的状态。因此,进行参数的约束检验时,提出零假设为0H :1 。 如果原假设为真,则可估计如下模型: 1、在 Equation 窗口选择 proc/Specify/Estimate 在弹出的窗口中输入 log(y/l)clog(k/l)如图所示:按确定,所得结果如下: 容易看出,该估计方程通过了 F 检验与参数的 t 检验。 2、对规模报酬是否变化进行的分析 由上面两个实验可以得到 0703.5 URSS,0886.5 RRSS。在原假设为真的条件下有: )1 2 31(1)(UU RRSSRSS RSSF28 0703.50703.5 0886.5 =0.1011 在 5%的显着性水平下,自由度为(1,28)的 F 分布的临界值为 4.20。因为 0.1011<4.20,所以不拒绝原假设,表明 2000 年中国制造业呈现规模报酬不变的状态。 3、运用参数约束条件 12 1 对上面假设模型进行检验 打 开 eq01 方 程 对 象 窗 , 点 击ViewCoefficientTestsWaldCoefficientRestrictions…,在 Waldtests窗口设定参数约束条件:c(2)+c(3)=1。再按 OK,结果如下图: 由以上实验结果可知,我们仍然不拒绝原假设,原假设为真,即中国该年的制造业总体呈现规模报酬不变状态。 班级:2009211307 姓名:吕博文 学号:09211297 分工情况:个人一组 完成日期:11月5日 斐波那契数列递归和迭代算法 一、问题描述 分别写出下列函数的递归算法和迭代算法,并求出n=10时的函数值。Fib(n)= n 当n=0或n=1 Fib(n-2)+ Fib(n-1)当n>=2 二、算法思想 用递归算法求解时,若输入的n的值为0或1,根据问题描述中Fib(n)的递归定义,算法直接返回n作为输出结果。当输入的n的值大于等于2时,根据Fib(n)的递归定义,算法将调用自身计算Fib(n-2)和Fib(n-1)的值,然后返回二者的和。 用迭代算法求解时,先初始化Fib(0)和Fib(1)的值,用两个变量curValue和preValue存储,curValue存储较大的数值,preValue存储较小的数值。若输入的n的值为0或1,算法直接返回n。若输入的n的值大于等于2,循环n-1次,每次循环将curValue和preValue的值相加存入curValue中,并用preValue存储原来curValue的值,为下一次循环做好准备。最终的curValue的值即为Fib(n)的值。 三、设计描述 先提示输入n的值,然后调用递归算法计算Fib(n),输出,再调用迭代算法计算Fib(n),输出。 递归算法 int ShowFib_1(int n){ if(n == 0 || n == 1)//初始条件 return n; else//不符合初始条件时,用递推关系计算 return ShowFib_1(n-2)+ ShowFib_1(n-1);} 迭代算法 int ShowFib_2(int n){ preValue = 0;curValue = 1;//设定第一、第二项的值作为初始条件 if(n == 0 || n == 1)//第一、第二项可直接输出结果 return n;else { for(i = 2;i <= n;i++)//其余各项从前往后逐项相加 { temp = curValue;curValue = curValue + preValue;preValue = temp; } returncurValue; } } 四、源程序 #include int ShowFib_1(int n);//定义递归函数 int ShowFib_2(int n);//定义迭代函数 int main(){ int n; cout<< “N=?:”;cin>> n; //递归算法 cout<< “用递归算法计算” < //迭代算法 cout<< “用迭代算法计算” < //递归算法 int ShowFib_1(int n){ if(n == 0 || n == 1)//判定初始条件 return n;else// return ShowFib_1(n-2)+ ShowFib_1(n-1);} //迭代算法 int ShowFib_2(int n){ intpreValue = 0, curValue = 1;//设定第一、第二项的值 if(n == 0 || n == 1)// return n;else { for(int i = 2;i <= n;i++)//其余项从前往后逐项相加 { int temp;temp = curValue;curValue = curValue + preValue;preValue = temp; } returncurValue; } } 五、测试结果 N=40时利用递归求算时计算机反应速度较慢 N=10时 六、心得体会 在N=40时,等待递归算法算出结果时间较长,可见递归算法计算斐波那契数列的效率不高。但使用迭代算法则想法,可见虽然迭代算法的思路稍难于递归算法,但时间复杂度与空间复杂度均优于递归算法。故更应推荐迭代算法。 另外,本题难度低,过程中没什么问题,故无太多感想。 第二题 一、问题描述 假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点而不设头指针,试编写相应的队列初始化、入队列、出队列和判断队列状态的算法。 利用上述算法完成下面的各操作,并在每一操作后输出队列状态。 1)下列元素逐一入队:5,7,3,8,55 状态:5个元素 2)3个元素出队 状态:2个元素 3)再2个元素出队 状态:队空 4)再1个元素出队 状态:队空(指示下溢) 二、算法思想 主函数中新建一个队列的对象,然后调用其成员函数进行队列的操作。将5,7,3,8,55 入队→5,7,3出队→8,55出队→在队列为空时出队 每次操作后均输出当前队列状态。 三、设计描述 class Queue{ //建立一个队列类 public: Queue(){} ~Queue(); intInit(); //初始化队列 int Insert(int); //入队 int Delete(int&); //出队 intQState(); //判断状态 private: typedefstruct node { int data;struct node *next;}Node;Node *rear;}; 四、源程序 #include class Queue { public: Queue(){} ~Queue(); intInit();//初始化队列 int Insert(int);//入队 int Delete(int&);//出队 intQState();//判断状态 private: typedefstruct node { int data; struct node *next;}Node;Node *rear;}; int Queue::Init()//初始化 { rear=new Node;if(rear){ rear->data=-1; rear->next=rear; return 1;} return 0;} int Queue::Insert(intelem)//入队 { Node * newd=new Node; newd->data=elem;newd->next=rear->next;rear->next=newd;rear=newd;return 1;} int Queue::Delete(int&elem)//出队 { if(rear==rear->next) return 0; Node *p=rear->next->next;elem=p->data;rear->next->next=p->next;if(p==rear)//删最后一个 rear=rear->next;free(p);return 1; } int Queue::QState()//判定状态 { int i=0;Node *q=rear->next; cout<<“队列状态:”< cout< q=q->next; i++;} if(0==i) cout<<“空”< else cout< Queue::~Queue()//删除,如有未释放空间 { int i;if(rear) } { } if(rear->next==rear)free(rear);else { while(rear->next!=rear) Delete(i);free(rear);} //主函数 int main(){ Queue DQ;intele;DQ.Init();DQ.QState(); cout<<“依次将5,7,3,8,55入队”< 5,7,3,8,55 cout<<“将5,7,3出队n”;system(“pause”); if(DQ.Delete(ele))// 出队 cout< if(DQ.Delete(ele)) cout< if(DQ.Delete(ele)) cout< DQ.QState();//当前状态 8,55 cout<<“再将8,55出队”< system(“pause”); if(DQ.Delete(ele)) cout< cout< cout<<“下一步将在空的队列里进行删除操作”< if(DQ.Delete(ele)) cout< } cout<<“队列已满,下溢”< system(“pause”); 五、测试结果 六、心得体会 代码如下: 代码如下: ///////// // 顺序存储线性表 //////// package main import “fmt” const MAXSIZE = 20 //定义数组长度 //定义线性表结构 type List struct { Element [MAXSIZE]int //存储线性表元素的数组 length int //线性表长度 } //初始化线性表,d:初始化的元素, l位置 func (l *List) InitList(d int, p int) { l.Element[p] = d l.length++ } //插入元素 //d:插入的数据 //p:插入位置 func (l *List) Insert(d int, p int) bool { if p < 0 || p >= MAXSIZE || l.length >= MAXSIZE { return false } if p < l.length { for k := l.length - 1; k >= p; k-- { l.Element[k+1] = l.Element[k] } l.Element[p] = d l.length++ return true } else { l.Element[l.length] = d l.length++ return true } } //删除元素 //p:删除元素的位置 func (l *List) Delete(p int) bool { if p < 0 || p > l.length || p >= MAXSIZE { return false } for ; p < l.length-1; p++ { l.Element[p] = l.Element[p+1] } l.Element[l.length-1] = 0 l.length-- return true } func main() { var l List i := 0 b := 1 //初始化一个线性表 for i < 15 { l.InitList(b, i) i++ b++ } //插入一个元素 l.Insert(1, 13) //删除一个元素 l.Delete(5) fmt.Println(l) } //文件名:exp9-1.cpp #include KeyType key; //KeyType为关键字的数据类型 //其他数据 //定义表中最多记录个数 InfoType data; } NodeType;typedef NodeType SeqList[MAXL]; //顺序表类型 int SeqSearch(SeqList R,int n,KeyType k)//顺序查找算法 { int i=0; while(i { } printf(“%d ”,R[i].key);i++; //从表头往后找 if(i>=n)return-1; else } void main(){ SeqList R;{ } printf(“%d”,R[i].key);return i; } int n=10,i;KeyType k=5;int a[]={3,6,2,10,1,8,5,7,4,9};for(i=0;i //建立顺序表 printf(“关键字序列:”);for(i=0;i 截图如下: 实验题9.2 设计一个程序exp9-2.cpp,输出在顺序表{1,2,3,4,5,6,7,8,9,10}中采用折半查找法查找关键字9的过程。 程序如下: //文件名:exp9-2.cpp #include //定义表中最多记录个数 KeyType key; //KeyType为关键字的数据类型 InfoType data; //其他数据 } NodeType;typedef NodeType SeqList[MAXL]; //顺序表类型 int BinSearch(SeqList R,int n,KeyType k)//二分查找算法 { int low=0,high=n-1,mid,count=0;while(low<=high) { mid=(low+high)/2;printf(“ 第%d 次 比 较 :在[%d,%d]R[%d]:%dn”,++count,low,high,mid,R[mid].key); if(R[mid].key==k) //查找成功返回 return mid; if(R[mid].key>k) //继续在R[low..mid-1]中查找 high=mid-1; else low=mid+1; //继续在R[mid+1..high]中查找 } return-1;} void main(){ SeqList R;KeyType k=9;int a[]={1,2,3,4,5,6,7,8,9,10},i,n=10;for(i=0;i //建立顺序表 R[i].key=a[i];printf(“关键字序列:”);for(i=0;i 比 较 元 素 中 } else printf(“元素%d的位置是%dn”,k,i);printf(“元素%d不在表中n”,k); 截图如下: 实验题9.3 设计一个程序exp9-3.cpp,输出在顺序表{8,14,6,9,10,22,34,18,19,31,40,38,54,66,46,71,78,68,80,85,100,94,88,96,87}中采用分块查找法查找(每块的块长为5,共5块)关键字46的过程。 程序如下: //文件名:exp9-3.cpp #include KeyType key; //KeyType为关键字的数据类型 //定义表中最多记录个数 //定义索引表的最大长度 InfoType data; //其他数据 } NodeType;typedef NodeType SeqList[MAXL];typedef struct { KeyType key;int link; //KeyType为关键字的类型 //指向分块的起始下标 //顺序表类型 } IdxType;typedef IdxType IDX[MAXI]; //索引表类型 int IdxSearch(IDX I,int m,SeqList R,int n,KeyType k)//分块查找算法 { int low=0,high=m-1,mid,i,count1=0,count2=0;int b=n/m; //b为每块的记录个数 printf(“二分查找n”);while(low<=high) //在索引表中进行二分查找,找到的位置存放在low中 { mid=(low+high)/2;printf(“ 第%d 次 比 较 :在[%d,%d] 中 比 较 元R[%d]:%dn”,count1+1,low,high,mid,R[mid].key); if(I[mid].key>=k) high=mid-1; else low=mid+1; count1++; //累计在索引表中的比较次数 } if(low //在索引表中查找成功后,再在线性表中进行顺序查找 { printf(“比较%d次,在第%d块中查找元素%dn”,count1,low,k); i=I[low].link; printf(“顺序查找:n ”); while(i<=I[low].link+b-1 && R[i].key!=k) { i++;count2++; printf(“%d ”,R[i].key);} //count2累计在顺序表对应块中的比较次数 printf(“n”); printf(“比较%d次,在顺序表中查找元素%dn”,count2,k); if(i<=I[low].link+b-1) return i; else return-1;} 素 } return-1;void main(){ } SeqList R;KeyType k=46;IDX I;int a[]={8,14,6,9,10,22,34,18,19,31,40,38,54,66,46,71,78,68,80,85,100,94,88,96,87},i;for(i=0;i<25;i++)R[i].key=a[i]; //建立顺序表 I[0].key=14;I[0].link=0;I[1].key=34;I[1].link=4;I[2].key=66;I[2].link=10;I[3].key=85;I[3].link=15;I[4].key=100;I[4].link=20;if((i=IdxSearch(I,5,R,25,k))!=-1)else printf(“元素%d不在表中n”,k);printf(“元素%d的位置是%dn”,k,i);printf(“n”); 题目三:舞伴问题 【实验目的】 1、掌握栈和队列的顺序存储结构和链式存储结构,以便在实际中灵活应用。 2、掌握栈和队列的特点,即后进先出和先进先出的原则。 3、掌握栈和队列的基本运算,如:入栈与出栈,入队与出队等运算在顺序存储结构和链式存储结构上的实现。【问题描述】 假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题。 【实验要求】 利用队列实现,存储结构采用顺序或链式均可 【编程思路】 男女配对问题的原则是先入先出进行配对,因此该问题具体有典型的先进先出特性,可用队列作为算法的数据结构。在算法中,假设男士和女士的记录存放在一个数组中作为输入,然后依次扫描该数组的各元素,并根据性别来决定是进入男队还是女队。当这两个队列构造完成之后,依次将两队当前的队头元素出队来配成舞伴,直至某队列变空为止。如果某组有剩余则参与第二轮的配对,并将第一个需要配对学生的信息返回;如果完全配对,则返回信息,不再进行下一轮的配对。 开始时男士和女士的记录存放在一个结构体数组中作为输入,另外需要构建两个队列来保存男队和女队。无论是结构体数组还男女队列的元素或结点都采取结构体类型。作为输入的结构体数组可以事先创建即初始化时便将数据保存进去,也可以在程序运行时创建。 男女队列的存储类型可以采取顺序或链式结构。二者的原理基本一致,但在操作上却有所不同: 1、顺序存储结构的长度确定,存储容量有限。开辟空间很大的话又浪费存储空间,一种解决方案是采用循环队列,可是本题目是将所用元素都存储完成以后才进行删除,采用循环队列便失去了意义。 2、链式存储结构长度不固定,输入数据可以不固定。相比于顺序存储结构操作简单。由于,输入数据是放在结构体数组中的,其最大长度已确定,间接限制了队列的最大长度,故采用顺序存储结构。确定好存储的类型之后,将结点的类型定义如下: 结点类型:结构体Node 结构体的数据成员:string型变量Name用来保存姓名 Char型变量Sex用来保存性别 typedef struct 计科101 冯康 201000814128 { Node*base;int Front;int Rear;}LinkQueue;用此结构体创建结构体变量来完成队列的各项操作。接下来进行队列的创建、出队列和判断队列是否为空等,具体操作将在代码解析中介绍。【代码解析】 男女队列创建函数:void Creat(LinkQueue&p,LinkQueue&q,Node s[]) 注:p、q分别是操纵男女队列的结构体,s[]为保存男女学生信息的数组 通过 p.base=new Node[n]和q.base=new Node[n]分别为为男女队列开辟数组空间,空间大小n由主函数中输入。为了程序的健壮性,需要判空。代码如下: if(!p.base&&!q.base){ cout<<“操作失败!”< exit(1);} 如果开辟内存空间成功,则将队列中的各个元素进行赋初值: p.Front=p.Rear=0;q.Front=q.Rear=0;根据性别信息将n个男女学生对号入座放入上面开辟的空间中: for(int i=0;i if(s[i].Sex==0) { p.base[p.Rear].Name=s[i].Name; p.base[p.Rear].Sex=s[i].Sex; p.Rear++; } else { q.base[q.Rear].Name=s[i].Name; q.base[q.Rear].Sex=s[i].Sex; q.Rear++; } } 进行男女学生配对及确定下一轮要进行跳舞学生信息。其函数为:LinkQueue*Dance(LinkQueue&p,LinkQueue&q)一直进行循环,将男女生进行配对。最后的结束条件是至少有一个队列为空: while(p.Front!=p.Rear&&q.Front!=q.Rear)//循环结束条件 { cout< p.Front++;q.Front++;//进行学生配对 } if(p.Front!=p.Rear) return &p;//如果男生队列有剩余则将男生队列返回 计科101 冯康 201000814128 } else if(q.Front!=q.Rear) return &q;//如果女生队列有剩余则将女生队列返回 else return NULL;//如果男女学生刚好配对则返回空指针 【测试数据】 【实验体会】 对于面向过程编程而言,程序=数据+算法,在编写程序之前首先要对题目要求进行分析和思考。等把问题弄明白后,就要根据事件发展过程,依靠程序来模仿事件,进而形成编程思路,最后确定算法。一般而言,在编程思路路形成以后,根据程序执行过程选择最优算法,当这些都完成以后,编写代码及调试就没有太大麻烦了,所以首先要形成编程思路。刚开始的时候我直接在开发环境下一边看题一边写代码,瞪了半天什么也没写出来,于是我便先开始在纸上画画写写,将事件的整个过程画下来,然后考虑怎么才能运用代码来实现,一边思考一边写一些粗略的代码,最后从上到下执行代码看看是不是符合题目要求。有没有什么漏 3 计科101 冯康 201000814128 洞。等这些完成以后,再在开发环境下将代码完善、编译和调试。虽然说代码还有许多要改进的的地方,有的功能还不够完善,可毕竟是自己亲自写出来的,对于程序的条理有了一个清晰的了解,对编程也有了更加深刻的认识。【附录代码】 #include cout<<“操作失败!”< exit(1);} p.Front=p.Rear=0;q.Front=q.Rear=0;for(int i=0;i if(s[i].Sex==0) { p.base[p.Rear].Name=s[i].Name; p.base[p.Rear].Sex=s[i].Sex; p.Rear++; } else { q.base[q.Rear].Name=s[i].Name; q.base[q.Rear].Sex=s[i].Sex; q.Rear++; 计科101 冯康 201000814128 } } } LinkQueue*Dance(LinkQueue&p,LinkQueue&q){ while(p.Front!=p.Rear&&q.Front!=q.Rear){ cout< p.Front++; q.Front++;} if(p.Front!=p.Rear) return &p; else if(q.Front!=q.Rear) return &q; else return NULL;} int main(){ Node s[100];cout<<“输入性别:0表示男生,表示女生”< cout<<“No”< cin>>s[i].Name; cout<<“No”< cin>>s[i].Sex;} LinkQueue p,q;Creat(p,q,s);LinkQueue*t=Dance(p,q);if(t!=NULL) cout<<“下一轮开始人员的名字是:”< cout<<“男女搭配刚好完成!”< PB10011020 刘思轶 实验内容 本实验有两个可选题目,旅游出行和药品免疫库。本程序即为旅游出行的一个实现。 实验原题摘要如下 数据关系模式: 航班FLIGHTS(String flightNum, int price, int numSeats, int numAvail, String FromCity, StringArivCity); 宾馆房间HOTELS(String location, int price, int numRooms, int numAvail); 出租车CARS(String location, int price, int numCars, int numAvail); 客户CUSTOMERS(String custName); 预订情况RESERVATIONS(String resvKey, String custName, int resvType)系统基本功能: 1.航班,出租车,宾馆房间和客户基础数据的入库,更新(表中的属性也可以根据你的需要添加)。 2.预定航班,出租车,宾馆房间。 3.查询航班,出租车,宾馆房间,客户和预订信息。4.查询某个客户的旅行线路。5.检查预定线路的完整性。6.其他任意你愿意加上的功能。 程序功能 本系统由旅行服务提供商运营,发布在支持PHP + MySQL 的服务器上。系统默认有三个角色,游客、用户和管理员。它们的权限如下 1、游客 查询当前航班、旅馆和出租车的预订情况; 2、注册用户 游客的所用权限; 查询当前预订; 预订航班、旅馆和出租车; 退订航班、旅馆和出租车。打印旅行路线 检查预定路线的完整性。检查航班的完备性 3、管理员 注册用户的所用权限 添加航班、旅馆和出租车信息; 更改航班、旅馆和出租车信息; 注册用户; 更改用户密码和权限; 删除注册用户; 查询用户预订; 取消用户预订; 查询用户旅行线路。 运行平台 本系统在Windows 7 32位 下由PHP-now虚拟的网络运行平台上测试.所需环境为: PHP Apache MySQL PhmyAdmin 环境搭建 打开集成环境php-now文件夹,点击init.cmd,会自动安装所需环境 接着在PHP后台中载入所需要的表 CREATE TABLE FLIGHTS(flightNum varchar(30), price int(6), numSeats int(6), numAvail int(6), FromCity varchar(30), ArivCity varchar(30), PRIMARY KEY(flightNum));CREATE TABLE HOTELS(location varchar(30), price int(6), numRooms int(6), numAvail int(6), PRIMARY KEY(location));CREATE TABLE CARS(location varchar(30), price int(6), numCars int(6), numAvail int(6), PRIMARY KEY(location));CREATE TABLE CUSTOMERS(custName varchar(30), password varchar(50), type varchar(20), PRIMARY KEY(custName));CREATE TABLE RESERVATIONS(resvKey int(20)AUTO_INCREMENT, custName varchar(30), resvType varchar(20), detail varchar(20), PRIMARY KEY(resvKey)); 该程序所实现的功能 1.登录功能 登陆者身份分为游客和管理员,在数据库中信息都存放在customer表中,区别为type项不同,管理员为admin,游客为users,决定了权限不同.(1)普通游客登录后界面 (2)管理员登陆后界面 2.查询功能 登入http://127.0.0.1 可以选择查询航班,旅馆和出租车.3.游客-预订功能 4.游客-管理预订信息功能 点击自己的id可进入该功能页面,可以看到自己的旅游路线和预订信息,并可以取消预订.5.游客-检查线路完整性功能 当游客预订了从A到B的机票,则必须检查啊在A定了车(去机场),在B订了车和旅馆(下飞机后坐车和住宿),以此实现完整性检查.在从nanjing to beijing的旅游路线后面点击check,会提示游客还需要在nanjing预订汽车,在beijing预定旅馆。 6.管理员-管理航班,旅馆和出租车表 可以有insert delete 和update 几种操作.delete: 直接点击cancel就可删除相应的信息。insert & update: 点击edit后,程序会自动将想要编辑的行的信息填入供管理员编辑,不用再手动输入。 7.管理员-管理用户表 可以添加新用户,对用户的权限升级,查看用户信息.用户的密码是md5加密保存的。 实验小结 仍然存在的问题: 1.软件界面过于简单,仅仅实现了功能没有在用户可用性上多做考虑。 2.新用户想要登录该系统预订必须要由管理员登入信息后才可操作。缺少了游客注册的功能。 3.不能根据用户的需求点对点得查询相应信息,只能罗列出所有的信息。 实验心得: 1.在搭建PHP环境中遇到了许多问题:如用户权限不够,域名已使用使得Apache-20安装不成功,通过网上查阅资料解决问题。 实验报告 一、实验题目: 数据库基本操作实验 二、实验目的: 掌握数据库的建立、表的设计基本方法,通过实际操作熟练掌握数据库的基本操作——数据的输入与导入,表的设计。 三、实验内容: 建立课程管理数据库,要求: 1.输入老师、开设课程、选课表、学生基本数据等,并输入一些学生不同课程的考试成绩。 2.建立查询表,分别是成绩查询、学分查询、不及格学生查询。 3.建立窗体,分别显示不及格学生的姓名、课程名称、成绩和班级ID。在成绩查询中显示学生姓名及各科成绩。在教师基本信息中显示编号、职称、工资、院系、等。同时建立开设课程表和学生基本信息的窗体查询。提供用户一个简单的应用程序界面,方便用户操作使用。 4.制作报表。包括教师的授课报表,课程名称及课程类别。学生的总成绩报表,包括课程名称、成绩和学分。 注:课程及考试成绩可以任意输入。选课按照班级确定。 四、实验过程: 1、数据库表设计 在表格内填入教师基本信息、开始课程、课程基本信息、选课表、学生基本信息。 教师基本信息: 开设课程: / 7 10包三 李雅 100910306 课程基本信息: 选课表: / 7 10包三 李雅 100910306 学生基本信息: 2、查询表: 成绩查询: / 7 10包三 李雅 100910306 学分查询: 不及格学生查询: / 7 10包三 李雅 100910306 3、窗体设计: 不及格学生信息查询: 成绩查询: 教师基本信息查询: 开设课程信息查询: / 7 10包三 李雅 100910306 学生基本信息查询: 4、报表: 教师的授课报表: / 7 10包三 李雅 100910306 学生的总成绩: 【福州大学数据结构实验报告-线性表】推荐阅读: 福州大学管理学院实验室开放管理制度09-26 大学物理实验数据处理方法总结10-01 福州大学linux复习10-28 福州大学的法学院11-25 线性代数答案复旦大学10-01 考研之福州大学环境艺术系简介06-13 中南大学实验报告11-03 福州大学英语语言文学考研经验09-12 中国石油大学实验报告09-14 福州大学2013年化学工程专业复试回忆版05-27福州大学数据结构实验报告-线性表 篇4
福州大学数据结构实验报告-线性表 篇5
福州大学数据结构实验报告-线性表 篇6
数据结构查找实验报告 篇7
数据结构实验报告2.3 篇8
数据库实验2实验报告 2 篇9
数据库实验报告 篇10