1、数据结构课程实验报告实验报告专业班级:08级管理科学一班小组成员:吴蓓蕾裴倩茹白雪 贾真真完成日期:2010年7月7日小组分工情况题目一:基础题完成人员:白雪题目二:应用题完成人员:吴蓓蕾题目三:综合题完成人员:裴倩茹题目四:拓展题完成人员:贾真真 吴蓓蕾短学期小结完成人员:白雪题目一基本题:数制的转换(十进制到 m进制转换)1解题思路(较详细说明)十进制转化即为栈的应用。首先定义栈的结构体,入栈函数,出栈函 数。再添加转换函数。转换函数思路:用栈暂存低位值(n/m循环取 余,依次压入栈中,直到余数为0时,循环终止。最后,将余数逆序 输出,即出栈。)2、函数调用图及各函数的功能(简要说明) 函
2、数中用到三个函数:conversion 函数,pop 函数,push 函数Con version函数为将十进制数n转化为m进制Pop函数为出栈函数Push函数为入栈函数;函数调用图Main函数Conv ersi on 函数Pop函数Push函数3、三组测试数据(原始数据,预期结果,实际结果) 第一组数据原始数据:取10,2预期结果:1010实际结果:第二组数据原始数据;取15,2预期结果:1111 实际结果:第三组数据原始数据:64, 8预期结果:100实际结果:4、含注释的源程序(说明主要变量的作用,函数段的功能)#in elude #in clude#in clude struct Lst
3、ackint data;struct Lstack *n ext; ;/定义链栈的结构体struct Lstack *push(struct Lstack *top,i nt k)struct Lstack *p;p=(struct Lstack *)malloc(sizeof(struct Lstack); p-data=k;p_n ext=top; top=p;return top;/定义入栈函数/新分配一个空间栈顶top指针上移struct Lstack *pop(struct Lstack *top) int x;定义出栈函数x=top-data; prin tf(%d ,x); to
4、p=top-n ext;数据输出/栈顶top指针下移return top;void conversion (i nt n, int m)struct Lstack *s=NULL;while (n) s=push(s ,n %m); n=n/m; while(s!=NULL) s=pop(s);void mai n()int n,m;printf(Input十进制数,转换进制数:”);scan f(%d,&n); scan f(%d, &m);con versio n(n ,m);prin tf(n);5、编译与运行情况(存在的问题)#i nclude #i nclude 添加语句#in cl
5、udestruct Lstackint data;struct Lstack *n ext;十进制数n与m进制数的转换struct Lstack *push(struct Lstack *top,i nt k)struct Lstack *p;p=(struct Lstack *)malloc(sizeof(struct Lstack); p-data=k;p_n ext=top; top=p;return top;未对malloc进行定义,不能应用。struct Lstack *pop(struct Lstack *top) int x;while(top!=NULL)x=top-data;
6、 prin tf(%d ,x);top=top-n ext;return top;void conversion (i nt n, int m)struct Lstack *s=NULL;while (n) s=push(s ,n %m); n=n/m; while(s!=NULL) s=pop(s);void mai n()int n,m;printf(Input十进制数,转换进制数:”);scan f(%d,&n); sca nf(%d,&m);con versio n(n ,m);prin tf(n);题目二并去掉重复元素应用题:将两个有序线性表合并成一个有序线性表,1解题思路(较详细说
7、明)算法分析算法主要包括:搜索、比较、插入三个操作。搜索:需要两个指针搜索两个链表;ASCII值的比较);比较:比较结点数据域中数据的大小(实际上是插入:将两个结点中数据小的结点插入新链表2、函数调用图及各函数的功能(简要说明)该程序用到了三个函数:CreateListR函数: 功能:建立链表MergeList函数: 功能:合并链表PrintList函数: 功能:输出链表函数调用图:3、三组测试数据(原始数据,预期结果,实际结果)第一组数据测试:实际结果:原始数据:15648 28379 预期结果:123456789第二组数据测试:实际结果:原始数据:1458 2349 预期结果:123458
8、9第三组数据测试:原始数据:1568 2349 预期结果:12345689实际结果:c、 *C: DOCUBEUTS AND SETTIFGSX 日口-|I1&68 讪轴轆*10SET:234912345689ant/ k住y continuedHI 1第四组数据测试:实际结果:4、含注释的源程序(说明主要变量的作用,函数段的功能)#i nclude #in elude #i nclude typedef struct Ln ode 结构体定义char data; / 数据域struct Lnode *n ext; 指针域ListNode;ListNode *CreateListR() / 尾
9、插法建立链表char ch; ListNode *head,*s,*r;head=r=NULL;while(ch=getchar()!=n)s=(ListNode *)malloc(sizeof(ListNode);s-data=ch; s-n ext=NULL;if(head=NULL) head=s;else r-n ext=s;r=s;retur n head;struct Lnode *MergeList(struct Lnode *ha, struct Lnode *hb) 合并链表struct Lnode *pa=ha, *pb=hb, *hc=NULL, *r=hc; 两个指针
10、pb,pc 从两个链表ha,hb的表头开始搜索,指针r指向新 链表hc的头while(pa&pb) /两个链表都不为空时if(pa-datadata)if(hc=NULL) hc=pa;else r-n ext=pa;r=pa; pa=pa- next; 将较小的结点插入新链表else if(hc=NULL) hc=pb;else r-n ext=pb;r=pb; pb=pb-n ext; if(hc!=NULL) r- n ext=pa?pa:pb;else hc=pa?pa:pb;return hc; /打印合并后链表/当p指向的非空时/取出数据域中的值,并输出Prin tList(str
11、uct Ln ode *c) struct Lnode *p;p=c;while(p!=NULL)prin tf(%c,p-data); p=p-n ext;prin tf(n);mai n() /主程序struct Lnode *a,*b,*c;a=CreateListR(); / 建立链表b=CreateListR();c=MergeList(a,b); 合并链表Prin tList(c); / 输出链表5、编译与运行情况(存在的问题) 第一组数据中:运行时输出的是没有意义的字符原程序部分代码:Prin tList(struct Lnode *c) II打印合并后链表 struct Lno
12、de *p;p=c-next; 修改:p=c; /原因:merge函数建立的 是没有空头结点的链表while(p!二NULL)printf(% d,p-data):修改:%c /原因:结构体定义数据类型为字符型p=p-n ext;prin tf(n);第二组数据中:运行输出的字符串并没有按从小到达的顺序排列。原因:建立链表的时候采用的是头插法,与合并函数 取较小结点插入新链表的思想有冲突,故修改时改为 尾插法建立链表。题目四扩展题:学生成绩管理系统1解题思路(较详细说明)利用结构体定义及 c语言知识将学生成绩这一实体转化为数组类型的记录,其中包括学生学号、姓名、分数三类数据项,利用记录中的关键
13、字, 通过输入、显示、排序、插入、删除、查询、统计等函数对学生数据结构课程的成绩进行管理分析。2、函数调用图及各函数的功能(简要说明)函数调用图:In put()Display()Sort_by_ num()Ma in ()1Fmenu _select()In sert_a_record()Statistic。Query_a_record()Delete_a_record()功能:提供交互界面,供用户选择该系统的各个功能和选项。 功能:交互输入若干条记录、信息。功能:显示所有输入的符合定义的记录。功能:交互式插入一条记录,再利用冒泡排序法对记录进行排序Delete_a_record()功能:按
14、姓名进行交互式查找,删除一条查找到的记录Query_a_record()功能:按姓名进行交互式输入,查找并显示一个记录Statistic() 功能:新增功能,输出统计信息3、程序运行演示及检验(1)在“菜单”中选择In put records ,输入四条记录(2)选择Display All Rrcords ,显示输入的记录(3)选择Sort,显示排序成功选择Display All Rrcords,查看排序后的结果(4)选择Insert a Records输入需要插入的记录选择Display All Rrcords,查看输入的记录(5)选择Delete a Record输入删除记录中的学生姓名删
15、除后的结果(6)选择Query,输入所要查询记录中学生的姓名,显示出查询结果(7)选择Statistic ,显示所有的记录数量、最高分者的记录、最低分者的记录和平均分(8)选择Quit,结束程序4、含注释的源程序(说明主要变量的作用,函数段的功能)#include /* 引用库函数 */#in clude#in clude#in cludetypedef struct /*定义结构体数组*/char num10; /* 学号 */char name20; /* 姓名 */int score; /* 成绩 */Stude nt;Student stu80; /*结构体数组变量 */int men
16、u_select() /* 菜单函数 */char c;doprintf(t*Students Grade of Data Struture Course Management System*n); /* 菜单选择 */printf(t | 1.1 nput Records |n);prin tf(t | 2. Display All Records |n);prin tf(t | 3. Sort |n ”);printf(t | 4. Insert a Record |n);prin tf(t | 5. Delete a Record |n);prin tf(t | 6. Query |n)
17、;prin tf(t | 7. Statistic |n);prin tf(t | 0. Quit |n);prin tf(t*n);prin tf(ttGive your Choice(0-7):); c=getchar(); /* 读入选择 */ while(c7);return(c-O); /* 返回选择 */ int Input(Student stud,int n) /* 输入若干条记录 */ int i=0;char sign,x10; /*x10为清除多余的数据所用*/ while(sign!=n&sign!=N) /* 判断 */ printf(tttstudents num:
18、); /* 交互输入 */sca nf(ttt%s,stud n+i. num);prin tf(tttstude nts name:);sca nf(ttt%s,stud n+i. name);prin tf(tttstude nts score:);sca nf(ttt%d, &stud n+i.score); gets(x); /*清除多余的输入*/ prin tf(ttta ny more records?(Y/N); scanf(ttt%c,&sign); /* 输入判断 */ i+;return( n+i);void Display(Student stud,int n) /* 显
19、示所有记录 */ int i;printf(ttt n); /* 格式头 */prin tf(ttt nu mber n ame scoren);printf(ttt n);for(i=1;i1 &i%10=0) /* 每十个暂停 */printf(ttt n); /* 格式 */prin tf(ttt);system(pause);printf(ttt n);prin tf(ttt);system(pause);void Sort_by_num(Student stud,int n) /* 按学号排序 */ int i,j,*p,*q,s;char t10;for(i=0;in-1;i+)/
20、* 冒泡法排序 */for(j=0;j0)strcpy(t,studj+1. nu m);strcpy(studj+1. nu m,studj. nu m);strcpy(studj. nu m,t);strcpy(t,studj+1. name);strcpy(studj+1. name,studj. name);strcpy(studj. name,t);p=&studj+1.score;q=&studj.score;s=*p;*p=*q;*q=s;int Insert_a_record(Student stud,int n) /* 插入一条记录 */char x10; /*清除多余输入所
21、用*/printf(tttstudents num:); /* 交互式输入 */sca nf(ttt%s,stud n. nu m);prin tf(tttstude nts name:);sca nf(ttt%s,stud n. name);prin tf(tttstude nts score:);sca nf(ttt%d, &stud n.score);gets(x);n+;Sort_by_num(stud,n); /* 调用排序函数 */printf(tttInsert Successed!n); /* 返回成功信息 */return( n);int Delete_a_record(St
22、udent stud,int n) /* 按姓名查找,删除一条记录 */ char s20;int i=0,j;printf(ttttell me his(her) name:); /* 交互式问寻 */scan f(%s,s);while(strcmp(studi.name,s)!=0&in) i+; /* 查找判断 */if(i=n) printf(tttnot find!n); /* 返回失败信息 */return( n);for(j=i;jn-1;j+)/* 删除操作 */strcpy(studj. nu m,studj+1. nu m);strcpy(studj. name,stud
23、j+1. name);studj.score=studj+1.score;printf(tttDelete Successed!n); /* 返回成功信息 */return( n-1);void Query_a_record(Student stud,int n) /* 查找并显示一个记录 */ char s20;int i=0;printf(tttinput his(her) name:); /* 交互式输入 */sca nf(ttt%s,s);while(strcmp(studi.name,s)!=0&in) i+; /* 查找判断 */if(i=n) printf(tttnot find
24、!n); /* 输入失败信息 */return;prin tf(ttthis(her) number:%sn,studi. nu m); /* 输出该学生信息 */prin tf(ttthis(her) score:%dn,studi.score);void Statistic(Student stud,int n) /* 新增功能,输出统计信息 */ int i,j=0,k=0,sum=0;float aver; /*成绩平均值*/for(i=0;istudi.score) j=i;if(studk.scorestudi.score) k=i;aver=1.0*sum/n;printf(tt
25、tthere are %d records.n,n); /* 总共记录数 */printf(tttthe hignest score:n); /* 最高分 */prin tf(ttt nu mber:%s n ame:%s score:%dn,studj. nu m,studj. name,studj.score);printf(tttthe lowest score:n); /* 最低分 */prin tf(ttt nu mber:%s n ame:%s score:%dn,studk. nu m,studk. name,studk.score);printf(tttthe average
26、score is %5.2fn,aver); /* 平均分 */void main() /* 主函数 */int n=0;for(;)switch(menu_select() /* 选择判断 */case 1:prin tf(ttt In put Records n); /* 输入若干条记录 */n=I nput(stu, n);break;case 2:printf(tttDisplay All Recordsn); /* 显示所有记录 */Display(stu, n);break;case 3:prin tf(tttSortn);Sort_by_num(stu,n); /* 按学号排序 */prin tf(tttSort Suceessed!n);prin tf(ttt);system(pause);break;case 4:prin tf(tttI nsert a Recordn);n=lnsert_a_record(stu ,n); /* 插入一条记录 */prin tf(ttt);system(pause);break;case 5:prin tf(tttDelete a Recordn);n=Delete_a_record(stu,n);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1