public void CustomerArrived() { en.Select = rd.Next(1, 4); //生成顾客级别 CurrentTime = en.ArriveTime; //更改系统当前时间 ++CustomerNum; //增加客户数量 en.Number = CustomerNum; //记录客户编号 int durTime = rd.Next(600, 3601); //产生600-3600秒(10分钟到一小时)间的随机整数,为到达客户进行理发需要的时间。 int interTime = rd.Next(0, 601); //产生0-600秒 间的随机整数,为与下一客户到达时间的时间间隔。 int arrT = en.ArriveTime + interTime; //计算下一个顾客的到达时间 //开始排队,找到最短队伍,并加入队伍。 int i = MinQueue(en.Select); //找到该级别理发师队列最短的队伍 en.NType = i; en.dur = durTime; cn.ArriveTime = en.ArriveTime; //顾客的到达时间 cn.Duration = durTime; //顾客的服务时间 cn.Number = en.Number; //顾客的编号 if (en.Select == 1) //选择相应的理发师队伍入队 { QStaff1[i].EnQueue(cn); } else if (en.Select == 2) { QStaff2[i].EnQueue(cn); } else if (en.Select == 3) { QStaff3[i].EnQueue(cn); } Sum_Queue();//更新等待队列的长度 int cur; text.Text = "第" + (++Number_event).ToString() + "个事件 " + "有新客户! 时间" + StartTime.AddSeconds(cn.ArriveTime).ToLongTimeString().ToString() + "第" + en.Number + "号顾客将由 " + en.Select.ToString() + " 级别的第" + (en.NType + 1).ToString() + " 位理发师进行服务\r\n" + text.Text; //如果当前顾客能立马被服务就将当前顾客离开的事件加入事件链表,否则不加入事件链表 if ((en.Select == 1 && QStaff1[i].Size <= 1) || (en.Select == 2 && QStaff2[i].Size <= 1) || (en.Select == 3 && QStaff3[i].Size <= 1)) { int depT = cn.ArriveTime + durTime; //计算当前顾客的离开时间 en.OccurTime = depT; //记录离开事件的发生时间,即顾客的离开事件 cur = First(en); ev.Insert(cur, en); //插入到事件链表中 TheLeaveTimeOfFirstCustomer_Queue[en.Select, en.NType] = en.OccurTime; } //下一客户到达事件,加入事件列表。 en.ArriveTime = arrT; en.OccurTime = en.ArriveTime; en.NType = 0; en.dur = 0; en.Select = 0; if (en.ArriveTime < CloseTime) //顾客的到达时间小于关店时间就进店,否则不进店 { cur = First(en); ev.Insert(cur, en); } }
static void MySingleLinkedListTest() { MySingleLinkedList <int> linkedList = new MySingleLinkedList <int>(); // Test1:顺序插入4个节点 linkedList.Add(0); linkedList.Add(1); linkedList.Add(2); linkedList.Add(3); Console.WriteLine("The nodes in the linkedList:"); for (int i = 0; i < linkedList.Count; i++) { Console.WriteLine(linkedList[i]); } Console.WriteLine("----------------------------"); // Test2.1:在索引为0(即第1个节点)的位置插入单个节点 linkedList.Insert(0, 10); Console.WriteLine("After insert 10 in index of 0:"); for (int i = 0; i < linkedList.Count; i++) { Console.WriteLine(linkedList[i]); } // Test2.2:在索引为2(即第3个节点)的位置插入单个节点 linkedList.Insert(2, 20); Console.WriteLine("After insert 20 in index of 2:"); for (int i = 0; i < linkedList.Count; i++) { Console.WriteLine(linkedList[i]); } // Test2.3:在索引为5(即最后一个节点)的位置插入单个节点 linkedList.Insert(5, 30); Console.WriteLine("After insert 30 in index of 5:"); for (int i = 0; i < linkedList.Count; i++) { Console.WriteLine(linkedList[i]); } Console.WriteLine("----------------------------"); // Test3.1:移除索引为5(即最后一个节点)的节点 linkedList.RemoveAt(5); Console.WriteLine("After remove an node in index of 5:"); for (int i = 0; i < linkedList.Count; i++) { Console.WriteLine(linkedList[i]); } // Test3.2:移除索引为0(即第一个节点)的节点 linkedList.RemoveAt(0); Console.WriteLine("After remove an node in index of 0:"); for (int i = 0; i < linkedList.Count; i++) { Console.WriteLine(linkedList[i]); } // Test3.3:移除索引为2(即第三个节点)的节点 linkedList.RemoveAt(2); Console.WriteLine("After remove an node in index of 2:"); for (int i = 0; i < linkedList.Count; i++) { Console.WriteLine(linkedList[i]); } Console.WriteLine("----------------------------"); }