我必须使用链表对SJF调度进行编码并像这样打印
process id priority computing time turn around time
2 12 10 40
但是我不能显示优先级和计算时间,请转一下时间。 现在我只打印平均等待时间和总周转时间。 我想插入一些数字,例如0 1 25 80,然后打印进程ID&priority&computing time&turn time。
我要打印进程ID,优先级,计算时间,周转时间。如何打印等待时间和平均时间的计算时间?
我使用了双向链接列表并列出了插入的号码,然后仅打印平均等待时间和总周转时间。
输入数据的配置
程序输入的数据由4个字段,类型,进程ID,优先级,计算时间组成。
type:0表示进程的形成,它将接收输入的进程id,优先级,计算时间。 1表示过程 必须安排。
type:-1表示输入完成。完成输入后,正常过程必须根据优先级进行调度。
-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int element;
typedef struct DListNode {
element data;
struct DListNode* llink;
struct DListNode* rlink;
} DListNode;
void init(DListNode* phead)
{
phead->llink = phead;
phead->rlink = phead;
}
void print_dlist(DListNode* phead) {
DListNode* p;
for (p = phead->rlink; p != phead; p = p->rlink)
{
printf("%d\t", p->data);
}
printf("\n");
}
init(head1);
init(head2);
init(head3);
dinsert(head1, 80);
dinsert(head1, 25);
dinsert(head1, 1);
//head1
dinsert(head2, 40);
dinsert(head2, 15);
dinsert(head2, 2);
//head2
dinsert(head3, 30);
dinsert(head3, 8);
dinsert(head3, 3);
//head3
print_dlist(head1);
print_dlist(head2);
print_dlist(head3);
free(head1);
free(head2);
free(head3);
int n, Burst_time[20], Wating_time[20], Ta_time[20], i, j;
float AverageW = 0, AverateTurn = 0;
Wating_time[0] = 0; //waiting time for first process is 0
//calculating waiting time
for (i = 1; i<n; i++)
{
Wating_time[i] = 0;
for (j = 0; j<i; j++)
Wating_time[i] += Burst_time[j];
}
printf("\nProcess\t\tpriority\t\tcomputing Time");
//calculating turnaround time
for (i = 0; i<n; i++)
{
Ta_time[i] = Burst_time[i] + Wating_time[i];
AverageW += Wating_time[i];
AverateTurn += Ta_time[i];
printf("\nP[%d]\t\t%d\t\t%d\t\t%d", i + 1, Burst_time[i], Wating_time[i], Ta_time[i]);
}
AverageW = AverageW / i;
AverateTurn = AverateTurn / i;
printf("\n\nAverage Waiting Time:%f", AverageW);
printf("\nAverage Turnaround Time:%f", AverateTurn);
return 0;
}
输入数据示例
0 1 25 80
0 10 24 45
答案 0 :(得分:0)
根据我的理解,您在列表中收集了许多值,并希望使用这些值进行计算。 您的源代码阅读者很难确定分布在多个列表中的单个值的含义。
那如何使用包含值集的结构呢?
所以它看起来像这样:
typedef struct {
int process_id;
int priority;
int computing_time;
int turn_around_time;
} element;
然后我们将列出所有这些值,例如,我们可以将其命名为process_values并使用init对其进行初始化,如代码所示:
DListNode *process_values = calloc(1, sizeof(DListNode));
init(process_values);
我们可以填写一些条目,例如像这样:
element entry;
entry.process_id = 2;
entry.priority = 12;
entry.computing_time = 10;
entry.turn_around_time = 40;
dinsert(process_values, entry);
entry.process_id = 1;
entry.priority = 12;
entry.computing_time = 25;
entry.turn_around_time = 80;
dinsert(process_values, entry);
好吧,我想现在为您带来了有趣的部分。如何将代码与带有计算代码的列表链接? 这是一个非常简单的示例:如果要计算平均计算时间,我们可以执行以下操作:
DListNode* p;
float sum = 0;
int cnt = 0;
for (p = process_values->rlink; p != process_values; p = p->rlink) {
sum += p->data.computing_time;
cnt++;
}
float avg = sum / cnt;
printf("average computing time %f\n", avg);
控制台上的输出将是上面的数字:
average computing time 17.500000
内存泄漏
您还应该意识到,您需要释放链表的每个节点一次。当前,您只是为头节点释放内存。您应该在完成使用链接列表中的值的 之后执行此操作。