具有链接列表的SJF调度

时间:2019-06-02 05:44:42

标签: c linked-list schedule

我必须使用链表对SJF调度进行编码并像这样打印

process id     priority            computing time       turn around time
2                   12                  10                   40

但是我不能显示优先级和计算时间,请转一下时间。 现在我只打印平均等待时间和总周转时间。 我想插入一些数字,例如0 1 25 80,然后打印进程ID&priority&computing time&turn time。

我要打印进程ID,优先级,计算时间,周转时间。如何打印等待时间和平均时间的计算时间?

我使用了双向链接列表并列出了插入的号码,然后仅打印平均等待时间和总周转时间。

输入数据的配置

  1. 程序输入的数据由4个字段,类型,进程ID,优先级,计算时间组成。

  2. type:0表示进程的形成,它将接收输入的进程id,优先级,计算时间。 1表示过程 必须安排。

  3. 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

1 个答案:

答案 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

内存泄漏

您还应该意识到,您需要释放链表的每个节点一次。当前,您只是为头节点释放内存。您应该在完成使用链接列表中的值的 之后执行此操作。