OS实验一(软件)2010OS实验一(软件0967020050)20101模拟进程队列的管理(出入队)(红色字体为再思考修改处)操作系统实验一实验题(1)模拟双向链接队列的出入队(2)要求:写出算法思想(程序流程图或自然语言描述)(3)提交形式:以学号+姓名创建一个文件夹,里面必须包含(源程序.CPP、可执行程序.exe、算法思想文档.doc)……可将其转换为:frontrearhead132231图1图20进程1进程20进程5双向链接:(队首前向指针为0;队尾后向指针为0)而后,细想,这里设front和rear没有很大作用(当时觉得毕竟它不是真的链式队列,设这样的头,没必要,过后细看老师给出的删除算法,再看图1中的头结点,觉得头中的front,rear可做标记,故图2不太切合题意,不妥。故采取图1)故可简化为(不带头结点的双链表):参考:数据结构书p61的链式队列head(一)分析题意得模型(二)写主要算法双链表置空init(),创建creat(),在尾插入append(),删除dele(),输出print()写入头文件为“dlnkqueue.h”可参考:数据结构书P61(三)调试运行(多种情况都要运行)OS实验一(软件)2010OS实验一(软件0967020050)2010源代码为:/******创建双向链表模拟进程队列管理(出入队)(有前后指针之分的带头结点),放在文件dlnkqueue.h中*******/typedefintdatatype;typedefstructdlink_node{datatypeinfo;structdlink_node*llink,*rlink;}dnode;typedefstruct//封装带头结点前后指针{dnode*front,*rear;}queue;/********双向链表置空**********/(四)不足体会1.一开始本来想输入字符,但是总是在一些方面不怎么会处理,运行不出来。比如,在输入或输出中稍微改动下,把%d改为%c等,可总是运行有些小错误。最后只好改用输入常用的数字。所以,应再好好花时间思考用字符要注意一些的问题。这也突显了我对字符的掌握不是很熟练。2.一开始对题意分析不清,对应转化成的数据模型没把握好,导致重写算法,又得修改。OS实验一(软件)2010OS实验一(软件0967020050)2010queue*init(){queue*head;head=(queue*)malloc(sizeof(queue));head-front=NULL;head-rear=NULL;returnhead;}/*******输出双向链表元素**********/voidprint(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,datatypex){dnode*p=head-front;while(p&&p-info!=x)p=p-rlink;if(!p)returnNULL;elsereturnp;}/***********在队尾插入**********/queue*append(queue*head,datatypex){dnode*p,*q;p=(dnode*)malloc(sizeof(dnode));p-info=x;if(!head-front)//原进程中队列中无进程//OS实验一(软件)2010OS实验一(软件0967020050)2010{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;}returnhead;}/*********删除X********/queue*dele(queue*head,datatypex){dnode*q;q=find(head,x);if(!q){printf(该进程%d找不到,无法出队!\n,x);returnNULL;}else{//队首出队//if(q-llink==NULL){head-front=q-rlink;q-rlink-llink=NULL;}//队尾出队//elseif(q-rlink==NULL){head-rear=q-llink;q-llink-rlink=NULL;}OS实验一(软件)2010OS实验一(软件0967020050)2010//队中出队//else{q-llink-rlink=q-rlink;q-rlink-llink=q-llink;}free(q);returnhead;}}/********创建输入双向链表元素*********/queue*creat(queue*head){datatypex;scanf(%d,&x);while(x!=-999){head=append(head,x);scanf(%d,&x);}returnhead;}/******模拟进程队列的管理(出入队)(带前后指针的头结点)(双向链表)*****/#includestdio.h#includestdlib.h#includedlnkqueue.hvoidmain(){queue*head;dnode*p,*q;inti,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);elseOS实验一(软件)2010OS实验一(软件0967020050)2010{head=append(head,i);printf(入队后:\n);print(head);}printf(\n\n请输入要出队的一进程:\n);scanf(%d,&j);q=find(head,j);if(!q)printf(该进程%d不存在,无法出队!\n,j);else{head=dele(head,j);printf(出队后:\n);print(head);printf(\n);}}