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{