数据结构实训报告.docx
《数据结构实训报告.docx》由会员分享,可在线阅读,更多相关《数据结构实训报告.docx(19页珍藏版)》请在冰豆网上搜索。
数据结构实训报告
实训项目:
数据结构课程实习
计算机科学与技术专业10级01班
姓 名:
王晓勃
实训成绩:
指导老师:
孟晓丽、贺军鹏
2012年5月21日
实训目的:
通过具体的课程实习,熟悉数据结构中顺序表、单链表、栈、树、串和排序等数据结构及其上的各种操作和实际应用。
在设计的过程中,掌握数据结构的思想,并运用于具体问题的解决之中。
加深对数据结构课程中理论和实践相结合的认识。
使学生在初学阶段执行严格的实习步骤规范(包括上机操作规范),上机课时利用率会大大提高,有助于养成良好的程序编制风格,培养严谨、科学、高效的工作方式。
实训任务及要求:
1、猴子吃桃子问题
任务:
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉了一半,又多吃了一个;以后每天早上都吃了前一天剩下的一半加一个,到第n天早上想再吃时,发现只剩下一个桃子了。
要求:
从键盘输入猴子吃桃的天数day。
输出形式:
输出第一天共摘桃子的个数。
测试数据:
day=6。
2、顺序表的插入
任务:
从键盘输入任一整数,使其插入到有序的数列:
{15,42,86,118,235,289,324,390,500,1000}中,插入后仍然保持从小到大的顺序。
要求:
从键盘输入插入的数据x。
输出形式:
输出原序列和插入新数后的序列。
测试数据:
x=665。
3、货物入库和出库
任务:
某超市要将货物进行入库操作,模拟其入库和出库的操作。
要求:
从键盘输入所要入库货物的总数n、入库的货物号码。
输出形式:
输出入库的货物号码序列和出库的货物序列。
测试数据:
n=8,入库序列为:
2,3,6,18,22,25,29,30。
实训仪器、仪表与工具、器材:
硬件设备为多媒体计算机、实验运行环境及软件为turboc或MicroSoftvisualC++6.0及Windows2000操作系统、程序设计语言为C语言。
实训内容、方法与步骤(流程):
实训内容:
1、猴子吃桃子问题
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉了一半,又多吃了一个;以后每天早上都吃了前一天剩下的一半加一个,到第n天早上想再吃时,发现只剩下一个桃子了。
2、顺序表的插入
从键盘输入任一整数,使其插入到有序的数列:
{15,42,86,118,235,289,324,390,500,1000}中,插入后仍然保持从小到大的顺序。
3、货物入库和出库
某超市要将货物进行入库操作,模拟其入库和出库的操作。
要求:
从键盘输入所要入库货物的总数n、入库的货物号码。
输出形式:
输出入库的货物号码序列和出库的货物序列。
4、约瑟夫环编号是1,2,•••,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。
一开始任选一个正整数作为报数上限值m,从第一个人开始顺时针方向自1开始顺序报数,报到m时停止报数。
报m的人出列,将他的密码作为新的m值,从他的顺时针方向的下一个开始重新从1报数,依次下去,直到所有的人全部出列或者剩余一个人为止。
设计一个程序来求出所有出列顺序或最后一个赢家。
利用单向循环链表存储结构模拟此过程,并从键盘输入人数n以及m的初值,并输入每个人的密码和姓名,建立单循环链表。
输出形式:
正确的输出序列或最后一个赢家。
5、排序
对从键盘输入的任意多个数n进行从小到大的排序。
要求:
从键盘输入要求排序的数的个数n以及要排序的数,分别利用起泡法和快速排序法来实现。
输出:
排序后的数,每行输出五个数。
实训方法与步骤:
1、猴子吃桃子问题
#include
#include
intmain()
{
printf("请输入猴子吃桃的天数n:
按回车键结束\n");
intx=1,y,n,i;
scanf("%d",&n);
for(i=n;i>0;i--)
{
x=x*2;
y=3*x-2;
}
printf("第一天猴子一共摘得桃子:
%d\n",y);
2、顺序表的插入
#include
intmain()
{
inta[50]={15,42,86,118,235,289,324,390,500,1000};
intx,i;
for(i=0;i<10;i++)
{
printf("%d",a[i]);
}
printf("\n请输入要插入的数:
");
scanf("%d",&x);
for(i=9;i>=0;i--)
{
if(x{
a[i+1]=a[i];
a[i]=x;
}
}
printf("插入后的数列为:
\n");
for(i=0;i<11;i++)
{
printf("%d",a[i]);
}
printf("\n");
3、货物入库和出库
#include
#include
#include
#defineoverflow-2
#defineok1
#defineerror0
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
#defineselemtypeint
typedefintStatus;
typedefstruct{
int*base;
int*top;
intstacksize;
}sqstack;
StatusInitstack(sqstack*s)
{
s->base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));
if(!
s->base)exit(overflow);
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
returnok;
}
Statuspush(sqstack*s,selemtypee)
{
if(s->top-s->base>=s->stacksize)
{
s->base=(int*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(int));
if(!
s->base)exit(overflow);
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREMENT;
}
*s->top++=e;
returnok;
}
Statuspop(sqstack*s,int*e)
{
if(s->top==s->base)
{
printf("空栈\n");
returnerror;
}
else
{
*e=*--s->top;
printf("%d",*e);
returnok;
}
}
voidmain()
{
intm,n,i,j,n1,m1;
sqstacks1;
Initstack(&s1);
printf("******欢迎使用WXB货物出入库系统******");
printf("\n请输入所有入库货物数n:
");
scanf("%d",&n);
printf("请输入入库货物序列号:
");
for(i=0;i{
scanf("%d",&n1);
push(&s1,n1);
}
printf("请输入出库货物总数m(m<=%d):
",n);
scanf("%d",&m);
if(m>=0&&m<=n)
{
printf("");
for(j=0;j{
pop(&s1,&m1);
}
printf("\n");
}
else
{
printf("输出货物总数错误,请重新输入\n");
}
printf("****感谢您的使用,欢迎你下次使用!
****\n");
4、约瑟夫环
#include
#include
#include
#defineerror-1
typedefintstatus;
structstudent
{
intnum;
charname[20];
intmima;
}studata;//定义结构体来保存各个数据
typedefstructlnode{
structstudentdata;//嵌套structstudent结构体的data
structlnode*next;
}lnode,*linklist;//结点*linklist为structlnode型指针
voidcreatelist(linklist&l,intn)
{
inti,j,x;
linklisthead,p,q;
head=(linklist)malloc(sizeof(lnode));
p=head;//p指向头结点
for(i=0;i{
printf("\n请输入序号为%d人的姓名和密码:
",i+1);
p->next=(linklist)malloc(sizeof(lnode));//p->next指向新生成的结点
p=p->next;//p指向新生成的结点
scanf("%s%d",&p->data.name,&p->data.mima);
p->data.num=(i+1);
p->next=head->next;//p->next指向头结点的next(也就是第一个结点)
}
printf("刚才输入对应序号姓名密码列表:
\n");
for(x=1;x<=6;x++)
{
p=p->next;
printf("%d\t%s\t%d\n",p->data.num,p->data.name,p->data.mima);
}
printf("请输入初始m值:
");
scanf("%d",&j);
if(j<1)
printf("输入错误!
请重新输入\n");
else
{
while(p->next!
=p)
{
intm=1;
for(m=1;m{
p=p->next;
}
q=p->next;
p->next=q->next;
j=q->data.mima;
printf("第%d号%s输出\n",q->data.num,q->data.name);
free(q);
}
printf("最后赢家%d号是%s\n",p->data.num,p->data.name);
}
}
voidmain()
{
structstudent;
intn;
linklisthead;
printf("\n===》请输入人数n:
");
scanf("%d",&n);
createlist(head,n);
5、排序
#include
#include
#include
#defineove