数据结构课程实验报告.docx
《数据结构课程实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构课程实验报告.docx(24页珍藏版)》请在冰豆网上搜索。
数据结构课程实验报告
实验报告
专业班级:
08级管理科学一班
小组成员:
吴蓓蕾裴倩茹
白雪贾真真
完成日期:
2010年7月7日
小组分工情况
题目一:
基础题
完成人员:
白雪
题目二:
应用题
完成人员:
吴蓓蕾
题目三:
综合题
完成人员:
裴倩茹
题目四:
拓展题
完成人员:
贾真真吴蓓蕾
短学期小结
完成人员:
白雪
题目一
基本题:
数制的转换(十进制到m进制转换)
1解题思路(较详细说明)
十进制转化即为栈的应用。
首先定义栈的结构体,入栈函数,出栈函数。
再添加转换函数。
转换函数思路:
用栈暂存低位值(n/m循环取余,依次压入栈中,直到余数为0时,循环终止。
最后,将余数逆序输出,即出栈。
)
2、函数调用图及各函数的功能(简要说明)函数中用到三个函数:
conversion函数,pop函数,push函数
Conversion函数为将十进制数n转化为m进制
Pop函数为出栈函数
Push函数为入栈函数;
函数调用图
Main函数
Conversion函数
Pop函数
Push函数
3、三组测试数据(原始数据,预期结果,实际结果)第一组数据
原始数据:
取10,2
预期结果:
1010
实际结果:
第二组数据
原始数据;取15,2
预期结果:
1111实际结果:
第三组数据
原始数据:
64,8
预期结果:
100
实际结果:
4、含注释的源程序(说明主要变量的作用,函数段的功能)
#inelude
#include
#includestructLstack{
intdata;
structLstack*next;};
//定义链栈的结构体
structLstack*push(structLstack*top,intk){
structLstack*p;
p=(structLstack*)malloc(sizeof(structLstack));p->data=k;
p_>next=top;top=p;
returntop;
}
//定义入栈函数
//新分配一个空间
〃栈顶top指针上移
structLstack*pop(structLstack*top){intx;
〃定义出栈函数
x=top->data;printf("%d",x);top=top->next;
〃数据输出
//栈顶top指针下移
}
returntop;
}
voidconversion(intn,intm){
structLstack*s=NULL;
while(n){s=push(s,n%m);n=n/m;}
while(s!
=NULL)s=pop(s);
}
voidmain(){
intn,m;
printf("Input十进制数,转换进制数:
”);
scanf("%d",&n);scanf("%d",&m);
conversion(n,m);
printf("\n");
}
5、编译与运行情况(存在的问题)
#include
#include添加语句
#include
structLstack{
intdata;
structLstack*next;
};
〃十进制数n与m进制数的转换
structLstack*push(structLstack*top,intk){
structLstack*p;
p=(structLstack*)malloc(sizeof(structLstack));p->data=k;
p_>next=top;top=p;
returntop;
}
未对malloc进行定义,不能应用。
structLstack*pop(structLstack*top){intx;
while(top!
=NULL){
x=top->data;printf("%d",x);
top=top->next;
}
returntop;
voidconversion(intn,intm){
structLstack*s=NULL;
while(n){s=push(s,n%m);n=n/m;}
while(s!
=NULL)s=pop(s);
}
voidmain(){
intn,m;
printf("Input十进制数,转换进制数:
”);
scanf("%d",&n);scanf("%d",&m);
conversion(n,m);
printf("\n");
}
题目二
并去掉重复元素
应用题:
将两个有序线性表合并成一个有序线性表,
1解题思路(较详细说明)
算法分析
算法主要包括:
搜索、比较、插入三个操作。
搜索:
需要两个指针搜索两个链表;
ASCII值的比较);
比较:
比较结点数据域中数据的大小(实际上是
插入:
将两个结点中数据小的结点插入新链表
2、函数调用图及各函数的功能(简要说明)
该程序用到了三个函数:
CreateListR函数:
功能:
建立链表
MergeList函数:
功能:
合并链表
PrintList函数:
功能:
输出链表
函数调用图:
3、三组测试数据(原始数据,预期结果,实际结果)
第一组数据测试:
实际结果:
原始数据:
1564828379预期结果:
123456789
第二组数据测试:
实际结果:
原始数据:
14582349预期结果:
1234589
第三组数据测试:
原始数据:
15682349预期结果:
12345689
实际结果:
]c、*C:
\DOCUBEUTSANDSETTIFGSX日
口
-||
I1&68讪轴轆*10
SET:
2349
12345689
ant/k住ycontinue
d
HI1
►
第四组数据测试:
实际结果:
4、含注释的源程序(说明主要变量的作用,函数段的功能)
#include
#inelude
#include
typedefstructLnode{〃结构体定义
chardata;//数据域
structLnode*next;〃指针域
}ListNode;
ListNode*CreateListR(){//尾插法建立链表
charch;ListNode*head,*s,*r;
head=r=NULL;
while((ch=getchar())!
='\n'){
s=(ListNode*)malloc(sizeof(ListNode));
s->data=ch;s->next=NULL;
if(head==NULL)head=s;
elser->next=s;
r=s;
returnhead;
structLnode*MergeList(structLnode*ha,structLnode*hb){〃合并链表
structLnode*pa=ha,*pb=hb,*hc=NULL,*r=hc;〃两个指针pb,pc从两个链表
ha,hb的表头开始搜索,指针r指向新链表hc的头
while(pa&&pb){//两个链表都不为空时
if(pa->data<=pb->data){
if(hc==NULL)hc=pa;
elser->next=pa;
r=pa;pa=pa->next;}〃将较小的结点插入新链表
else{if(hc==NULL)hc=pb;
elser->next=pb;
r=pb;pb=pb->next;}
}
if(hc!
=NULL)r->next=pa?
pa:
pb;
elsehc=pa?
pa:
pb;
returnhc;}
//打印合并后链表
//当p指向的非空时
//取出数据域中的值,并输出
PrintList(structLnode*c){
structLnode*p;
p=c;
while(p!
=NULL)
{
printf("%c",p->data);p=p->next;
}
printf("\n");
}
main()//主程序
{
structLnode*a,*b,*c;
a=CreateListR();//建立链表
b=CreateListR();
c=MergeList(a,b);〃合并链表
PrintList(c);//输出链表
5、编译与运行情况(存在的问题)第一组数据中:
运行时输出的是没有意义的字符
原程序部分代码:
PrintList(structLnode*c){II打印合并后链表structLnode*p;
p=c->next;修改:
p=c;//原因:
merge函数建立的是没有空头结点的链表
while(p!
二NULL){
printf("%d",p->data):
修改:
%c//原因:
结构体定
义数据类型为字符型
p=p->next;}
printf("\n");}
第二组数据中:
运行输出的字符串并没有按从小到达的顺序排列。
原因:
建立链表的时候采用的是头插法,与合并函数取较小结点插入新链表的思想有冲突,故修改时改为尾插法建立链表。
题目四
扩展题:
学生成绩管理系统
1解题思路(较详细说明)
利用结构体定义及c语言知识将学生成绩这一实体转化为数组类型的记录,其中包括学生
学号、姓名、分数三类数据项,利用记录中的关键字,通过输入、显示、排序、插入、删除、
查询、统计等函数对学生数据结构课程的成绩进行管理分析。
2、函数调用图及各函数的功能(简要说明)
函数调用图:
Input()
Display()
Sort_by_num()
Main()
1
F
menu_select()
Insert_a_record()
Statistic。
Query_a_record()
Delete_a_record()
功能:
提供交互界面,供用户选择该系统的各个功能和选项。
功能:
交互输入若干条记录、信息。
功能:
显示所有输入的符合定义的记录。
功能:
交互式插入一条记录,再利用冒泡排序法对记录进行排序
Delete_a_record()
功能:
按姓名进行交互式查找,删除一条查找到的记录
Query_a_record()
功能:
按姓名进行交互式输入,查找并显示一个记录
Statistic()功能:
新增功能,输出统计信息
3、程序运行演示及检验
(1)在“菜单”中选择Inputrecords,输入四条记录
(2)选择DisplayAllRrcords,显示输入的记录
(3)选择Sort,显示排序成功
选择DisplayAllRrcords,查看排序后的结果
(4)选择InsertaRecords输入需要插入的记录
选择DisplayAllRrcords,查看输入的记录
(5)选择DeleteaRecord输入删除记录中的学生姓名
删除后的结果
(6)选择Query,输入所要查询记录中学生的姓名,显示出查询结果
(7)选择Statistic,显示所有的记录数量、最高分者的记录、最低分
者的记录和平均分
(8)选择Quit,结束程序
4、含注释的源程序(说明主要变量的作用,函数段的功能)
#include/*引用库函数*/
#include
#include
#include
typedefstruct/*定义结构体数组*/
{
charnum[10];/*学号*/
charname[20];/*姓名*/
intscore;/*成绩*/
}Student;
Studentstu[80];/*结构体数组变量*/
intmenu_select()/*菜单函数*/
{
charc;
do{
printf("\t**Students'GradeofDataStrutureCourseManagementSystem**\n");/*菜单选择*/
printf("\t|1.1nputRecords|\n");
printf("\t|2.DisplayAllRecords|\n");
printf("\t|3.Sort|\n”);
printf("\t|4.InsertaRecord|\n");
printf("\t|5.DeleteaRecord|\n");
printf("\t|6.Query|\n");
printf("\t|7.Statistic|\n");
printf("\t|0.Quit|\n");
printf("\t*
**************************************
**\n");
printf("\t\tGiveyourChoice(0-7):
");c=getchar();/*读入选择*/}while(c<'0'||c>'7');
return(c-'O');/*返回选择*/}
intInput(Studentstud[],intn)/*输入若干条记录*/{inti=0;
charsign,x[10];/*x[10]为清除多余的数据所用*/while(sign!
='n'&&sign!
='N')/*判断*/
{printf("\t\t\tstudent'snum:
");/*交互输入*/
scanf("\t\t\t%s",stud[n+i].num);
printf("\t\t\tstudent'sname:
");
scanf("\t\t\t%s",stud[n+i].name);
printf("\t\t\tstudent'sscore:
");
scanf("\t\t\t%d",&stud[n+i].score);gets(x);/*清除多余的输入*/printf("\t\t\tanymorerecords?
(Y/N)");scanf("\t\t\t%c",&sign);/*输入判断*/i++;
}
return(n+i);
}
voidDisplay(Studentstud[],intn)/*显示所有记录*/
{inti;
printf("\t\t\t\n");/*格式头*/
printf("\t\t\tnumbernamescore\n");
printf("\t\t\t\n");
for(i=1;i{printf("\t\t\t%-8s%-6s%d\n",stud[i-1].num,stud[i-1].name,stud[i-1].score);
if(i>1&&i%10==0)/*每十个暂停*/
{printf("\t\t\t\n");/*格式*/
printf("\t\t\t");
system("pause");
printf("\t\t\t\n");
}
}
printf("\t\t\t");
system("pause");
}
voidSort_by_num(Studentstud[],intn)/*按学号排序*/
{inti,j,*p,*q,s;
chart[10];
for(i=0;ifor(j=0;jif(strcmp(stud[j].num,stud[j+1].num)>0)
{strcpy(t,stud[j+1].num);
strcpy(stud[j+1].num,stud[j].num);
strcpy(stud[j].num,t);
strcpy(t,stud[j+1].name);
strcpy(stud[j+1].name,stud[j].name);
strcpy(stud[j].name,t);
p=&stud[j+1].score;
q=&stud[j].score;
s=*p;
*p=*q;
*q=s;
}
}
intInsert_a_record(Studentstud[],intn)/*插入一条记录*/
{charx[10];/*清除多余输入所用*/
printf("\t\t\tstudent'snum:
");/*交互式输入*/
scanf("\t\t\t%s",stud[n].num);
printf("\t\t\tstudent'sname:
");
scanf("\t\t\t%s",stud[n].name);
printf("\t\t\tstudent'sscore:
");
scanf("\t\t\t%d",&stud[n].score);
gets(x);
n++;
Sort_by_num(stud,n);/*调用排序函数*/
printf("\t\t\tInsertSuccessed!
\n");/*返回成功信息*/
return(n);
}
intDelete_a_record(Studentstud[],intn)/*按姓名查找,删除一条记录*/
{chars[20];
inti=0,j;
printf("\t\t\ttellmehis(her)name:
");/*交互式问寻*/
scanf("%s",s);
while(strcmp(stud[i].name,s)!
=0&&iif(i==n)
{printf("\t\t\tnotfind!
\n");/*返回失败信息*/
return(n);
}
for(j=i;j{
strcpy(stud[j].num,stud[j+1].num);
strcpy(stud[j].name,stud[j+1].name);
stud[j].score=stud[j+1].score;
}
printf("\t\t\tDeleteSuccessed!
\n");/*返回成功信息*/
return(n-1);
}
voidQuery_a_record(Studentstud[],intn)/*查找并显示一个记录*/
{chars[20];
inti=0;
printf("\t\t\tinputhis(her)name:
");/*交互式输入*/
scanf("\t\t\t%s",s);
while(strcmp(stud[i].name,s)!
=0&&iif(i==n)
{printf("\t\t\tnotfind!
\n");/*输入失败信息*/
return;
}
printf("\t\t\this(her)number:
%s\n",stud[i].num);/*输出该学生信息*/
printf("\t\t\this(her)score:
%d\n",stud[i].score);
}
voidStatistic(Studentstud[],intn)/*新增功能,输出统计信息*/
{inti,j=0,k=0,sum=0;
floataver;/*成绩平均值*/
for(i=0;i{
sum+=stud[i].score;
if(stud[j].score>stud[i].score)j=i;
if(stud[k].score}
aver=1.0*sum/n;
printf("\t\t\tthereare%drecords.\n",n);/*总共记录数*/
printf("\t\t\tthehignestscore:
\n");/*最高分*/
printf("\t\t\tnumber:
%sname:
%sscore:
%d\n",stud[j].num,stud[j].name,stud[j].score);
printf("\t\t\tthelowestscore:
\n");/*最低分*/
printf("\t\t\tnumber:
%sname:
%sscore:
%d\n",stud[k].num,stud[k].name,stud[k].score);
printf("\t\t\ttheaveragescoreis%5.2f\n",aver);/*平均分*/
}
voidmain()/*主函数*/
{
intn=0;
for(;;)
{
switch(menu_select())/*选择判断*/
{
case1:
printf("\t\t\tInputRecords'n");/*输入若干条记录*/
n=Input(stu,n);
break;
case2:
printf("\t\t\tDisplayAllRecords'n");/*显示所有记录*/
Display(stu,n);
break;
case3:
printf("\t\t\tSort\n");
Sort_by_num(stu,n);/*按学号排序*/
printf("\t\t\tSortSuceessed!
\n");
printf("\t\t\t");
system("pause");
break;
case4:
printf("\t\t\tInsertaRecord\n");
n=lnsert_a_record(stu,n);/*插入一条记录*/
printf("\t\t\t");
system("pause");
break;
case5:
printf("\t\t\tDeleteaRecord\n");
n=Delete_a_record(stu,n);