版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据结构常用算法集合voidUnion(List&La,ListLb)/算法2.1/将所有在线性表Lb中但不在La中的数据元素插入到La中intLa_len,Lb_len,i;ElemTypee;La_len=ListLength(La);/求线性表的长度Lb_len=ListLength(Lb);for(i=1;i<=Lb_len;i+)GetElem(Lb,i,e);/取Lb中第i个数据元素赋给if(!LocateElem(La,e,equal)La中不存在和e相同的数据元素ListInsert(La,+La_len,e);/插入/unionvoidMergeList(Lis
2、tLa,ListLb,List&Lc)/算法2.2/已知线性表La和Lb中的元素按值非递减排列。/归并La和Lb得到新的线性表Lc,Lc的元素也按值非递减排列。intLa_len,Lb_len;ElemTypeai,bj;inti=1,j=1,k=0;InitList(Lc);La_len=ListLength(La);Lb_len=ListLength(Lb);while(i<=La_len)&&(j<=Lb_len)/La和Lb均非空GetElem(La,i,ai);GetElem(Lb,j,bj);if(ai<=bj)ListInsert(Lc,
3、+k,ai);+i;elseListInsert(Lc,+k,bj);+j;while(i<=La_len)GetElem(La,i+,ai);ListInsert(Lc,+k,ai);while(j<=Lb_len)GetElem(Lb,j+,bj);ListInsert(Lc,+k,bj);)/MergeListStatusInitList_Sq(SqList&L)/算法2.3/构造一个空的线性表L。L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType);if(!L.elem)returnOK;/存储分配失败L.
4、length=0;/空表长度为0L.listsize=LIST_INIT_SIZE;/初始存储容量returnOK;/InitList_SqStatusListInsert_Sq(SqList&L,inti,ElemTypee)/算法2.4/在顺序线性表L的第i个元素之前插入新的元素e,/i的合法值为1wiwListLength_Sq(L)+1ElemType*p;if(i<1|i>L.length+1)returnERROR;/i值不合法if(L.length>=L.listsize)/当前存储空间已满,增加容量ElemType*newbase=(ElemType*
5、)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType);if(!newbase)returnERROR;/存储分配失败L.elem=newbase;/新基址L.listsize+=LISTINCREMENT;/增力口存储容量ElemType*q=&(L.elemi-1);/q为插入位置for(p=&(L.elemL.length-1);p>=q;-p)*(p+1)=*p;/插入位置及之后的元素右移*q=e;/插入e+L.length;/表长增1returnOK;/ListInsert_SqStatusList
6、Delete_Sq(SqList&L,inti,ElemType&e)/算法2.5在顺序线性表L中删除第i个元素,并用e返回其值。/i的合法值为1wiwListLength_Sq(L)。ElemType*p,*q;if(i<1|i>L.length)returnERROR;/i值不合法p=&(L.elemi-1);/p为被删除元素的位置e=*p;被删除元素的值赋给eq=L.elem+L.length-1;for(+p;p<=q;+p)*(p-1)=*p;-L.length;returnOK;/ListDelete_Sq/表尾元素的位置/被删除元素之后的
7、元素左移/表长减1intLocateElem_Sq(SqListL,ElemTypee,Status(*compare)(ElemType,ElemType)/算法2.6/在顺序线性表L中查找第1个值与e满足compare()的元素的位序。/若找到,则返回其在L中的位序,否则返回0inti;ElemType*p;i=1;/i的初值为第1个元素的位序p=L.elem;/p的初值为第1个元素的存储位置while(i<=L.length&&!(*compare)(*p+,e)+i;if(i<=L.length)returni;elsereturn0;/LocateElem
8、_SqvoidMergeList_Sq(SqListLa,SqListLb,SqList&Lc)/算法2.7/已知顺序线性表La和Lb的元素按值非递减排列。/归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列。ElemType*pa,*pb,*pc,*pa_last,*pb_last;pa=La.elem;pb=Lb.elem;Lc.listsize=Lc.length=La.length+Lb.length;pc=Lc.elem=(ElemType*)malloc(Lc.listsize*sizeof(ElemType);if(!Lc.elem)exit(OVERFLO
9、W);/存储分配失败pa_last=La.elem+La.length-1;pb_last=Lb.elem+Lb.length-1;while(pa<=pa_last&&pb<=pb_last)/归并if(*pa<=*pb)*pc+=*pa+;else*pc+=*pb+;while(pa<=pa_last)*pc+=*pa+;/插入La的剩余元素while(pb<=pb_last)*pc+=*pb+;/插入Lb的剩余元素/MergeListStatusGetElem_L(LinkList&L,inti,ElemType&e)/算法2
10、.8/L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回ERRORLinkListp;p=L->next;intj=1;初始化,p指向第一个结点,j为计数器while(p&&j<i)/顺指针向后查找,直到p指向第i个元素或p为空p=p->next;+j;if(!p|j>i)returnERROR;/第i个元素不存在e=p->data;/取第i个元素returnOK;/GetElem_LStatusListInsert_L(LinkList&L,inti,ElemTypee)/算法2.9/在带头结点的单链线性表L
11、的第i个元素之前插入元素eLinkListp,s;p=L;intj=0;while(p&&j<i-1)/寻找第i-1个结点p=p->next;+j;if(!p|j>i-1)returnERROR;/i小于1或者大于表长s=(LinkList)malloc(sizeof(LNode);/生成新结点s->data=e;s->next=p->next;/插入L中p->next=s;returnOK;/LinstInsert_LStatusListDelete_L(LinkList&L,inti,ElemType&e)/算法2.
12、10在带头结点的单链线性表L中,删除第i个元素,并由e返回其值LinkListp,q;p=L;intj=0;while(p->next&&j<i-1)寻找第i个结点,并令p指向其前趋p=p->next;+j;if(!(p->next)|j>i-1)returnERROR;/删除位置不合理q=p->next;p->next=q->next;/删除并释放结点e=q->data;free(q);returnOK;/ListDelete_LvoidCreateList_L(LinkList&L,intn)/算法2.11/逆位
13、序输入(随机产生)n个元素的值,建立带表头结点的单链线性表LLinkListp;inti;L=(LinkList)malloc(sizeof(LNode);L->next=NULL;/先建立一个带头结点的单链表for(i=n;i>0;-i)p=(LinkList)malloc(sizeof(LNode);/生成新结点p->data=random(200);改为一个随机生成的数字(200以内)p->next=L->next;L->next=p;/插入至U表头/CreateList_LvoidMergeList_L(LinkList&La,LinkLis
14、t&Lb,LinkList&Lc)/算法2.12/已知单链线性表La和Lb的元素按值非递减排列。/归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列。LinkListpa,pb,pc;pa=La->next;pb=Lb->next;Lc=pc=La;/用La的头结点作为Lc的头结点while(pa&&pb)if(pa->data<=pb->data)pc->next=pa;pc=pa;pa=pa->next;elsepc->next=pb;pc=pb;pb=pb->next;pc->nex
15、t=pa?pa:pb;/插入剩余段free(Lb);/释放Lb的头结点/MergeList_LintLocateElem_SL(SLinkListS,ElemTypee)/算法2.13/在静态单链线性表L中查找第1个值为e的元素。/若找到,则返回它在L中的位序,否则返回0。inti;i=S0.cur;/i指示表中第一个结点while(i&&Si.data!=e)i=Si.cur;/在表中顺链查找returni;/LocateElem_SLvoidInitSpace_SL(SLinkListspace)/算法2.14/将一维数组space中各分量链成一个备用链表,space0.c
16、ur为头指针,/"0"表示空指针for(inti=0;i<MAXSIZE-1;+i)spacei.cur=i+1;spaceMAXSIZE-1.cur=0;/InitSpace_SLintMalloc_SL(SLinkList&space)/算法2.15/若备用空间链表非空,则返回分配的结点下标,否则返回0inti=space0.cur;if(space0.cur)space0.cur=spacespace0.cur.cur;returni;/Malloc_SLvoidFree_SL(SLinkList&space,intk)/算法2.16将下标为k的
17、空闲结点回收到备用链表spacek.cur=space0.cur;space0.cur=k;/Free_SLvoiddifference(SLinkList&space,int&S)/算法2.17/依次输入集合A和B的元素,在一维数组space中建立表示集合(A-B)U(B-A)/的静态链表,S为头指针。假设备用空间足够大,space0.cur为头指针。/初始化备用空间/生成S的头结点/r指向S的当前最后结点/输入A的元素个数/输入B的元素个数inti,j,k,m,n,p,r;ElemTypeb;InitSpace_SL(space);S=Malloc_SL(space);r=
18、S;m=random(2,8);n=random(2,8);printf("A=(");initrandom_c1();for(j=1;j<=m;+j)i=Malloc_SL(space);/printf("i=%d",i);/建立集合A的链表/分配结点spacei.data=random_next_c1();/输入A的元素值printf("%c",spacei.data);/输出A的元素spacer.cur=i;r=i;/插入至U表尾printf(")n");spacer.cur=0;/尾结点的指针为空in
19、itrandom_c1();printf("B=(");for(j=1;j<=n;+j)/依次车入B的元素,若不在当前表中,则插入,否则删除b=random_next_c1();/输入B的元素值printf("%c",b);/输出B的元素p=S;k=spaceS.cur;/k指向集合A中第一个结点while(k!=spacer.cur&&spacek.data!=b)/在当前表中查找p=k;k=spacek.cur;if(k=spacer.cur)/当前表中不存在该元素,插入在r所指结点之后,且r的位置不变i=Malloc_SL(s
20、pace);spacei.data=b;spacei.cur=spacer.cur;spacer.cur=i;else/该元素已在表中,删除之spacep.cur=spacek.cur;Free_SL(space,k);if(r=k)r=p;/若删除的是尾元素,则需修改尾指针printf(")n");/differenceDuLinkListGetElemP_DuL(DuLinkListva,inti)/L为带头结点的单链表的头指针。/当第i个元素存在时,其值赋给e并返回OK,否则返回ERRORDuLinkListp;p=va->next;intj=1;/初始化,p指
21、向第一个结点,j为计数器while(p!=va&&j<i)/顺指针向后查找,直到p指向第i个元素或p为空p=p->next;+j;if(p=va&&j<i)returnNULL;/第i个元素不存在elsereturnp;/GetElem_LStatusListInsert_DuL(DuLinkList&L,inti,ElemTypee)/算法2.18/在带头结点的双链循环线性表L的第i个元素之前插入元素e,/i的合法值为1Wiw表长+1。DuLinkListp,s;if(!(p=GetElemP_DuL(L,i)在L中确定第i个元素的位
22、置指针preturnERROR;/p=NULL,即第i个元素不存在if(!(s=(DuLinkList)malloc(sizeof(DuLNode)returnERROR;s->data=e;s->prior=p->prior;p->prior->next=s;s->next=p;p->prior=s;returnOK;/ListInsert_DuLDuLinkListGetElemP_DuL(DuLinkListva,inti)/L为带头结点的单链表的头指针。/当第i个元素存在时,其值赋给e并返回OK,否则返回ERRORDuLinkListp;p=v
23、a->next;intj=1;/初始化,p指向第一个结点,j为计数器while(p!=va&&j<i)顺指针向后查找,直到p指向第i个元素或p为空p=p->next;+j;if(p=va|j<i)returnNULL;/第i个元素不存在elsereturnp;/GetElem_LStatusListDelete_DuL(DuLinkList&L,inti,ElemType&e)算法2.19/删除带头结点的双链循环线性表L的第i个元素,i的合法值为iwiw表长DuLinkListp;if(!(p=GetElemP_DuL(L,i)在L中确定
24、第i个元素的位置指针preturnERROR;/p=NULL,即第i个元素不存在e=p->data;p->prior->next=p->next;p->next->prior=p->prior;free(p);returnOK;/ListDelete_DuLStatusListInsert_L(NLinkListL,inti,ElemTypee)/算法2.20/在带头结点的单链线性表L的第i个元素之前插入元素eNLinkh,s;if(!LocatePos(L,i-1,h)returnERROR;/i值不合法if(!MakeNode(s,e)return
25、ERROR;/结点存储分配失败InsFirst(h,s);/对于从第i结点开始的链表,第i-1结点是它的头结点returnOK;/ListInsert_LStatusMergeList_L(NLinkList&La,NLinkList&Lb,NLinkList&Lc,int(*compare)(ElemType,ElemType)/算法2.21/已知单链线性表La和Lb的元素按值非递减排列。/归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列。NLinkha,hb;Positionpa,pb,q;ElemTypea,b;if(!InitList(Lc)re
26、turnERROR;/存储空间分配失败ha=GetHead(La);/ha和hb分别指向La和Lb的头结点hb=GetHead(Lb);pa=NextPos(La,ha);/pa和pb分别指向La和Lb中当前结点pb=NextPos(Lb,hb);while(pa&&pb)/La和Lb均非空a=GetCurElem(pa);/a和b为两表中当前比较元素b=GetCurElem(pb);if(*compare)(a,b)<=0)/a<bDelFirst(ha,q);Append(Lc,q);pa=NextPos(La,pa);else/a>bDelFirst(h
27、b,q);Append(Lc,q);pb=NextPos(Lb,pb);/whileif(pa)Append(Lc,pa);/链接La中剩余结点elseAppend(Lc,pb);/链接Lb中剩余结点FreeNode(ha);FreeNode(hb);/释放La和Lb的头结点returnOK;/MergeList_LStatuscmp(PElemTypea,PElemTypeb)if(a.expn>=b.expn)return1;elsereturn0;voidCreatPolyn(PLinkList&P,intm)/算法2.22/输入m项的系数和指数,建立表示一元多项式的有序链
28、表PPLinkh,q,s;PElemTypee;inti;InitList(P);h=GetHead(P);e.coef=0.0;e.expn=-1;SetCurElem(h,e);/设置头结点for(i=1;i<=m;+i)/依次本入m个非零项/scanf("%f,%dn",&e.coef,&e.expn);e.coef=(float)(random(1,90)+random(10)/10.0);if(random(2)e.coef=-e.coef;e.expn=e.expn+random(1,10);/产生随机的数据,但是expn值是递增的if(!
29、LocateElem(P,e,q,cmp)当前链表中不存在该指数项if(MakeNode(s,e)InsFirst(q,s);/生成结点并插入链表if(q=P.tail)P.tail=s;elsei-;/如果没有产生插入,则将i值减1)/CreatPolynStatusPrintfPoly(PLinkListP)inti=0;PLinkq=P.head->next;while(q)if(fabs(q->data.coef)>0.005)if(i>0)if(q->data.coef>0.005)printf("+");elseprintf(
30、"-");printf("%.2f",fabs(q->data.coef);elseprintf("%.2f",q->data.coef);if(q->data.expn>=1)printf("x");if(q->data.expn>1)printf("A%d",q->data.expn);q=q->next;if(+i%6=0)printf("n");printf("n");returnOK;intComp
31、are(PElemTypea,PElemTypeb)if(a.expn<b.expn)return-1;if(a.expn>b.expn)return1;return0;voidAddPolyn(PLinkList&Pa,PLinkList&Pb)/算法2.23/多项式加法:Pa=Pa+Pb,利用两个多项式的结点构成"和多项式"。PLinkha,hb,qa,qb;PElemTypea,b,temp;floatsum;ha=GetHead(Pa);/ha和hb分别指向Pa和Pb的头结点hb=GetHead(Pb);qa=NextPos(Pa,ha)
32、;/qa和qb分别指向La和Lb中当前结点qb=NextPos(Pb,hb);while(qa&&qb)/Pa和Pb均非空a=GetCurElem(qa);/a和b为两表中当前比较元素b=GetCurElem(qb);switch(Compare(a,b)case-1:/多项式PA中当前结点的指数值小ha=qa;qa=NextPos(Pa,qa);break;case0:/两者的指数值相等sum=a.coef+b.coef;if(sum!=0.0)修改多项式PA中当前结点的系数值temp.coef=sum;temp.expn=a.expn;SetCurElem(qa,temp)
33、;ha=qa;else删除多项式PA中当前结点DelFirst(ha,qa);FreeNode(qa);DelFirst(hb,qb);FreeNode(qb);qb=NextPos(Pb,hb);qa=NextPos(Pa,ha);break;case1:/多项式PB中当前结点的指数值小DelFirst(hb,qb);InsFirst(ha,qb);qb=NextPos(Pb,hb);ha=NextPos(Pa,ha);break;/switch/whileif(!Empty(Pb)Append(Pa,qb);/链接Pb中剩余结点FreeNode(hb);/释放Pb的头结点/AddPolyn
34、voidconversion(intNum)/算法3.1/对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数ElemTypee;SqStackS;InitStack(S);/构造空栈while(Num)Push(S,Num%8);Num=Num/8;while(!StackEmpty(S)Pop(S,e);printf("%d",e);printf("n");/conversionvoidLineEdit()/算法3.2利用字符栈S,从终端接收一行并传送至调用过程的数据区。charch,*temp;SqStackS;InitStack(S);构
35、造空栈Sprintf("请输入一行(#:退格;:清行):n");ch=getchar();从终端接收第一个字符while(ch!=EOF)/EOF为全文结束符while(ch!=EOF&&ch!='n')switch(ch)case'#':Pop(S,ch);break;/仅当栈非空时退栈case'':ClearStack(S);break;/重置S为空栈default:Push(S,ch);break;/有效字符进栈,未考虑栈满情形ch=getchar();/从终端接收下一个字符)temp=S.base;wh
36、ile(temp!=S.top)printf("%c",*temp);+temp;)/将从栈底到栈顶的栈内字符传送至调用过程的数据区;ClearStack(S);/重置S为空栈printf("n");if(ch!=EOF)printf("请输入一行(#:退格;:清行):n");ch=getchar();)DestroyStack(S);)StatusPass(MazeTypeMyMaze,PosTypeCurPos);voidFootPrint(MazeType&MyMaze,PosTypeCurPos);voidMarkPr
37、int(MazeType&MyMaze,PosTypeCurPos);PosTypeNextPos(PosTypeCurPos,intDir);StatusMazePath(MazeType&maze,PosTypestart,PosTypeend)/算法3.3若迷宫maze中从入口start到出口end的通道,则求得一条存放在栈中/(从栈底到栈顶),并返回TRUE;否则返回FALSEStackS;PosTypecurpos;intcurstep;SElemTypee;InitStack(S);curpos=start;/设定"当前位置"为"入口位
38、置"curstep=1;/探索第一步doif(Pass(maze,curpos)/当前位置可通过,即是未曾走到过的通道块FootPrint(maze,curpos);/留下足迹e.di=1;e.ord=curstep;e.seat=curpos;Push(S,e);/加入路径if(curpos.r=end.r&&curpos.c=end.c)return(TRUE);/到达终点(出口)curpos=NextPos(curpos,1);/下一位置是当前位置的东邻curstep+;/探索下一步else/当前位置不能通过if(!StackEmpty(S)Pop(S,e);w
39、hile(e.di=4&&!StackEmpty(S)MarkPrint(maze,e.seat);Pop(S,e);/留下不能通过的标记,并退回一步/whileif(e.di<4)e.di+;Push(S,e);/换下一个方向探索curpos=NextPos(e.seat,e.di);/当前位置设为新方向的相邻块/if/if/elsewhile(!StackEmpty(S);returnFALSE;/MazePathStatusPass(MazeTypeMyMaze,PosTypeCurPos)if(MyMaze.arrCurPos.rCurPos.c='
40、9;)return1;/如果当前位置是可以通过,返回1elsereturn0;/其它情况返回0voidFootPrint(MazeType&MyMaze,PosTypeCurPos)MyMaze.arrCurPos.rCurPos.c='*'voidMarkPrint(MazeType&MyMaze,PosTypeCurPos)MyMaze.arrCurPos.rCurPos.c='!'PosTypeNextPos(PosTypeCurPos,intDir)PosTypeReturnPos;switch(Dir)case 1:ReturnPos.
41、r=CurPos.r;ReturnPos.c=CurPos.c+1;break;case 2:ReturnPos.r=CurPos.r+1;ReturnPos.c=CurPos.c;break;case 3:ReturnPos.r=CurPos.r;ReturnPos.c=CurPos.c-1;break;case 4:ReturnPos.r=CurPos.r-1;ReturnPos.c=CurPos.c;break;returnReturnPos;#defineOPSETSIZE7unsignedcharPrior77=表3.1算符间的优先关系'>','>
42、','<','<','<','>','>','>','>','<','<','<','>','>','>','>','>','>','<','>','>','>
43、','>','>','>','<','>','>','<'.'<'.'<'.'<'.'<'.'='.''.'>','>','>','>','','>','>','
44、<','<','<','<','<','','='floatOperate(floata,unsignedchartheta,floatb);charOPSETOPSETSIZE='+','-','*','/','(',')','#'StatusIn(charTest,char*TestOp);charprecede(charAop,charBop);
45、floatEvaluateExpression(char*MyExpression)/算法3.4/算术表达式求值的算符优先算法。/设OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合。StackCharOPTR;/运算符栈,字符元素StackFloatOPND;/运算数栈,实数元素charTempData20;floatData,a,b;chartheta,*c,x,Dr2;InitStack(OPTR);Push(OPTR,'#');InitStack(OPND);c=MyExpression;strcpy(TempData,"0");while
46、(*c!='#'|GetTop(OPTR)!='#')if(!In(*c,OPSET)Dr0=*c;Dr1='0'strcat(TempData,Dr);c+;if(In(*c,OPSET)Data=(float)atof(TempData);Push(OPND,Data);strcpy(TempData,"0");else/不是运算符则进栈switch(precede(GetTop(OPTR),*c)case'<':/栈顶元素优先权低Push(OPTR,*c);c+;break;case'=
47、39;:/脱括号并接收下一字符Pop(OPTR,x);c+;break;case'>':/退栈并将运算结果入栈Pop(OPTR,theta);Pop(OPND,b);Pop(OPND,a);Push(OPND,Operate(a,theta,b);break;/switch)/whilereturnGetTop(OPND);/EvaluateExpressionfloatOperate(floata,unsignedchartheta,floatb)switch(theta)case'+':returna+b;case'-':returna
48、-b;case'*':returna*b;case'/':returna/b;default:return0;StatusIn(charTest,char*TestOp)boolFind=false;for(inti=0;i<OPSETSIZE;i+)if(Test=TestOpi)Find=true;returnFind;intReturnOpOrd(charop,char*TestOp)inti;for(i=0;i<OPSETSIZE;i+)if(op=TestOpi)returni;return0;charprecede(charAop,cha
49、rBop)returnPriorReturnOpOrd(Aop,OPSET)ReturnOpOrd(Bop,OPSET);intCount=0;voidmove(charx,intn,charz);voidhanoi(intn,charx,chary,charz)/算法3.5/将塔座x上按直径由小到大且至上而下编号为1至n的n个圆盘按规则搬到塔座z上,y可用作辅助塔座。搬动操作move(x,n,z)可定义为:/(c是初值为0的全局变量,对搬动计数)/printf("%i.Movedisk%ifrom%cto%cn",+c,n,x,z);if(n=1)move(x,1,z);
50、将编号为1的圆盘从x移到zelsehanoi(n-1,x,z,y);move(x,n,z);将编号为n的圆盘从x移到zhanoi(n-1,y,x,z);将y上编号为1至n-1的圆盘移到z,x作辅助塔voidmove(charx,intn,charz)printf(/程序中用到的主要变量EventListev;Eventen;LinkQueueq5;QElemTypecustomer;intTotalTime,CustomerNum;intCloseTime;%2i.Movedisk%ifrom%cto%cn",+Count,n,x,z);/事件表/事件/4个客户队列,q0未用/客户记
51、录/累计客户逗留时间,客户数/算法3.7intcmp(Eventa,Eventb)/依事件a的发生时刻<或=或事件b的发生时刻分别返回-1或。或1if(a.OccurTime<b.OccurTime)return-1;if(a.OccurTime>b.OccurTime)return+1;return0;voidRandom(int&durtime,int&intertime)/生成随机数durtime=random(2,10);intertime=random(10);intMinimum(LinkQueueq)/求长度最短队列intminlen=Queue
52、Length(q1);inti=1;for(intj=2;j<=4;j+)if(QueueLength(qj)<minlen)minlen=QueueLength(qj);i=j;)returni;voidOpenForDay()/初始化操作TotalTime=0;CustomerNum=0;/初始化累计时间和客户数为0InitList(ev);/初始化事件链表为空表en.OccurTime=0;en.NType=0;设定第一个客户到达事件OrderInsert(ev,en,cmp);/按事件发生时刻的次序插入事件表for(inti=1;i<=4;+i)InitQueue(q
53、i);/置空队列/OpenForDayvoidCustomerArrived()/处理客户到达事件,en.NType=0intdurtime,intertime,i,t;+CustomerNum;printf("Customer%darrivedat%dand",CustomerNum,en.OccurTime);Random(durtime,intertime);/生成随机数t=en.OccurTime+intertime;/下一客户到达时刻if(t<CloseTime)/银行尚未关门,插入事件表OrderInsert(ev,MakeElem(t,0),cmp);i
54、=Minimum(q);/求长度最短队列printf("entertheQueue%dn",i);EnQueue(qi,MakeQElem(en.OccurTime,durtime);if(QueueLength(qi)=1)/设定第i队列的一个离开事件并插入事件表OrderInsert(ev,MakeElem(en.OccurTime+durtime,i),cmp);/CustomerArrivedvoidCustomerDeparture()/处理客户离开事件,en.NType>0printf("Customerdepartureat%dn",
55、en.OccurTime);inti=en.NType;DeQueue(qi,customer);/删除第i队列的排头客户TotalTime+=en.OccurTime-customer.ArrivalTime;/累计客户逗留时间if(!QueueEmpty(qi)设定第i队列的一个离开事件并插入事件表GetHead(qi,customer);OrderInsert(ev,MakeElem(en.OccurTime+customer.Duration,i),cmp);/CustomerDeparturevoidBank_Simulation(intclosetime)inti=0;BLinkp;CloseTime=closetime;printf("Bank_Simulation(%d)银行业务模拟n",
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度养老院食堂与便利店运营管理合同4篇
- 2025年度生态农业大棚使用权转让合同模板4篇
- 2025年度文化产品代理采购合同模板4篇
- 2024版英文技术服务合同范本规范
- 2024进户门销售合同
- 2024诉讼代理委托合同范本
- 2025年度专业论坛会议组织合同范本4篇
- 2025年度数字音乐词曲版权交易合作合同范本4篇
- 2025年度新能源汽车项目代理投标合同样本4篇
- 2024施工简易合同范本(桥梁检测与维修)3篇
- 中国的世界遗产智慧树知到期末考试答案2024年
- 2023年贵州省铜仁市中考数学真题试题含解析
- 世界卫生组织生存质量测量表(WHOQOL-BREF)
- 《叶圣陶先生二三事》第1第2课时示范公开课教学PPT课件【统编人教版七年级语文下册】
- 某送电线路安全健康环境与文明施工监理细则
- GB/T 28885-2012燃气服务导则
- PEP-3心理教育量表-评估报告
- 控制性详细规划编制项目竞争性磋商招标文件评标办法、采购需求和技术参数
- 《增值税及附加税费申报表(小规模纳税人适用)》 及其附列资料-江苏税务
- 中南民族大学中文成绩单
- 危大工程安全管理措施方案
评论
0/150
提交评论