Advertisement
Guest User

Untitled

a guest
Jul 20th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.09 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <time.h>
  4.  
  5. struct queueNode {
  6. int data;
  7. int time;
  8. struct queueNode* nextPtr;
  9. };
  10.  
  11. typedef struct queueNode QueueNode;
  12. typedef QueueNode* QueueNodePtr;
  13.  
  14. void enqueue(QueueNodePtr* headPtr, QueueNodePtr* tailPtr, int value, int inLineTime);
  15. int dequeue(QueueNodePtr* headPtr, QueueNodePtr* tailPtr);
  16. int queueIsEmpty(QueueNodePtr quene);
  17. int randomTime();
  18. int queueLength(QueueNodePtr headPtr);
  19. void printQueue(QueueNodePtr headPtr);
  20. int currentInLineTime(QueueNodePtr headPtr);
  21.  
  22. int main()
  23. {
  24. QueueNodePtr waitingLineHead = NULL;
  25. QueueNodePtr waitingLineTail = NULL;
  26. int customer = 1;
  27. int nextArriveTime = 0;
  28. int dueServiceTime = 0;
  29. int currentTime = 0;
  30. int waitingLine = 0;
  31. int waitingLineMAX = 0;
  32. int waitingTime = 0;
  33. int waitingTimeMAX = 0;
  34. int unableDequeue = 0;
  35.  
  36. srand(time(NULL));
  37.  
  38. currentTime = randomTime();
  39. enqueue(&waitingLineHead, &waitingLineTail, customer, currentTime); // first customer arrive
  40.  
  41. dueServiceTime = currentTime + randomTime(); // service time due for first customer
  42. nextArriveTime = currentTime + randomTime(); // second customer arrive
  43.  
  44. while (currentTime < 720)
  45. {
  46.  
  47. // is service time for current customer is due
  48. if (currentTime == dueServiceTime)
  49. {
  50. // to find longest waiting time
  51. if ((waitingTime = currentTime - currentInLineTime(waitingLineHead)) > waitingTimeMAX)
  52. {
  53. waitingTimeMAX = waitingTime;
  54. }
  55.  
  56. dequeue(&waitingLineHead, &waitingLineTail); // remove current customer
  57.  
  58. printf("OUT : ");
  59. printQueue(waitingLineHead);
  60.  
  61. if (!queueIsEmpty(waitingLineHead))
  62. {
  63. dueServiceTime = dueServiceTime + randomTime(); // due time for next customer
  64. }
  65. else
  66. {
  67. unableDequeue++;
  68. printf("///// Unable Dequeue /////\n");
  69. dueServiceTime = nextArriveTime + randomTime();
  70. }
  71. }
  72.  
  73. if (currentTime == nextArriveTime)
  74. {
  75. // to find longest waiting line
  76. if ((waitingLine = queueLength(waitingLineHead)) > waitingLineMAX)
  77. {
  78. waitingLineMAX = waitingLine;
  79. }
  80.  
  81. enqueue(&waitingLineHead, &waitingLineTail, customer, currentTime); // one more customer waiting
  82. printf("IN : ");
  83. printQueue(waitingLineHead);
  84. customer++;
  85. nextArriveTime = nextArriveTime + randomTime();
  86. }
  87. currentTime++;
  88. } // end while
  89. printf("\nHow many times you want to dequeue a customer but can not beacuse queue is already NULL : %d\n", unableDequeue);
  90. printf("Longest waiting time : %d\n", waitingTimeMAX);
  91. } // end main
  92.  
  93. // insert a node at queue tail
  94. void enqueue(QueueNodePtr* headPtr, QueueNodePtr* tailPtr, int value, int inLineTime)
  95. {
  96. QueueNodePtr newPtr; // pointer to new node
  97.  
  98. newPtr = malloc(sizeof(QueueNode));
  99.  
  100. if (newPtr != NULL) // is space avaliable
  101. {
  102. newPtr->time = inLineTime;
  103. newPtr->data = value;
  104. newPtr->nextPtr = NULL;
  105.  
  106. if (queueIsEmpty(*headPtr)) // if is empty , insert node at head
  107. {
  108. *headPtr = newPtr;
  109. }
  110. else // insert node at tail
  111. {
  112. (*tailPtr)->nextPtr = newPtr;
  113. }
  114. *tailPtr = newPtr;
  115. }
  116. else
  117. {
  118. printf("%d is not inserted. No memory available.\n", value);
  119. }
  120. } // end function enqueue
  121.  
  122. // remove node from queue head
  123. int dequeue(QueueNodePtr* headPtr, QueueNodePtr* tailPtr)
  124. {
  125. int value = 0; // node value
  126. QueueNodePtr tempPtr; // temporary node pointer
  127.  
  128. if (queueIsEmpty(*headPtr))
  129. {
  130. *tailPtr = NULL;
  131. }
  132.  
  133. value = (*headPtr)->data;
  134. tempPtr = *headPtr;
  135. *headPtr = (*headPtr)->nextPtr;
  136.  
  137. free(tempPtr);
  138. return value;
  139. }
  140.  
  141. // return 1 if quene is empty
  142. // return 0 if quene is not empty
  143. int queueIsEmpty(QueueNodePtr quene)
  144. {
  145. return (quene == NULL);
  146. }
  147.  
  148. int randomTime()
  149. {
  150. return (rand() % 4 + 1);
  151. }
  152.  
  153. int queueLength(QueueNodePtr headPtr)
  154. {
  155. QueueNodePtr currentPtr = NULL;
  156. int length = 0;
  157.  
  158. currentPtr = headPtr;
  159.  
  160. while (currentPtr != NULL)
  161. {
  162. currentPtr = currentPtr->nextPtr;
  163. length++;
  164. }
  165. return length;
  166. }
  167.  
  168. void printQueue(QueueNodePtr headPtr)
  169. {
  170. QueueNodePtr currentPtr = NULL;
  171.  
  172. currentPtr = headPtr;
  173.  
  174. while (currentPtr != NULL)
  175. {
  176. printf("%d--> ", currentPtr->data);
  177. currentPtr = currentPtr->nextPtr;
  178. }
  179. printf("NULL\n");
  180. }
  181.  
  182. // return in line time of current customer , do not dequeue it
  183. int currentInLineTime(QueueNodePtr headPtr)
  184. {
  185. return (headPtr->time);
  186. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement