C++插队买票.docx

上传人:b****7 文档编号:9242217 上传时间:2023-02-03 格式:DOCX 页数:42 大小:21.41KB
下载 相关 举报
C++插队买票.docx_第1页
第1页 / 共42页
C++插队买票.docx_第2页
第2页 / 共42页
C++插队买票.docx_第3页
第3页 / 共42页
C++插队买票.docx_第4页
第4页 / 共42页
C++插队买票.docx_第5页
第5页 / 共42页
点击查看更多>>
下载资源
资源描述

C++插队买票.docx

《C++插队买票.docx》由会员分享,可在线阅读,更多相关《C++插队买票.docx(42页珍藏版)》请在冰豆网上搜索。

C++插队买票.docx

C++插队买票

此程序必须自己建立people.txt(进入大厅插队的人)friend.txt(朋友组)input.txt(初始化各个窗口的人)output.txt(输出结果)

#include

#include

#include

usingnamespacestd;

voidshow();

structNODE//队伍的数据结构

{

charname[20];

intfront;

intnext;

};

structFRIEND//朋友组的数据结构

{

charname[20];

};

structlocation//记录每个窗口最后一个朋友的位置及所在个数

{

intsit;//位置

intnumber;//第几个

};

NODEn1[100];//代表一号窗口

NODEn2[100];//代表二号窗口

NODEn3[100];//代表三号窗口

NODEn4[100];//代表四号窗口

intfront[4],last[4];//front指向各个窗口的第一个人,lase指向最后一个(下标)

locationlocat[4];

intnum[4];//记录每个窗口的人数

FRIENDF[100];//朋友的信息

intnumfriend=0;//记录朋友的个数

intTime[4];//记录时间,通过它来体现各窗口的售票速度

ofstreamoutfile("output.txt",ios:

:

out);

inthash(charr[])//r是排队人姓名

{

for(inti=0;r[i]!

='\0';i++);

if(i>=4)return(r[1]+27*r[2]+27*27*r[3]+27*27*27*r[4])%103;

elsereturn(r[1]+27*r[2]+27*27*r[3])%103;

}

intjudge(charr[],intn,intm)//冲突处理函数,n表示哈希值,m表示第几个窗口

{

intx=1;//用来进行平方探测

inty=1;

if(0==m)

{

if(n1[n].front==0)

{

returnn;

}

else

{

for(intn2=n;n1[n].front!

=0&&n<=100&&n>=0;)//平方探测再散列

{

n=n2+x*x*y;

if(y<0)

{

x++;

}

y=y*(-1);

}

if(n<=100&&n>=0)

{

returnn;

}

else

{

cout<<"无法入队!

是否清除无关人员?

(Y/N)"<

charF;

cin>>F;

if(F=='y'||F=='Y')

{

show();

return11111;

}

elseif(F=='n'||F=='N')

{

cout<<"无法入队!

"<

}

else

{

cout<<"没有您所选择的操作!

"<

}

}

}

}

elseif(1==m)

{

if(n2[n].front==0)

{

returnn;

}

else

{

for(intn1=n;n2[n].front!

=0&&n<=100&&n>=0;)//平方探测再散列

{

n=n1+x*x*y;

if(y<0)

{

x++;

}

y=y*(-1);

}

if(n<=100&&n>=0)

{

returnn;

}

else

{

cout<<"是否清除无关人员?

(Y/N)"<

charF;

cin>>F;

if(F=='y'||F=='Y')

{

show();

}

elseif(F=='n'||F=='N')

{

cout<<"无法入队!

"<

}

else

{

cout<<"没有您所选择的操作!

"<

}

}

}

}

elseif(2==m)

{

if(n3[n].front==0)

{

returnn;

}

else

{

for(intn1=n;n3[n].front!

=0&&n<=100&&n>=0;)//平方探测再散列

{

n=n1+x*x*y;

if(y<0)

{

x++;

}

y=y*(-1);

}

if(n<=100&&n>=0)

{

returnn;

}

else

{

cout<<"是否清除无关人员?

(Y/N)"<

charF;

cin>>F;

if(F=='y'||F=='Y')

{

show();

}

elseif(F=='n'||F=='N')

{

cout<<"无法入队!

"<

}

else

{

cout<<"没有您所选择的操作!

"<

}

}

}

}

else

{

if(n4[n].front==0)

{

returnn;

}

else

{

for(intn1;n4[n].front!

=0&&n<=100&&n>=0;)//平方探测再散列

{

n=n1+x*x*y;

if(y<0)

{

x++;

}

y=y*(-1);

}

if(n<=100&&n>=0)

{

returnn;

}

else

{

cout<<"是否清除无关人员?

(Y/N)"<

charF;

cin>>F;

if(F=='y'||F=='Y')

{

show();

}

elseif(F=='n'||F=='N')

{

cout<<"无法入队!

"<

}

else

{

cout<<"没有您所选择的操作!

"<

}

}

}

}

}

voidinsert(charr[])//r是排队人姓名

{

inta=0;//标记r是否在朋友组中,a=1表明r在朋友组中

for(inti=0;i

{

if(strcmp(F[i].name,r)==0){a=1;break;}

}

if(0==a)

{

i=0;

intj,min=num[i];//min表示四个窗口中最小的队伍

for(j=0;j<=3;j++)

{

if(min>num[j])

{

min=num[j];

i=j;//i表示最短队伍

}

}

j=hash(r);//此时j代表哈希函数返回的值

intk=judge(r,j,i);//k标记插入在哪个位置

if(k!

=11111)

{

if(0==i)

{

n1[last[0]].next=k;

n1[k].front=last[0];

strcpy(n1[k].name,r);

last[0]=k;

num[0]++;

}

elseif(1==i)

{

n2[last[1]].next=k;

n2[k].front=last[1];

strcpy(n2[k].name,r);

last[1]=k;

num[1]++;

}

elseif(2==i)

{

n3[last[2]].next=k;

n3[k].front=last[2];

strcpy(n3[k].name,r);

last[2]=k;

num[2]++;

}

else

{

n4[last[3]].next=k;

n4[k].front=last[3];

strcpy(n4[k].name,r);

last[3]=k;

num[3]++;

}

}

else

{

cout<

"<

}

}

else

{

inti=0,k=0;//k用来标记队伍中是否有自己的朋友,k=0表示没有

intj,min;//min表示四个窗口中朋友的最后位置最前的队伍

for(i=0;i<=3;i++)

{

if(locat[i].number!

=0)

{

min=locat[i].number;

k=1;

j=i;

}

}

i=j;

j=0;

for(j=0;j<=3;j++)

{

if(min>locat[j].number&&locat[j].number!

=0)

{

min=locat[j].number;

i=j;//i表示那个窗口朋友的位置最前

}

}

if(0==k)

{

inti1=0;

intj1,min1=num[i1];//min1表示四个窗口中最小的队伍

for(j1=1;j1<=3;j1++)

{

if(min1>num[j1])

{

min1=num[j1];

i1=j1;

}

}

j1=hash(r);//此时j代表哈希函数返回的值

if(0==i1)

{

intsign=judge(r,j1,i1);

if(sign!

=11111)

{

n1[last[0]].next=sign;

n1[sign].front=last[0];

strcpy(n1[sign].name,r);

last[0]=sign;

num[0]++;

locat[0].sit=sign;

locat[0].number=num[0];

}

else

{

cout<

"<

}

}

elseif(1==i1)

{

intsign=judge(r,j1,i1);

if(sign!

=11111)

{

n2[last[1]].next=sign;

n2[sign].front=last[1];

strcpy(n2[sign].name,r);

last[1]=sign;

num[1]++;

locat[1].sit=sign;

locat[1].number=num[1];

}

else

{

cout<

"<

}

}

elseif(2==i1)

{

intsign=judge(r,j1,i1);

if(sign!

=11111)

{

n3[last[2]].next=sign;

n3[sign].front=last[2];

strcpy(n3[sign].name,r);

last[2]=sign;

num[2]++;

locat[2].sit=sign;

locat[2].number=num[2];

}

else

{

cout<

"<

}

}

else

{

intsign=judge(r,j1,i1);

if(sign!

=11111)

{

n4[last[3]].next=sign;

n4[sign].front=last[3];

strcpy(n4[sign].name,r);

last[3]=sign;

num[3]++;

locat[3].sit=sign;

locat[3].number=num[3];

}

else

{

cout<

"<

}

}

}

else

{

inti1=0;

intj1,min1=num[i1];//min表示四个窗口中最小的队伍

for(j1=0;j1<=3;j1++)

{

if(min1>num[j1])

{

min1=num[j1];

i1=j1;//i1表示最短队伍

}

}

if(num[i1]<=locat[i].number)//每队中最后的那个排在最前的朋友比其他最短的队要后

{

j1=hash(r);//此时j1代表哈希函数返回的值

if(0==i1)

{

intsign=judge(r,j1,i1);

if(sign!

=11111)

{

n1[last[0]].next=sign;

n1[sign].front=last[0];

strcpy(n1[sign].name,r);

last[0]=sign;

num[0]++;

locat[0].sit=sign;

locat[0].number=num[0];

}

else

{

cout<

"<

}

}

elseif(1==i1)

{

intsign=judge(r,j1,i1);

if(sign!

=11111)

{

n2[last[1]].next=sign;

n2[sign].front=last[1];

strcpy(n2[sign].name,r);

last[1]=sign;

num[1]++;

locat[1].sit=sign;

locat[1].number=num[1];

}

else

{

cout<

"<

}

}

elseif(2==i1)

{

intsign=judge(r,j1,i1);

if(sign!

=11111)

{

n3[last[2]].next=sign;

n3[sign].front=last[2];

strcpy(n3[sign].name,r);

last[2]=sign;

num[2]++;

locat[2].sit=sign;

locat[2].number=num[2];

}

else

{

cout<

"<

}

}

else

{

intsign=judge(r,j1,i1);

if(sign!

=11111)

{

n4[last[3]].next=sign;

n4[sign].front=last[3];

strcpy(n4[sign].name,r);

last[3]=sign;

num[3]++;

locat[3].sit=sign;

locat[3].number=num[3];

}

else

{

cout<

"<

}

}

}

elseif(num[i1]>locat[i].number&&locat[i].number!

=0)//当最后的那个队友比其他最短的对要前时,且不是排在第一个

{

j=hash(r);//此时j代表哈希函数返回的值

if(0==i)

{

intJ=judge(r,j,i);

if(J!

=11111)

{

n1[J].next=n1[locat[0].sit].next;

n1[locat[0].sit].next=J;

strcpy(n1[J].name,r);

n1[J].front=locat[0].sit;

locat[0].sit=J;

locat[0].number++;

num[0]++;

}

else

{

cout<

"<

}

}

elseif(1==i)

{

intJ=judge(r,j,i);

if(J!

=11111)

{

n2[J].next=n2[locat[1].sit].next;

n2[locat[1].sit].next=J;

strcpy(n2[J].name,r);

n2[J].front=locat[1].sit;

locat[1].sit=J;

locat[1].number++;

num[1]++;

}

else

{

cout<

"<

}

}

elseif(2==i)

{

intJ=judge(r,j,i);

if(J!

=11111)

{

n3[J].next=n3[locat[2].sit].next;

n3[locat[2].sit].next=J;

strcpy(n3[J].name,r);

n3[J].front=locat[2].sit;

locat[2].sit=J;

locat[2].number++;

num[2]++;

}

else

{

cout<

"<

}

}

else

{

intJ=judge(r,j,i);

if(J!

=11111)

{

n4[J].next=n4[locat[3].sit].next;

n4[locat[3].sit].next=J;

strcpy(n4[J].name,r);

n4[J].front=locat[3].sit;

locat[3].sit=J;

locat[3].number++;

num[3]++;

}

else

{

cout<

"<

}

}

}

}

}

}

voidshow()

{

time_tt;tm*it;t=time(NULL);it=localtime(&t);

intk[4];

intnumber[4];

for(intT=0;T<=3;T++)

{

k[T]=it->tm_min+it->tm_hour*100;

number[T]=k[T]-Time[T];

}

intx=front[0];

intx1;

inti=0;

intb=0;//判断是否运行了下面的循环

inta1,a2,a3,a4;//判断四个窗口的人员情况

for(a1=0;i

{

if(front[0]==last[0])

{

b=1;

a1=1;//代表1号窗口没人了

break;

}

n1[x].front=0;

x1=n1[x].next;

n1[x].next=0;

x=x1;

front[0]=x;

b=1;

}

if(1!

=a1&&b==1)

{

n1[front[0]].front=999;

Time[0]=k[0];

}

x=front[1];

i=0;

b=0;

if(number[1]>2||number[1]==2)

{

for(a2=0;i

{

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 商业计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1