模拟进程队列的管理(出入队)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
模拟进程队列的管理(出入队)(红色字体为再思考修改处)
操作系统实验一 实验题
(1)模拟双向链接队列的出入队
(2)要求:写出算法思想(程序流程图或自然语言描述) (3)提交形式:以学号+姓名创建一个文件夹,里面必须包含(源程序.CPP 、可执行程序.exe 、
算法思想文档.doc)
…
图2
源代码为:
/******创建双向链表模拟进程队列管理(出入队)(有前后指针之分的带头结点),放在文件dlnkqueue.h 中*******/
typedef int datatype; typedef struct dlink_node { datatype info; struct dlink_node *llink,*rlink; }dnode;
typedef struct//封装带头结点前后指针 { dnode *front,*rear; }queue;
/********双向链表置空**********/
(四)不足体会 1.一开始本来想输入字符,但是总是在一些方面不怎么会处理,运行不出来。比如,在输入或输出中稍微改动下,把%d 改为%c 等,可总是运行有些小错误。最后只好改用输入常用的数字。 所以,应再好好花时间思考用字符要注意一些的问题。这也突显了我对字符的掌握不是很熟练。 2.一开始对题意分析不清,对应转化成的数据模型没把握好,导致重写算法,又得修改。
queue *init()
{
queue *head;
head=(queue*)malloc(sizeof(queue));
head->front=NULL;
head->rear=NULL;
return head;
}
/*******输出双向链表元素**********/
void print(queue *head)
{
dnode *p;
p=head->front;
if(!p)printf("进程队列为空!\n");
else
{
printf("进程队列为:\n");
while(p)
{
printf("%d ",p->info);p=p->rlink;
}
}
}
/*********查找元素X是否存在*********/ dnode *find(queue *head,datatype x)
{
dnode *p=head->front;
while(p&&p->info!=x)
p=p->rlink;
if(!p)return NULL;
else
return p;
}
/***********在队尾插入**********/ queue *append(queue *head,datatype x)
{
dnode *p,*q;
p=(dnode*)malloc(sizeof(dnode));
p->info=x;
if(!head->front)//原进程中队列中无进程//
{
head->front=head->rear=p;
p->llink=NULL;
p->rlink=NULL;
}
else//原进程队列中有进程//
{
q=head->front;
while(q->rlink)
q=q->rlink;
p->rlink=q->rlink;
p->llink=q;
q->rlink=p;
head->rear=p;
}
return head;
}
/*********删除X********/
queue *dele(queue *head,datatype x)
{
dnode *q;
q=find(head,x);
if(!q)
{printf("该进程%d找不到,无法出队!\n",x);return NULL;}
else
{
//队首出队//
if(q->llink==NULL)
{
head->front=q->rlink;
q->rlink->llink=NULL;
}
//队尾出队//
else if(q->rlink==NULL)
{
head->rear=q->llink;
q->llink->rlink=NULL;
}
//队中出队//
else
{
q->llink->rlink=q->rlink;
q->rlink->llink=q->llink;
}
free(q);return head;
}
}
/********创建输入双向链表元素*********/
queue *creat(queue *head)
{
datatype x;
scanf("%d",&x);
while(x!=-999)
{
head=append(head,x);
scanf("%d",&x);
}
return head;
}
/******模拟进程队列的管理(出入队)(带前后指针的头结点)(双向链表)*****/
#include
#include
#include"dlnkqueue.h"
void main()
{
queue *head;dnode *p,*q;
int i,j;
head=init();
printf("创建一入队进程(以数字-999结束):\n");
head=creat(head);
printf("\n请输入要入队的一进程:\n");
scanf("%d",&i);
p=find(head,i);
if(p)
printf("该进程%d已存在,无法入队!\n",i);
else