多机调度问题

#include <stdio.h>
#include <stdlib.h>
#define  M 7
#define N 3

//对于工作的存储
typedef struct Job
{
	int id;  
	int time;
}job[M];

//对于机器的存储
typedef struct Mechine
{
	int id;
	int avail;
}Me[N];

//对应于每台机器
typedef struct node
{
	int data;  //每台机器中存放的工作编号
	struct node * next;
}Lnode[N],lnode,*listnode;

//排序
void sort(job a,int n,Me b,int flag)
{
	int k,m;
	job temp;
	Me temp1;
	for(k=0;k<n-1;k++)
	{
		for(m=k+1;m<n;m++)
		{
			if(a[k].time<a[m].time &&flag==0)  //对每份工作时间进行排序
			{
				temp[0]=a[k];
				a[k]=a[m];
				a[m]=temp[0];
			
			}
			if(b[k].avail<b[m].avail&&flag==1)  //对机器时间进行排序
			{
				temp1[0]=b[k];
				b[k]=b[m];
				b[m]=temp1[0];
			}
		}
   
	}
}

//将工作编号插入到结构体中数据项,用来输出结果
void listinsert(Lnode &l,int m,int n)
{   
	listnode s,p;
	//l[m].data=n;
	p=&l[m-1];
	s=(listnode)malloc(sizeof(listnode));//开辟节点用来存放新加入的数据
    //printf(" %d ",p->data);
	while(p->next)
	{
	  //printf(" %d ",p->data);
      p=p->next;
	};  //使之到最后一个节点
//	printf("\n");
	s->data=n;
	s->next=NULL;
	p->next=s;
}

//时间分配方法
void  f(job J ,Me K,Lnode &l)
{
	int i;
	for(i=0;i<M;i++)
	{
		if(i<N)  
		{
			K[i].avail+=J[i].time;  //当工作份数小于机器数时,分别传递对应值
			l[i].data=J[i].id;
			l[i].next=NULL;
		}
		else
		{
			K[N-1].avail+=J[i].time;   //否则将当前工作时间给最后一台机器
			listinsert(l,K[N-1].id,J[i].id);
			sort(J,N,K,1);             //将机器时间按从大到小排序
		}
	}
}

void print(Lnode l)
{
	listnode p;
	int i;
	for(i=0;i<N;i++)
	{
		p=&l[i];
		printf("第%d个机器要完成以下工作",i+1);
		printf("%d ",p->data);
		while(p->next)
		{
			p=p->next;printf("%d ",p->data);
		}
		printf("\n");
	}
}

int main()
{
    int i;
	job k;
	Me x;
//	Lnode node=NULL;
	Lnode l;
	//关于工作的输入
	for(i=0;i<M;i++)
	{
		k[i].id=i+1;
		printf("请输入第%d份工作时间:\n",i+1);
		scanf("%d",&k[i].time);
	}
	//关于机器输入
	for(i=0;i<N;i++)
	{
		x[i].id=i+1;
		x[i].avail=0;
	}
	//关于每个机器分配分配工作初始化
	for(i=0;i<3;i++)
	{
		l[i].data=0;
		l[i].next=NULL;
	}
	sort(k,M,x,0);//将输入工作时间从大到小进行排序
	f(k,x,l);     //进行时间的分配
	//printf("\na\n");
    print(l);     //输出结果
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值