C++插队买票.docx
- 文档编号:9242217
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:42
- 大小:21.41KB
C++插队买票.docx
《C++插队买票.docx》由会员分享,可在线阅读,更多相关《C++插队买票.docx(42页珍藏版)》请在冰豆网上搜索。
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 {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 插队 买票