#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[])