1、C+插队买票此程序必须自己建立 people.txt(进入大厅插队的人) friend.txt(朋友组) input.txt(初始化各个窗口的人) output.txt(输出结果)#include#include#includeusing namespace std;void show();struct NODE /队伍的数据结构 char name20; int front; int next;struct FRIEND /朋友组的数据结构 char name20;struct location /记录每个窗口最后一个朋友的位置及所在个数 int sit; /位置 int number; /
2、第几个 ;NODE n1100; /代表一号窗口NODE n2100; /代表二号窗口NODE n3100; /代表三号窗口NODE n4100; /代表四号窗口int front4,last4; /front指向各个窗口的第一个人,lase指向最后一个(下标)location locat4; int num4; /记录每个窗口的人数FRIEND F100; /朋友的信息 int numfriend=0; /记录朋友的个数int Time4; /记录时间,通过它来体现各窗口的售票速度ofstream outfile(output.txt,ios:out);int hash(char r) /r
3、是排队人姓名 for(int i=0;ri!=0;i+); if(i=4) return (r1+27*r2+27*27*r3+27*27*27*r4)%103; else return (r1+27*r2+27*27*r3)%103;int judge(char r,int n,int m) /冲突处理函数,n表示哈希值,m表示第几个窗口 int x=1; /用来进行平方探测 int y=1; if(0=m) if(n1n.front=0) return n; else for(int n2=n;n1n.front!=0&n=0;)/平方探测再散列 n=n2+x*x*y; if(y0) x+
4、; y=y*(-1); if(n=0) return n; else cout无法入队!是否清除无关人员?(Y/N)F; if(F=y|F=Y) show(); return 11111; else if(F=n|F=N) cout无法入队!endl; else cout没有您所选择的操作!endl; else if(1=m) if(n2n.front=0) return n; else for(int n1=n;n2n.front!=0&n=0;)/平方探测再散列 n=n1+x*x*y; if(y0) x+; y=y*(-1); if(n=0) return n; else cout是否清除
5、无关人员?(Y/N)F; if(F=y|F=Y) show(); else if(F=n|F=N) cout无法入队!endl; else cout没有您所选择的操作!endl; else if(2=m) if(n3n.front=0) return n; else for(int n1=n;n3n.front!=0&n=0;)/平方探测再散列 n=n1+x*x*y; if(y0) x+; y=y*(-1); if(n=0) return n; else cout是否清除无关人员?(Y/N)F; if(F=y|F=Y) show(); else if(F=n|F=N) cout无法入队!end
6、l; else cout没有您所选择的操作!endl; else if(n4n.front=0) return n; else for(int n1;n4n.front!=0&n=0;)/平方探测再散列 n=n1+x*x*y; if(y0) x+; y=y*(-1); if(n=0) return n; else cout是否清除无关人员?(Y/N)F; if(F=y|F=Y) show(); else if(F=n|F=N) cout无法入队!endl; else cout没有您所选择的操作!endl; void insert(char r) /r是排队人姓名 int a=0; /标记r是否
7、在朋友组中,a=1表明r在朋友组中 for(int i=0;inumfriend;i+) if(strcmp(Fi.name,r)=0)a=1;break; if(0=a) i=0; int j,min=numi; /min表示四个窗口中最小的队伍 for(j=0;jnumj) min=numj; i=j; /i表示最短队伍 j=hash(r); /此时j代表哈希函数返回的值 int k=judge(r,j,i); /k标记插入在哪个位置 if(k!=11111) if(0=i) n1last0.next=k; n1k.front=last0; strcpy(n1k.name,r); last
8、0=k; num0+; else if(1=i) n2last1.next=k; n2k.front=last1; strcpy(n2k.name,r); last1=k; num1+; else if(2=i) n3last2.next=k; n3k.front=last2; strcpy(n3k.name,r); last2=k; num2+; else n4last3.next=k; n4k.front=last3; strcpy(n4k.name,r); last3=k; num3+; else coutr 无法入队!endl; else int i=0,k=0; /k用来标记队伍中是
9、否有自己的朋友,k=0表示没有 int j,min; /min表示四个窗口中朋友的最后位置最前的队伍 for(i=0;i=3;i+) if(locati.number!=0) min=locati.number; k=1; j=i; i=j; j=0; for(j=0;jlocatj.number&locatj.number!=0) min=locatj.number; i=j; /i表示那个窗口朋友的位置最前 if(0=k) int i1=0; int j1,min1=numi1; /min1表示四个窗口中最小的队伍 for(j1=1;j1numj1) min1=numj1; i1=j1;
10、j1=hash(r); /此时j代表哈希函数返回的值 if(0=i1) int sign=judge(r,j1,i1); if(sign!=11111) n1last0.next=sign; n1sign.front=last0; strcpy(n1sign.name,r); last0=sign; num0+; locat0.sit=sign; locat0.number=num0; else coutr 无法入队!endl; else if(1=i1) int sign=judge(r,j1,i1); if(sign!=11111) n2last1.next=sign; n2sign.fr
11、ont=last1; strcpy(n2sign.name,r); last1=sign; num1+; locat1.sit=sign; locat1.number=num1; else coutr 无法入队!endl; else if(2=i1) int sign=judge(r,j1,i1); if(sign!=11111) n3last2.next=sign; n3sign.front=last2; strcpy(n3sign.name,r); last2=sign; num2+; locat2.sit=sign; locat2.number=num2; else coutr 无法入队
12、!endl; else int sign=judge(r,j1,i1); if(sign!=11111) n4last3.next=sign; n4sign.front=last3; strcpy(n4sign.name,r); last3=sign; num3+; locat3.sit=sign; locat3.number=num3; else coutr 无法入队!endl; else int i1=0; int j1,min1=numi1; /min表示四个窗口中最小的队伍 for(j1=0;j1numj1) min1=numj1; i1=j1; /i1表示最短队伍 if(numi1=
13、locati.number) /每队中最后的那个排在最前的朋友比其他最短的队要后 j1=hash(r); /此时j1代表哈希函数返回的值 if(0=i1) int sign=judge(r,j1,i1); if(sign!=11111) n1last0.next=sign; n1sign.front=last0; strcpy(n1sign.name,r); last0=sign; num0+; locat0.sit=sign; locat0.number=num0; else coutr 无法入队!endl; else if(1=i1) int sign=judge(r,j1,i1); if
14、(sign!=11111) n2last1.next=sign; n2sign.front=last1; strcpy(n2sign.name,r); last1=sign; num1+; locat1.sit=sign; locat1.number=num1; else coutr 无法入队!endl; else if(2=i1) int sign=judge(r,j1,i1); if(sign!=11111) n3last2.next=sign; n3sign.front=last2; strcpy(n3sign.name,r); last2=sign; num2+; locat2.sit
15、=sign; locat2.number=num2; else coutr 无法入队!endl; else int sign=judge(r,j1,i1); if(sign!=11111) n4last3.next=sign; n4sign.front=last3; strcpy(n4sign.name,r); last3=sign; num3+; locat3.sit=sign; locat3.number=num3; else coutr 无法入队!locati.number&locati.number!=0)/当最后的那个队友比其他最短的对要前时,且不是排在第一个 j=hash(r);
16、/此时j代表哈希函数返回的值 if(0=i) int J=judge(r,j,i); if(J!=11111) n1J.next=n1locat0.sit.next; n1locat0.sit.next=J; strcpy(n1J.name,r); n1J.front=locat0.sit; locat0.sit=J; locat0.number+; num0+; else coutr 无法入队!endl; else if(1=i) int J=judge(r,j,i); if(J!=11111) n2J.next=n2locat1.sit.next; n2locat1.sit.next=J;
17、 strcpy(n2J.name,r); n2J.front=locat1.sit; locat1.sit=J; locat1.number+; num1+; else coutr 无法入队!endl; else if(2=i) int J=judge(r,j,i); if(J!=11111) n3J.next=n3locat2.sit.next; n3locat2.sit.next=J; strcpy(n3J.name,r); n3J.front=locat2.sit; locat2.sit=J; locat2.number+; num2+; else coutr 无法入队!endl; el
18、se int J=judge(r,j,i); if(J!=11111) n4J.next=n4locat3.sit.next; n4locat3.sit.next=J; strcpy(n4J.name,r); n4J.front=locat3.sit; locat3.sit=J; locat3.number+; num3+; else coutr 无法入队!endl; void show() time_t t;tm*it;t=time(NULL);it=localtime(&t); int k4; int number4; for(int T=0;Ttm_min+it-tm_hour*100; numberT=kT-TimeT; int x=front0; int x1; int i=0; int b=0; /判断是否运行了下面的循环 int a1,a2,a3,a4; /判断四个窗口的人员情况 for(a1=0;i2|number1=2) for(a2=0;inumber1;i=i+2) /清除2号窗口的无关人员,即买好票的人,速度两秒一人
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1