⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zhucunkongjiandefenpeiyuhuishou.cpp

📁 操作系统作业
💻 CPP
字号:
#include <stdio.h>
#include <stdlib.h> 
#include "conio.h"
#include <cstring> 
#define creat(type)   (type*)malloc(sizeof(type))
#define NULL 0
struct chain
{
	int prestate;
	int presize;
	struct chain *pre;
	
	int size;
	int state;
	int job;
	int pos;

	int nestate;
	int nesize;
	struct chain *next;
}*head=NULL,*back=NULL,*p,*q;

void sort(int JOB)
{
	int n=0;
	if(head==NULL)
	{
		if(p->size<640)
		{
			head=p;	
			head->next=back;
			head->presize=640-p->size;
			head->prestate=0;	
			head->pre=back;
			head->job=1;
			head->nestate=0;	
			head->nesize=640-p->size;
			head->size=p->size;
			head->pos=0;
			head->state=1;
			back->presize=p->size;
			back->pre=head;
			back->prestate=1;
			back->size=640-p->size;
			back->pos=p->size;
			back->state=0;
			back->job=0;
			back->nesize=head->size;
			back->next=head;
			back->nestate=1;
		}
		else
		{
			printf("\nnot enough room!\n");
		}
	}
	else if (head->state==0)
	{
		if(p->size<head->size)
		{	
			p->next=head->next;	
			p->nesize=head->nesize;
			p->nestate=head->nestate;
			p->next->pre=p;
			head->nesize=head->size-p->size;
			head->next=p;
			head->presize=back->size;
			head->prestate=back->state;	
			head->pre=back;
			head->job=JOB;
			head->nestate=0;
			head->size=p->size;
			head->pos=0;
			head->state=1;
			p->pre=head;
			p->presize=head->size;
			p->prestate=head->state;
			p->pos=head->pos+head->size;
			p->state=0;
			p->job=JOB;
			p->size=head->nesize;	
			p->next->presize=p->size;
			p->next->prestate=p->state;

		}
		else if(p->size==head->size)
		{
			head->job=JOB;
			head->size=p->size;
			head->pos=0;
			head->state=1;
		}
	}
	else
	{
		q=head;
		while(q->next!=head&&n==0)
		{
			if(q->nestate==0)
			{
				if(p->size<q->nesize)
				{
					p->next=q->next;	
					p->pre=q;
					p->presize=q->size;
					p->prestate=q->state;
					p->pos=q->pos+q->size;
					p->state=1;
					p->job=JOB;
					p->nesize=q->nesize-p->size;
					p->nestate=0;                //p的设置
					q->next->pre=p;
					q->next->presize=p->size;
					q->next->prestate=p->state;
					q->next->size=q->nesize-p->size;
					q->next->pos=p->pos+p->size;
					q->next->state=0;            //q的next的设置
					q->next=p;
					q->nesize=p->size;
					q->nestate=1;                //q的设置
					n=1;
				}
				else if (p->size==q->nesize)
				{
					p->next=q->next->next;	
					p->pre=q;
					p->presize=q->size;
					p->prestate=q->state;
					p->pos=q->pos+q->size;
					p->state=1;
					p->job=JOB;
					p->nesize=q->next->nesize;
					p->nestate=q->next->nestate;    //p的设置  
					q->next=p;
					q->nesize=p->size;
					q->nestate=1;                   //q的设置
					n=1;
				}
			}
			q=q->next;
		}
		if (n==0)
		{
			printf("\nnot enough room!\n\n");
		}
	}
}

void jinchou()
{
	int n=0;
	chain *qr=head;
	chain *qp=NULL;
	while(qr->next!=head)
	{
		while(qr->state==0&&n==0)
		{
			if(qr->nestate==0&&qr->next!=back)
			{
				qr->size=qr->size+qr->next->size;
				qr->nesize=qr->next->nesize;
				qr->nestate=qr->next->nestate;
				qp=qr->next;
				qr->next=qr->next->next;
				qr->next->pre=qr;
				qr->next->prestate=qr->state;
				qr->next->presize=qr->size;
				free(qp);
			}
			else
			{
				n=1;
			}
		}
		qr->pre->nesize=qr->size;
		qr=qr->next;
	}
}


void display(chain *q)
{
	int i=1;
	printf("序号 \t 作业 \t 分区大小 \t 起始地址 \t 状态 \n");
	while(q!=back)
	{
		if(q->state==1)
			printf("%d \t %d \t %d \t\t %d \t\t %d\n",i,q->job,q->size,q->pos,q->state);
		else
			printf("%d \t 空 \t %d \t\t %d \t\t %d\n",i,q->size,q->pos,q->state);
			i++;
			q=q->next;
	}
	if(q==back)
	{
		if(q->state==1)
			printf("%d \t %d \t %d \t\t %d \t\t %d\n",i,q->job,q->size,q->pos,q->state);
		else
			printf("%d \t 空 \t %d \t\t %d \t\t %d\n",i,q->size,q->pos,q->state);
	}
}

void distribute()
{
	int n=0;
	static int JOB=1;
	printf("\n请你申请一个主存空间(k):");
	scanf("%d",&n);
	p=creat(chain);
	p->size=n;
	p->job=JOB;
	p->state=1;
	sort(JOB);
	JOB++;
	q=head;
	display(q);
}

void release()
{
	int n=0;
	int sign=0;
	int a=0;
	int si=0;
	int po=0;
	chain *qr=NULL;
	chain *qp=NULL;
	printf("\nwhat job do you want to release?:     ");
	scanf("%d",&n);
	q=head;
	if (q==NULL)
	{
		printf("\n***there isn't any job here.***\n\n");
	}
	else
	{
		qr=q->next;                  
		qp=q->pre;
		si=q->size;
		po=q->pos;            //保留现场
		while(q->next!=head&&a==0)
		{
			if (n==head->job)
			{
				free(head);
				head=creat(chain);
				head->next=qr;
				head->presize=back->size;
				head->prestate=back->state;	
				head->pre=back;
				head->nestate=qr->state;	
				head->job=0;
				head->nesize=qr->size;
				head->size=si;
				head->pos=0;
				head->state=0;
				back->nestate=0;
				back->nesize=head->size;
				back->next=head;
				sign=1;
				a=1;
			}
	    	else if(n==q->job)
			{
	  	    	free(q);
		    	q=creat(chain);
		    	q->next=qr;
		    	q->presize=qp->size;
		    	q->prestate=qp->state;	
		    	q->pre=qp;
		    	q->job=0;
		    	q->nestate=qr->state;	
	    		q->nesize=qr->size;
	    		q->size=si;
	    		q->pos=po;
	    		q->state=0;
				qp->nestate=0;
				qp->nesize=q->size;
				qp->next=q;
				sign=1;
				a=1;
			}
	    	q=q->next;
			qp=q->pre;
	    	qr=q->next;
	    	si=q->size;
			po=q->pos;
		}
		if(sign==0)
		{
			printf("\n*****there isn't the job which you want here.*****\n\n");
		}
		jinchou();
		printf("\n");
    	display(head);
	}
}

void main()
{
	int num=0,n=0;
	int c=0;
	int JOB=1;
	printf("序号 \t 作业 \t 分区大小 \t 起始地址 \t 状态 \n");
	printf("1 \t 空\t 640K \t\t 0 \t\t 空表目 \n");
	printf("\nwant to control? 1.yes  2.no   ");
	scanf("%d",&c);
	back=creat(chain);
	while(c==1)
	{
		printf("\nwhat do want to do: 1.distribute  2.release   ");
		scanf("%d",&num);
		if (num==1)
		{
			distribute();
		}
		else if(num==2)
		{
			release();
		}
		else
		{
			printf("\nerror!please try again!\n");
		}
		printf("\nwant to control? 1.yes  2.no    ");
		scanf("%d",&c);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -