日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[数据结构-严蔚敏版]P65离散事件模拟(银行客户的离散事件驱动模拟程序)

發布時間:2023/12/4 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [数据结构-严蔚敏版]P65离散事件模拟(银行客户的离散事件驱动模拟程序) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

寫這個簡單玩意,居然花費了我6小時+,唉!!!,還是太菜了!
中間已經起了放棄的念頭了,最后還是堅持下來了!

總結:
(1)漏了p = p->next

(2)隊列刪除元素的時候,刪除的是最后一個忘記特判。


(3)寫的時候太急了,忘記給pn賦值,導致一執行這個函數,我的表就斷了。而且要注意判斷刪除的元素不存在怎么辦(!e->next)


(4)這些特判最好寫寫,增強代碼的健壯性。而且不寫可能會報錯。

代碼如下:

#include<iostream> #include <cstdlib> #include <ctime> using namespace std;typedef struct {int occurTime;int nType; }Event, ElemType;typedef struct {int arrivalTime;int duration; }QElemType;typedef struct QNode {QElemType data;QNode *next; };typedef struct {QNode *front, *rear;int length; }Queue;typedef struct ENode {Event data;ENode *next; }ENode, *EventList, *Enode;int totalTime = 0; int customerNUM = 0;bool initList(EventList &eL) {eL = new ENode;if (!eL) return false;eL->next = nullptr;return true; }bool initQueue(Queue &q) {q.front = q.rear = new QNode;if (!q.front) return false;q.front->next = nullptr;q.length = 0;return true; }int cmp(Event a, Event b) {if (a.occurTime < b.occurTime) return -1;else if (a.occurTime == b.occurTime) return 0;else if (a.occurTime > b.occurTime) return 1; }bool orderInsert(EventList &el, Event e, int(*compare)(Event, Event)) {ENode *p = el;if (!p->next){//插入的元素為第一個元素的情況ENode *s = new ENode;if (!s) return false;s->data = e;s->next = p->next;p->next = s;return true;}p = p->next;while (p){if (compare(p->data, e) <= 0){ENode *s = new ENode;if (!s) return false;s->data = e;s->next = p->next;p->next = s;return true;}}return true; }bool listEmpty(EventList el) {ENode *p = el->next;if (!p) return true;return false; }Event getCurElem(ENode *e) {if (e)return e->data; }bool enQueue(Queue &q, QElemType e) {QNode *s = new QNode;if (!s) return false;s->data = e;s->next = nullptr;q.rear->next = s;q.rear = s;q.length++;return true; }bool delQueue(Queue &q, QElemType &e) {if (q.front == q.rear) return false;QNode *p = q.front->next;e = p->data;q.front->next = p->next;if (p == q.rear) q.rear = q.front;delete p;q.length--;return true; }int minimumQueue(Queue q[]) {int j = 0;int maxNum = 999999;for (int i = 1; i <= 4; i++){int len = q[i].length;if (len < maxNum){j = i;maxNum = len;}}return j; }int queueLength(Queue q) {return q.length; }bool queueEmpty(Queue q) {if (q.front == q.rear) return true;return false; }bool getHead(Queue q, QElemType &customer) {if (!q.front->next) return false;customer = q.front->next->data;return true; }void Random(int &a, int &b) {b = 1 + rand() % 10;a = b + 2;cout << a << " " << b << endl; }ENode* getHead(EventList &ev) {return ev; }bool delFirst(Enode &e, Enode &pn) {if (!e->next) return false;pn = e->next;e->next = pn->next;pn->next = nullptr;return true; }void openForDay(EventList &ev, Queue q[]) {totalTime = 0;customerNUM = 0;initList(ev);Event en;en.occurTime = 0;en.nType = 0;orderInsert(ev, en, cmp);for (int i = 1; i <= 4; i++){initQueue(q[i]);} }void printEvent(EventList el);void customerArrived(EventList &ev, Queue q[], Event en, int closeTime) {++customerNUM;int durtime = 0;int intertime = 0;Random(durtime, intertime);int i = 0;int t = en.occurTime + intertime;if (t < closeTime){orderInsert(ev, { t,0 }, cmp);}i = minimumQueue(q);enQueue(q[i], { en.occurTime,durtime });if (queueLength(q[i]) == 1){orderInsert(ev, { en.occurTime + durtime,i }, cmp);} }void customerDeparture(EventList &ev, Queue q[], Event en) {int i = en.nType;QElemType customer;delQueue(q[i], customer);cout << "duration time = " << en.occurTime - customer.arrivalTime << endl;totalTime += en.occurTime - customer.arrivalTime;if (!queueEmpty(q[i])){getHead(q[i], customer);orderInsert(ev, { en.occurTime + customer.duration,i }, cmp);}}void printEvent(EventList el) {ENode *p = el->next;while (p){cout << "event occurtime = " << p->data.occurTime << " " << "ntype = " << p->data.nType << " " << endl;p = p->next;} }void printQueue(Queue q) {QNode *p = q.front->next;while (p){cout << "queue arrivaltime = " << p->data.arrivalTime << " " << "queue duration = " << p->data.duration << endl;p = p->next;} }void bank_Simulation(EventList &ev, Queue q[], int closeTime) {openForDay(ev, q);ENode *p = nullptr;Event en;while (!listEmpty(ev)){delFirst(ev, p);en = getCurElem(p);if (en.nType == 0){customerArrived(ev, q, en, closeTime);}else{customerDeparture(ev, q, en);}}cout << "The average time is " << 1.0*totalTime / customerNUM << endl; }int main() {EventList ev;Queue q[5];srand((unsigned)time(NULL));bank_Simulation(ev, q, 24);return 0; }

總結

以上是生活随笔為你收集整理的[数据结构-严蔚敏版]P65离散事件模拟(银行客户的离散事件驱动模拟程序)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。