模拟进程队列的管理(出入队)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档