#include<stdio.h>#include<malloc.h>#include<string.h>#define OVERFLOW -1#define OK 1#define ERROR 0#define FALSE 0#define SYS_USR_TASK_THRESHOLD 50#define INVALID_TASK_THRESHOLD 255 typedef int ElemType;typedef int Status;typedef struct LNode{ElemType task_prior;ElemType task_id;struct LNode *next;}LNode,*LinkList;Status InitList(LinkList &head){head = (LinkList)malloc(sizeof(LNode));if(!head) return OVERFLOW;head -> next = NULL;return OK;}int ListLength(LinkList head){int length = 0;LinkList p;p = head -> next;while(p){++length;p = p -> next;}return length;}LinkList GetElemP(LinkList head,int i){LinkList p;int j;p = head;for(j = 1; j <= i; ++j){p = p -> next;}return p;}Status ListInsert(LinkList &head, int i, ElemType task_prior, ElemType task_id){LinkList s, p;if(i < 0 || i > ListLength(head) + 1)return ERROR;s = (LinkList)malloc(sizeof(LNode));if(!s) return OVERFLOW;p = GetElemP(head, i - 1);s -> next = p -> next;p -> next = s;s -> task_prior = task_prior;s -> task_id = task_id;return OK;}Status BubbleSort(LinkList &head){LinkList p, q, endpt, tmp;for(endpt = NULL; endpt != head; endpt = q){for(q = tmp = head; tmp -> next -> next != endpt ; tmp = tmp -> next){if(tmp -> next -> task_prior > tmp -> next -> next -> task_prior){p = tmp -> next -> next;tmp -> next -> next = p -> next;p -> next = tmp -> next;tmp -> next = p;q = tmp -> next -> next;}}}return OK;}void scheduler(int task[], int n, int system_task[], int user_task[]){int i, j;LinkList head, p;InitList(head);for (i = 1; i <= n; ++i){ListInsert(head, i, task[i-1], i-1);}BubbleSort(head);i = 0;j = 0;p = head -> next;while(p){if(p -> task_prior < SYS_USR_TASK_THRESHOLD && p -> task_prior >= 0){system_task[i++] = p -> task_id;}else if(p -> task_prior <= INVALID_TASK_THRESHOLD){user_task[j++] = p -> task_id;}else{printf("Invalid task is task%d\n",p -> task_id);}p = p -> next;}system_task[i] = -1;user_task[j] = -1;}void TraverseArray(int array[],void(* visit)(int)){int i;for(i = 0; array[i] != -1; ++i)visit(array[i]);printf("\n");}void print(int data){printf("%d ", data);}int main(){int task[] ={0, 30, 155, 1, 80, 300, 170, 40, 99};int system_task[9] = {-1};int user_task[9] = {-1};int n = 9;scheduler(task, n, system_task, user_task);printf("system_task is \n");TraverseArray(system_task, print);printf("user_task is \n");TraverseArray(user_task, print);return 0;}
作業系統任務調度問題。作業系統任務分為系統任務和使用者任務兩種。其中,系統任務的優先順序 < 50,使用者任務的優先順序 >= 50且 <= 255。優先順序大於255的為非法任務,應予以剔除。現有一任務隊列task[],長度為n,task中的元素值表示任務的優先順序,數值越小,優先順序越高。函數scheduler實現如下功能,將task[] 中的任務按照系統任務、使用者任務依次存放到 system_task[] 數組和 user_task[] 數組中(數組中元素的值是任務在task[] 數組中的下標),並且優先順序高的任務排在前面,數組元素為-1表示結束。
例如:task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99} system_task[] = {0, 3, 1, 7, -1} user_task[] = {4, 8, 2, 6, -1}
函數介面 void scheduler(int
task[], int n, int system_task[], int user_task[])
函數介面 void scheduler(int
task[], int n, int system_task[], int user_task[])