Планирование SJF со связанным списком - PullRequest
0 голосов
/ 02 июня 2019

Я должен кодировать планирование SJF, используя связанный список, и печатать вот так,

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

но я не могу распечатать приоритет и вычислить время, перевернуть время. теперь я просто печатаю Среднее время ожидания и общее время оборота. Я хочу вставить некоторое число, например, 0 1 25 80, распечатать идентификатор процесса, приоритет, время вычислений и время поворота.

Я хочу напечатать идентификатор процесса, приоритет, время вычислений, время поворота. Как я могу распечатать время вычислений со временем ожидания и средним временем?

Я использовал двусвязный список, вывел список вставленного номера и просто напечатал Среднее время ожидания и общее время оборота.

Конфигурация введенных данных

  1. Введенные данные программы состоят из 4 полей: тип, идентификатор процесса, приоритет, время вычисления.

  2. тип: 0 означает формирование процесса, он получит входной идентификатор процесса, приоритет, время вычисления. А 1 означает процесс должны планировать.

  3. тип: -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 голосов
/ 03 июня 2019

Насколько я понимаю, вы собираете несколько значений в списке и хотите выполнить вычисления с ними.Читателю вашего исходного кода трудно понять, что означают отдельные значения, распределенные по нескольким спискам.

Так как насчет использования структуры, содержащей набор значений?

Так что это может выглядетьнапример:

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

Утечка памяти

Вы также должны знать, что вам необходимо освободить каждый узел связанного списка ровно один раз.В настоящее время вы просто освобождаете память для головного узла.И вы должны сделать это после того, как вы закончили использовать значения в связанном списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...