c语言之SJF

#include <malloc.h>
#include <stdio.h>
 
typedef struct table
{
    char name[10];//进程名
    int id;//进程id
    int atime;//到达时间
    int stime;//开始时间
    int runtime;//运行时间
    int ftime;//完成时间
    float total;//周转时间
    float weight;//带权周转时间
    int starttime;
    int finishtime;
}PCB;
 
typedef struct _Node
{
    struct _Node* next;
    PCB pcb;
}node;
 
struct node* creat(int count)
{
    node* head = malloc(sizeof(node));
    head->next = NULL;
    node* move = head;
 
    for (int i = 0; i < count; i++)
    {
        node* fresh = malloc(sizeof(node));
        fresh->next = NULL;
        move->next = fresh;
 
        printf(“请输入第%d个进程的id、到达时间、运行时间:n”, i + 1);
        scanf(“%d%s%d%d”, &fresh->pcb.id, fresh->pcb.name, &fresh->pcb.atime, &fresh->pcb.runtime);
 
        move = fresh;
    }
    return head;
}
 
void fcfs(node* head) {
    for (node* turn = head->next; turn->next != NULL; turn = turn->next)
    {
        for (node* move = head->next; move->next != NULL; move = move->next)
        {
            if (move->pcb.atime > move->next->pcb.atime)
            {
                PCB temp = move->pcb;
                move->pcb = move->next->pcb;
                move->next->pcb = temp;
            }
 
        }
 
    }
}
 
void middle(node* head) {
    for (node* turn = head->next; turn->next != NULL; turn = turn->next)
    {
        for (node* move = head->next; move->next != NULL; move = move->next)
        {
            if (move->pcb.atime == move->next->pcb.atime && move->pcb.runtime > move->next->pcb.runtime) {
                PCB temp = move->pcb;
                move->pcb = move->next->pcb;
                move->next->pcb = temp;
            }
 
        }
    }
}
 
void sjf(node* head) {
    node* temp = head->next;
    node* move = head->next->next;
    temp->pcb.starttime = temp->pcb.atime;
    temp->pcb.finishtime = temp->pcb.starttime + temp->pcb.runtime;
    int num = temp->pcb.finishtime;
    while (move->next != NULL) {
        temp = temp->next;
        move = move->next;
        node* tap = move;
        while (move != NULL) {
            if (temp->pcb.atime <= num && move->pcb.atime <= num && temp->pcb.runtime > move->pcb.runtime) {
                PCB map = temp->pcb;
                temp->pcb = move->pcb;
                move->pcb = map;
                move = move->next;
            }
            else {
                break;
            }
        }
        if (temp->pcb.atime < num) {
            num = num + temp->pcb.runtime;
 
        }
        else {
            num = temp->pcb.atime + temp->pcb.runtime;
 
        }
        move = tap;
    }
}
 
 
void running(node* head) {
    node* move = head->next;
    while (move != NULL) {
        printf(“%s程序正在运行…..n”, move->pcb.name);
        move = move->next;
    }
}
 
void s_f_t_w_time(node* head) {
    node* move = head->next->next;
    node* first = head->next;
    first->pcb.total = first->pcb.runtime;
    first->pcb.stime = first->pcb.atime;
    first->pcb.ftime = first->pcb.stime + first->pcb.runtime;
    first->pcb.weight = first->pcb.total / first->pcb.runtime;
    printf(“%d %4s %7d %11d %10d %10d %16f %10fn”, first->pcb.id, first->pcb.name, first->pcb.atime, first->pcb.runtime, first->pcb.stime, first->pcb.ftime, first->pcb.total, first->pcb.weight);
    while (move != NULL) {
        if (first->next->pcb.atime <= first->pcb.ftime) {
            first->next->pcb.stime = first->pcb.ftime;
            first->next->pcb.ftime = first->next->pcb.stime + first->next->pcb.runtime;
            first->next->pcb.total = first->next->pcb.stime + first->next->pcb.runtime – first->next->pcb.atime;
            first->next->pcb.weight = first->next->pcb.total / first->next->pcb.runtime;
        }
        else {
            first->next->pcb.stime = first->next->pcb.atime;
            first->next->pcb.ftime = first->next->pcb.stime + first->next->pcb.runtime;
            first->next->pcb.total = first->next->pcb.stime + first->next->pcb.runtime – first->next->pcb.atime;
            first->next->pcb.weight = first->next->pcb.total / first->next->pcb.runtime;
        }
        printf(“%d %4s %7d %11d %10d %10d %16f %10fn”, first->next->pcb.id, first->next->pcb.name, first->next->pcb.atime, first->next->pcb.runtime, first->next->pcb.stime, first->next->pcb.ftime, first->next->pcb.total, first->next->pcb.weight);
        first = first->next;
        move = move->next;
    }
}
 
int main(void) {
    node* p;
    printf(“请输入进程数量:n”);
    int count;
    scanf(“%d”, &count);
    p = creat(count);
    fcfs(p);
    middle(p);
    sjf(p);
    running(p);
    printf(” id    进程名   到达时间   运行时间   开始时间   结束时间   周转时间   带权周转时间n”);
    s_f_t_w_time(p);
 
}

0

评论0

请先
显示验证码
没有账号?注册  忘记密码?