河北工业大学数据结构定稿.docx
《河北工业大学数据结构定稿.docx》由会员分享,可在线阅读,更多相关《河北工业大学数据结构定稿.docx(65页珍藏版)》请在冰豆网上搜索。
河北工业大学数据结构定稿
河北工业大学
《数据结构》课程实验
实验报告
题目:
Joseph问题求解算法的设计与实现
专业:
计算机
班级:
计8888
姓名:
wangdachui
完成日期:
2015/1/10
一、试验内容
编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。
开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。
报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。
2、试验目的
掌握链表的基本操作:
插入、删除、查找等运算,能够灵活应用链表这种数据结构。
三、流程图
输入总人数
创建并初始化
n个节点
输入第一个报的数key
n==0
Y
报数过程
N
输出出列者的
编号及密码
结束
n--
四、源程序代码
#include
#include
structlist
{
intnum,code;
structlist*next;
};
voidmain()
{
printf("Joseph问题求解算法的设计与实现\n\n");
inti,j,m=1;
intkey;//密码.
intn;//人数.
list*p,*s,*head;
head=(list*)malloc(sizeof(list));//为头结点分配空间.
p=head;
printf("输入人的总个数:
");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("第%d个人的密码:
",i);
scanf("%d",&key);//输入密码
s=p;
p=(list*)malloc(sizeof(list));//创建新的结点.
s->next=p;
p->num=i;
p->code=key;
}
p->next=head->next;
p=head;
head=head->next;
free(p);
p=head;
printf("\n\n输入第一个报的数:
\n");
scanf("%d",&key);
printf("\n出列顺序为:
\n");
for(;n>0;n--)
{
p=head;
for(j=1;j{
s=p;
p=p->next;
}//报数过程
i=p->num;
key=p->code;
printf("第%d号成员出列\n",i);
s->next=p->next;
head=p->next;//重新定义head,下次循环的开始结点.
free(p);//释放已出列的结点.
}
}
五、调试过程
m的初值为20;n=7,7个人的密码依次为:
3,1,7,2,4,8,4,首先m值为6(正确的出列顺序应为6,1,4,7,2,3,5)。
6、结果分析
河北工业大学
《数据结构》课程实验
实验报告
题目:
实验二停车场管理
专业:
计算机
班级:
计7777
姓名:
doubi
完成日期:
2015/1/10
一、试验内容
设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已经停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出场为它让路,待该辆车开出大门外,其他车辆再按次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用
二、试验目的
(1)深入了解栈和队列的特性,掌握栈和队列的存储方法。
(2)掌握栈和队列的基本操作,如初始化、入栈(队列)、出栈(队列)等,并能在实际问题背景下灵活运用。
3、
输入数据
流程图
判断
车离开m==’e’||m=’E’
车到
Q>n?
Y
存在便道
存在停车场
N
车的位置
便道
离开
车场
最后一位
后面车后退
付费离开
Y
结束
便道内车进场
4、源程序代码
#include
voidmain()
{
structchechang
{
inthm1,sk1;
}a[5];//停车场
structbiandao
{
inthm2,sk2;
}b[5];//便道
structtuichu
{
inthm3,sk3;
}c[4];//存放从停车场内退出的车
intp=0,q=0,x=0,n,y,t,r,i,j,g,h,z;
charm;
printf("输入停车场容量和每分钟收费\n");
scanf("%d%d",&n,&y);
printf("输入数据:
\n");
for(;;)
{
scanf("%c",&m);
//判断输入数据
if(m=='e'||m=='E')
break;
scanf("%d%d",&t,&r);//t表示车牌号,r表示时间
//车到达
if(m=='a'||m=='A')
{
if(p{//n表示停车场容量,p表示场内车的数量
a[p].hm1=t;
a[p].sk1=r;
printf("车停在停车厂内%d号位置.\n",p+1);
p++;
}
//车停在便道内
else
{
b[q].hm2=t;
b[q].sk2=r;
printf("车停在便道上%d号位置.\n",q+1);
q++;
}
}
//车离开
if(m=='d'||m=='D')
{
h=p;
for(i=0;i
if(a[i].hm1==t)//判断车是否停在场内
{
p--;
if(i==p)//如果车停在场内最后一位
printf("%d号车在停车厂内停留了%d分钟,应交纳%d元钱.\n",t,r-a[i].sk1,y*(r-a[i].sk1));
else//在它之后进入的车辆先退出场为它让路
{
for(j=p;j>i;j--)
{
c[x].hm3=a[j].hm1;
c[x].sk3=a[j].sk1;
x++;
}
printf("%d号车在停车厂内停留了%d分钟,应交纳%d元钱.\n",t,r-a[i].sk1,y*(r-a[i].sk1));
for(j=i;x-1>=0;x--,j++)//退出的车再进入停车场内
{
a[j].hm1=c[x-1].hm3;
a[j].sk1=c[x-1].sk3;
}
}
if(q!
=0)//便道内的车进入停车场
{
a[p].hm1=b[0].hm2;
a[p].sk1=r;
p++;
for(j=0;j{
b[j].hm2=b[j+1].hm2;
b[j].sk2=b[j+1].sk2;
}
q--;
}
break;
}
//判断车是否停在便道上
for(i=0;iif(b[i].hm2==t)
{
printf("该车停留在便道内,不收费.\n");
for(j=i;j{
b[j].hm2=b[j+1].hm2;
b[j].sk2=b[j+1].sk2;
}
q--;
break;
}
if(g==h&&i==z)printf("无该车.\n");
}
}
}
五、调试过程
设n=2,输入数据为:
(‘A’,1,5),(‘A’,2,10),(‘D’,1,5),(‘A’,3,20),(‘A’,4,25),(‘A’,5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。
其中:
‘A’表示到达(Arrival),‘D’表示离去(Departure),‘E’表示输入结束(End)。
六、结果分析
河北工业大学
《数据结构》课程实验
实验报告
题目:
基于哈夫曼编码的通信系统的设计与实现
专业:
计算机
班级:
888
姓名:
帅哥
完成日期:
2015/1/10
实验三基于哈夫曼(Huffmen)编码的通信系统的设计与实现
一、试验内容
利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
但是,这要求在发送端通过一个编码系统对待传输数据预先编码,在接收端将传来的数据进行译码(复原)。
对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。
二、试验目的
(1)掌握二叉树的存储结构及其相关操作。
(2)掌握构造哈夫曼树的基本思想,及其编码/译码过程。
三、流程图
开始
三、流程图
判断
输入编码字符及编码长度
进行哈弗曼编码
输入要传送的信息
对接收到的信息进行编码
结束
开始
构造哈弗曼树:
第i个结点值
I=num?
否
是
第i个根结点
I=2*num-1?
否
是
创建哈弗曼树
输出字符统计情况
I=num?
否
结束
是
四、源程序代码
#include
#include
#include
char*codechar;
intncodechar,lcodechar;
int*arraychar[100];
char*temp;
float*proba;
charpass[50];
intpassl;
structnode
{
floatpro;
intnum;
structnode*p;
structnode*lc;
structnode*rc;
char*res;
intlength;
}*hc;
charmessage[100][10]={
{"一二三四"},{"五六七八"},{"王岐山地"},{"古古怪怪"},{"弹道导弹"},{"自作主张"},{"发古古怪"},{"曾经沧桑"},{"雷天舞也"},{"杯水车薪"},
{"铩羽而归"},{"不卑不亢"},{"一石二鸟"},{"定还深圳"},{"定海神针"},{"各门庭若市"},{"黑暗之女"},{"我甲方发"},{"意气风发"},{"老当益壮"},
{"宁一摆手"},{"情切意见"},{"不坠青云"},{"找而亡木"},{"安土重迁"},{"不可一世"},{"大海捞针"},{"秋后蚂蚱"},{"饮酒作诗"},{"玩玩小河"},
{"众望所归"},{"无可挑剔"},{"不以为意"},{"冉冉升起"},{"大大咧咧"},{"交定金的"},{"等级低价"},{"打击哦啊"},{"宿建德江"},{"本身就是"},
{"鼠年大吉"},{"都没看完"},{"的大客车"},{"大男大女"},{"石大酒店"},{"多么多么"},{"多么多的"},{"电脑的事"},{"啊加拿大"},{"名的的的"},
{"期咯看过"},{"洋是你的"},{"发怒分意"},{"时间就贷"},{"名发个备"},{"时候的的"},{"马上开始"},{"的那女的"},{"积分是是"},{"神将世界"},
{"顺利交付"},{"是不是是"},{"设计师是"},{"是什么是"},{"咯就的唳"},{"是假的发"},{"秘书部是"},{"膜科技是"},{"是你是是"},{"名啊啊是"},
{"农场盗匪"},{"不可意识"},{"心你吗马"},{"岁月江海"},{"尸好啊发"},{"哈弗发人"},{"鬼时间发"},{"不耻上问"},{"应接与暇"},{"你好发班"},
{"吃吃的额"},{"几何体发"},{"人员人我"},{"偶就个发"},{"三日不绝"},{"金口雨燕"},{"哈弗是额"},{"千万尔好"},{"看逻辑框"},{"耳濡目染"},
{"付人额额"},{"觉得萨就"},{"安静了放"},{"德克士哦"},{"阿婆日怒"},{"阿呆和费"},{"安徽人人"},{"瑞尔富发"},{"垃圾坑啊"},{"恶如日俄"},};
intzifushengcheng()
{
inti,j=0,k=0,yushu,x;
int*b[100];
for(i=0;i<100;i++)
{
b[i]=(int*)malloc(sizeof(int)*lcodechar);
for(j=0;j{
b[i][j]=0;
}
}
for(i=0;i<100;i++)
{
x=i;
do{
yushu=x%ncodechar;
x=(int)(x/ncodechar);
b[i][j]=yushu;
j++;
}while(x!
=0);
for(j=ncodechar-1;j>=0;j--,k++)
{
arraychar[i][k]=b[i][j];
}
j=0;
k=0;
}
for(i=0;i<100;i++)
{
for(j=ncodechar;j{
arraychar[i][j]=rand()%ncodechar;
}
}
/*for(i=0;i<100;i++)
{
for(j=0;j{
printf("%d",arraychar[i][j]);
}
printf("");
for(j=0;j{
printf("%c",codechar[arraychar[i][j]]);
}
printf("\n");
}*/
return1;
}
intprobability()
{
inti,j,k;
for(i=0;i<100;i++)
{
for(j=0;j{
for(k=0;k{
if(arraychar[i][j]==k)
{
proba[k]++;
}
}
}
}
printf("随机生成的字符编码概率:
\n");
for(i=0;i{
proba[i]=proba[i]/(100*lcodechar);
printf("%c:
%f",codechar[i],proba[i]);
}
return1;
}
intExchangepoint(structnode**a,structnode**b)
{
structnode*t;
t=*a;
*a=*b;
*b=t;
return1;
}
intExchangenum(int*a,int*b)
{
intt;
t=*a;
*a=*b;
*b=t;
return1;
}
intExchange(structnode*a,structnode*b)
{
floatt;
t=a->pro;
a->pro=b->pro;
b->pro=t;
Exchangenum(&a->num,&b->num);
Exchangepoint(&a->p,&b->p);
Exchangepoint(&a->lc,&b->lc);
Exchangepoint(&a->rc,&b->rc);
return1;
}
intproduce(structnode*a,int*b)
{
inti;
a->length=(*b);
a->res=(char*)malloc(sizeof(char)*(*b));
for(i=0;i<(*b);i++)
{
a->res[i]=temp[i];
}
if(a->lc!
=NULL&&a->rc!
=NULL)
{
temp[(*b)]='0';
(*b)++;
produce((a->lc),b);
temp[(*b)]='1';
(*b)++;
produce((a->rc),b);
}
(*b)--;
return1;
}
inthuffman()//哈夫曼主程序
{
inti,j,k,l=0;
for(i=0;i<(ncodechar*2-1);i++)
{
hc[i].lc=NULL;
hc[i].rc=NULL;
hc[i].p=NULL;
hc[i].num=i;
if(i{
hc[i].pro=proba[i];
continue;
}
hc[i].pro=0;
}
for(i=0;i{
for(j=i*2;j<(ncodechar+i);j++)
{
for(k=j+1;k<(ncodechar+i);k++)
{
if(hc[k].pro=0)
{
Exchange(&hc[k],&hc[j]);
}
}
}
hc[i+ncodechar].pro=hc[i*2].pro+hc[i*2+1].pro;
hc[i+ncodechar].lc=&hc[i*2];
hc[i+ncodechar].rc=&hc[i*2+1];
hc[i*2].p=&hc[i+ncodechar];
hc[i*2+1].p=&hc[i+ncodechar];
}
printf("\n构造的哈夫曼树:
");
for(i=0;i{
printf("\nchar:
%cnum:
%dpro:
%f",codechar[hc[i].num],hc[i].num,hc[i].pro);
printf("lc:
");
if(hc[i].lc==NULL)
{
printf("");
}
else
{
printf("%d,",hc[i].lc->num);
}
printf("rc:
");
if(hc[i].rc==NULL)
{
printf("");
}
else
{
printf("%d,",hc[i].rc->num);
}
printf("p:
");
if(hc[i].p==NULL)
{
printf("");
}
else
{
printf("%d,",hc[i].p->num);
}
}
produce(&hc[ncodechar*2-2],&l);
printf("\n生成的哈夫曼编码是:
\n");
for(i=0;i{
printf("\nchar:
%cnum:
%dlength:
%dcode:
",codechar[hc[i].num],hc[i].num,hc[i].length);
for(j=0;j{
printf("%c",hc[i].res[j]);
}
}
return1;
}
intsent()
{
inti,j,k,x;
printf("\n***********发送方***********\n");
for(i=0;i<100;i++)
{
printf("%d:
",i+1);
for(j=0;j<20;j++)
{
printf("%c",message[i][j]);
}
printf("相应的字符编码:
");
for(k=0;k{
printf("%c",codechar[arraychar[i][k]]);
}
printf("\n");
}
printf("输入你的信息号:
");
scanf("%d",&x);
printf("你选择发送的信息是:
");
for(j=0;j<20;j++)
{
printf("%c",message[x-1][j]);
}
printf("\n相应的字符编码是:
");
for(i=0;i{
printf("%c",codechar[arraychar[x-1][i]]);
}
printf("\n根据哈夫曼树得到的哈夫曼编码是:
");
for(i=0;i{
for(j=0;j{
if(arraychar[x-1][i]==hc[j].num)
{
for(k=0;k{
printf("%c",hc[j].res[k]);
pass[passl]=hc[j].res[k];
pa