これでわかる? ’なにがわからんか'を明記せんと答えようがないよ。
C
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <assert.h>
5
6struct process_t {
7 char* name; /* 名前 */
8 int time; /* 処理に必要な時間 */
9 struct process_t* next; /* 次のprocess */
10};
11
12typedef struct process_t process;
13
14/* processを生成する */
15process* new_process(const char* n, int t) {
16 process* prc = (process*)malloc(sizeof(process));
17 assert( prc != NULL );
18 prc->name = (char*)malloc(strlen(n)+1);
19 assert( prc->name != NULL );
20 strcpy(prc->name, n);
21 prc->time = t;
22 prc->next = NULL;
23 return prc;
24}
25
26/* prcを廃棄する */
27void delete_process(process* prc) {
28 free(prc->name);
29 free(prc);
30}
31
32void print_process(const process* prc) {
33 printf("%s(%4d) ", prc->name, prc->time);
34}
35
36/* queの末尾に prcを追加し、queを返す */
37process* enque(process* que, process* prc) {
38 prc->next = NULL;
39 if ( que != NULL ) { /* queが空でないなら */
40 /* queの末尾を辿り */
41 process* p = que;
42 while ( p->next != NULL ) {
43 p = p->next;
44 }
45 /* 末尾の次に prcを繋ぐ */
46 p->next = prc;
47 } else { /* queが空なら */
48 que = prc; /* prcが先頭となる*/
49 }
50 return que;
51}
52
53int main() {
54 const int quantum = 100;
55 process* queue = NULL;
56 queue = enque(queue, new_process("A", 150));
57 queue = enque(queue, new_process("B", 80));
58 queue = enque(queue, new_process("C", 200));
59 queue = enque(queue, new_process("D", 200));
60
61 while ( queue != NULL ) { /* queueが空になるまでくりかえす */
62 process* prc = queue; /* 先頭のprocessを取り出し */
63 queue = queue->next; /* queueをひとつ進める */
64 print_process(prc);
65 printf("-> ");
66 prc->time -= quantum; /* quantumを引いて */
67 print_process(prc);
68 if ( prc->time > 0 ) { /* 処理が完了していないなら */
69 printf("queued again\n");
70 queue = enque(queue, prc); /* queueの末尾に再投入 */
71 } else { /* 完了したら */
72 printf("FINISHED\n");
73 delete_process(prc); /* processを廃棄 */
74 }
75 }
76 return 0;
77}