操作系统课程设计 报告

上传人:痛*** 文档编号:44311893 上传时间:2021-12-05 格式:DOC 页数:42 大小:395.03KB
返回 下载 相关 举报
操作系统课程设计 报告_第1页
第1页 / 共42页
操作系统课程设计 报告_第2页
第2页 / 共42页
操作系统课程设计 报告_第3页
第3页 / 共42页
点击查看更多>>
资源描述
操作系统程序设计操作系统程序设计 院 系: 计算机科学技术学院软件工程系 班 级: 软件 08 1 班 姓 名: X X X 学 号: X 号 指导教师: X X X 2010 年 6 月 26 日操作系统模拟实现操作系统模拟实现操作系统程序设计任务书操作系统程序设计任务书一、题目:一、题目:操作系统模拟实现二、设计要求二、设计要求(1)独立完成(2)良好的交流、沟通能力(3)充分运用前序课所学的软件工程、程序设计等相关知识(4)充分运用调试和排错技术(5)简单测试驱动模块和桩模块的编写 (6)查阅相关资料,自学具体课题中涉及到的新知识。(7)按要求写出课程设计报告,并于设计结束后 1 周内提交。其主要内容包括:封皮、课程设计任务书,指导教师评语与成绩、目录、概述、软件需求分析、总体设计、详细设计、程序的调试与测试、总结与体会、结束语、程序清单(带中文注释) 、参考文献等。三、三、设计内容及步骤设计内容及步骤1.根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么。具体要求至少实现进程管理模拟、存储器管理模拟、文件管理模拟,并将几个模块较好地集成一个整体,给出一个较好的用户界面。2.根据实现的功能,划分出合理的模块,明确模块间的关系。3.编程实现所设计的模块。4.程序调试与测试。5.结果分析。程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。6.编写课程设计报告;四、课程设计工作计划四、课程设计工作计划2010 年 6 月 12 日前,指导教师讲课,学生根据题目准备资料,需求分析;2010 年 6 月 13 日,提交软件总体模块结构图和分工方案;2010 年 6 月 13 日2009 年 6 月 16 日,完成程序模块并通过独立编译;2010 年 6 月 17 日2010 年 6 月 20 日,将各模块集成为一个完整的系统,并录入足够的数据进行调试运行,数据必须存储到磁盘文件中,已备验收;2010 年 6 月 22 日,验收、开始撰写课程设计报告;2010 年 6 月 24 日前,提交课程设计报告,并将软件的源文件及报告的word 文档打印交到老师办公室里。 指导教师签章: 教研室主任签章 操作系统导教师评语与成绩指导教师评语:课程设计表现成绩: 课程设计验收成绩: 课程设计报告成绩: 课程设计 总成绩: 指导教师签章 2010 年 7 月 日I目目 录录目目 录录I一、需求分析一、需求分析 11.1 功能需求11.2 背景描述11.3 具体设计内容分析1二、总体概要设计二、总体概要设计 32.1 系统的特点32.2 抽象数据整合32.3 系统模块图5三、详细设计三、详细设计 63.1 基本操作63.2 进程调度之时间片轮转详细设计73.3 模拟文件-改变目录流程10四、程序的调试与测试四、程序的调试与测试 134.1 调试分析134.2 测试结果14五、用户使用说明五、用户使用说明 19六、总结与体会六、总结与体会 20参考文献参考文献 21附录附录:程序清单程序清单221一、一、需求分析需求分析1.1 功能需求操作系统原理课程设计是软件工程专业实践性环节之一,是学习完操作系统原理课程后进行的一次较全面的综合练习。其目的在于加深对操作系统的理论、方法和基础知识的理解,掌握操作系统结构、实现机理和各种典型算法,进程调度、内存管理、文件管理、等各种调度管理算法模拟,系统地了解操作系统的设计和实现思路,培养学生的系统设计能力,并了解操作系统的发展动向和趋势。1.2 背景描述经过一个学期的操作系统原理 、 操作系统实验教程课程的学习,我们学到了很多理论上的知识,对操作系统及其各方面的功能有了深刻的认识,但这是远远不够的,我们要讲理论编程实践,虽然我们学习期间做过很多的实验,但是都是针对操作系统的某一块具体的功能的,我们对了解了每块具体的功能的实现,但是,整体说来还是模糊,所以,很有必要将各个模块整合起来,也就是模拟一个操作系统,这样,不仅跟深入学习了各个模块,更认识了一个完整的 OS,对我们来说受益匪。1.3 具体设计内容分析 本次课程设计所用环境:VC+6.0,采用控制台界面至少实现进程管理模拟、存储器管理模拟、文件管理模拟,并将几个模块较好地集成一个整体,实现各个管理调度算法的功能,并给出一个较好的用户界面。进程管理模拟:在多道程序运行环境下,进程数目一般多于处理机数目,是的进程要通过竞争来使用处理机。这就要求系统能按某种属案发,动态的把处理机分配给就绪队列中的一个进程,使之运行。进程调度包括常用的:先来先服务、时间片轮转、优先权等因为以前已经实现,所以这次 模拟整合到一起不算很难。存储器管理模拟:主存是中央处理器直接存取指令和数据的存储器,能否合理的利用主存,在很大程度上将影响到整个计算机系统的性能。在多道作业和多进程环境下,共享主存空间。当作业执行完毕或进程运行结束后将主存空2间归还系统。这次模拟包括:贮存分配与回收、基于分页的内存调度算法。有于模拟的比较简单,仅实现了最先适应算法、和先来先服务、最近你最久未使用的调度算法,实现比较简单。文件管理模拟:用于用户界面和操作命令在操作系统中的作用,实现操作系统中对文件的管理。文件中建立一个双向链表,每个聊表节点又是单链表的头结点,对目录、文件操作比较简单。 3二、总体概要设计二、总体概要设计2.1 系统的特点本次可设主要是简单的模拟一个操作系统,包括一个主界面,实现了银行家算法、模拟文件管理、主存空间的分配与回收、进程调度等功能。模拟了操作系统的进程管理、文件管理、存储器管理。银行家算法,包括了新加作业、申请资源、撤销作业、查看资源情况四个模块。如果申请资源后系统进入不安全状态,则申请失败。进程调度实现了调度进程的三个主要算法优先数、先来先服务、时间片轮转法。其中,优先数算法中优先数的确定为(50-进程的服务时间) ,每轮一次优先数-3。时间片轮转法的时间片由用户自己输入。存储器管理实现了申请空间、撤销作业、显示空闲表等功能。如果空闲空间不足则申请失败。模拟文件管理很全面,包含了创建目录、删除目录、改变目录、创建文件、删除文件、显示目录的功能。另外,我还加了回到根目录的功能。2.2 抽象数据整合银行家算法:const int MAX_P=20; / 进程的最大容量const int MAXA=10; / A 类资源的最大数量const int MAXB=5; /B 类资源的最大数量const int MAXC=7; /C 类资源的最大数量typedef struct anode int a,b,c,/*三种资源总数*/remain_a,remain_b,remain_c/*三种资源剩余数*/; bank;typedef struct node1 char name20; int a,b,c,need_a,need_b,need_c; process; / 进程的结构体结点模拟文件管:4typedef struct bnode char name50; int type;/*0 代表目录,1 代表普通文件*/ struct bnode *next,/* 兄弟节点*/*sub,/*第一个子节点*/*father/*父节点*/; int size; /*文件的大小*/dirnode;dirnode *workdir;/当前工作目录 dirnode root;/根目录 char path100;/定义路径信息 const int MAXJOB = 100;/定义最大记录数存储器管理:首先需要建立空闲区数据文件,空闲区数据文件包括若干行,每行有两个字段:起始地址,内存块大小(均为整数) ,各自段一逗号隔开。空闲区数据文件:0,1010,0818,1028,0634,1044,09空闲表的结构:typedef struct cnodeint start;int length;char tag20;job; job freesMAXJOB;/定义空闲区表 int free_quantity;job occupysMAXJOB;int occupy_quantity;进程调度:进程存在的标识是进程控制块(PCB) ,进程控制块结构如下:typedef struct dnode char name10;5 int prio; int round; int cputime; int needtime; int count; char state; struct dnode *next;PCB; / 进程的 PCBPCB *finish,*ready,*run,*r;2.3 系统模块图图 1 系统模块图进程调度存储器管理模拟文件管理主界面新加作业银行家算法申请资源撤销资源申请资源优先数调度时间片轮转先来先服务申请空间撤销作业显示空闲表改变目录创建目录创建文件删除文件显示目录申请资源申请资源申请资源6三、详细设计三、详细设计3.1 基本操作1)银行家算法:银行家算法主要由 5 个函数实现了四大功能,即新加作业、为作业申请资源、撤销作业、查看资源情况。void yinitial() /初始化函数void add() / 新加作业函数void bid() /为作业申请资源void yfinished()/撤销作业void yview()/查看资源情况2)模拟文件管理:模拟文件管理实现了很多功能,当然也有很多函数,每一个文件和目录都是用一个节点来描述的,用 type 来控制,有两个值,0 和1,0 代表目录,1 代表普通文件void minitial() /初始化目录函数dirnode * init() /初始化新节点的函数void CD(char dirname) /改变目录void CREATE(char filename,int filesize) /创建文件void DEL(char filename)/删除文件void dir(dirnode *p) /现实所有目录,本目录下所有兄弟目录和文件void dirs(dirnode *p,char str)/显示由目录下子目录中的文件和目录void LSALL()/显示所有目录void MD(char dirname)/创建目录void RD(char dirname)/删除目录3)存储器管理:void initial()/初始化函数int readData()/读数据函数void sort()/将空闲块按照从小到大的顺序排序void zview()/显示函数void earlist()/最先适应分配算法void zfinished()/撤销作业4)进程调度:void firstin()/调度进程使之运行void prt1(char a)/*void prt2(char a ,PCB *q)7void prt(char algo)*/上面的三本分主要是显示出来进程的调度情况void insert1(PCB *q)/插入新的进程void creat1(char alg)/*void creat2(char alg)*/以上两个实现进程的创建void priority(char alg)/优先数算法的实现void roundrun(char alg)/时间片轮转法的实现void FCFSrun(char alg)/先来先服务算法的实现void xianshi()/显示主界面的函数void yinhangjia()/主函数掉该函数实现银行家算法void wenjianguanli()/主函数调度该函数实现文件管理void zhucunkongjian()/主函数调度该函数实现存储器管理void jinchengdiaodu()/主函数调度该函数实现进程调度3.2 进程调度之时间片轮转详细设计进程调度中对于先来先服务调度原理简单、实现也很简单、对于优先数调度来讲,每次调度的就是优先权最高的,所以每次只要找到优先权最高的就能实现,用到 2 个单链表:一个等待服务、一个连接完成。在这里就不多说了。对于时间片轮转,可以设定时间片大小、中途不能改变,我就建立一个循环链表来存放等待进程,一个单链表来连接完成的进程。这个实现的时候,费了不少劲儿,但最终能没有 bug 的显示出来。这个调度有一个缺陷:要求进程必须是同时到达,由于时间仓促,我就没设计这个内容。如果涉及的话,我感觉能整出来无非是多加个标记,标签来判断进程的到达及服务。忘了说了,对于时间片算法,进程我是按顺序进行插入的。主要核心代码:void creat2(char alg) PCB *p; int i,time,round; char na10; ready = NULL; finish = NULL; run = NULL; printf(请输入时间片:); scanf(%d,&round); printf(输入进程号和运行时间:n);8 for(i = 1; i name,na); p-cputime = 0; p-needtime = time; p-state = W; p-count = 0; p-round = round; p-next = NULL; if(i = 1)/*按顺序插入到 ready 链表中*/ r = ready = p; else r-next = p; r = p; /clrscr(); printf( 时间片轮转算法输出信息:n); printf(*n); prt(alg);void roundrun(char alg)bool flag;/当 ready 列里只有一个时做标记 while(N) flag = 1;/初始化为 1 run = ready;/run 每次运行 ready 的队头 run-count+;/没运行一次计数器加 1 if(run-needtime round)/当剩余时间小于时间片轮转时间时的情况 run-cputime += run-needtime; run-needtime = 0; else run-cputime += run-round;9 run-needtime -= run-round; run-state = W;/变为等待 if(ready-next != NULL) ready = ready-next; else flag = 0;/当 ready 剩一个时做标记 if(run-needtime = 0)/当 run 结束时放入 finish 队列里 run-next = finish; finish = run; run-state = F; N-;/进程数少 1 else if(flag)/执行完如果不是剩一个的话,就把 run 放到队尾 r-next = run; r = run; r-next = NULL; if(N)ready-state = R;/结束时不应该有R else ready = NULL;/结束时应该为空 prt(alg);/输出 截图显示:图 A、B、C。图 A 时间片轮转算法界面10图 B 时间片轮转算法开始图 C 时间片轮转运行结束3.3 模拟文件-改变目录流程由于模拟文件管理采用双向链表,可以来回搜索。进入子目录后还可以回到根目录,所以就在程序加了返回到上一级目录的功能,就是在 CD()函数里加个条件,控制回到子目录还是上级目录。主要代码:void CD(char dirname) dirnode *p; int flag=0; if(strcmp(dirname,.) p=workdir-sub; if(p=NULL) cout错误,dirname子目录不存在type=0) 11 if(!strcmp(p-name ,dirname) flag=1; break; p=p-next; if(flag=1) workdir=p; strcat(path,); strcat(path,p-name); cout工作目录已进入dirnameendl; else cout错误,dirname子目录不存在name,root) workdir = workdir-father; for(int i = strlen(path)-1; i = 0; i-) if(pathi =) pathi = 0;break; cout工作目录已进入pathendl; else cout错误,当前已是根目录subP!=nulllp = p-next进入子目录子目录不存在已是根目录结束NYYNNY图 2 改变目录流程13四、程序的调试与测试四、程序的调试与测试4.1 调试分析(1)在试验过程中遇到了很多错误,最开始的时候,在将各个模块连接起来的时候几个函数的名字一样,出现了错误,如图:图 3 错误显示后来将函数的名字都改变了一下。(2)在主函数中将各个模块的主函数连起来的时候,退出来的时候整个程序就结束了,而我是想推出来的时候是退回到主界面,后来又给改了一下,加了一个 while 循环,还有变量 flag,有 flag 来控制,当 flag=0 的时候就跳出 while 循环,然后清屏,掉一个编好的显示函数,显示主界面,这样就退回了主界面,后来又发现主函数有很多东西,很乱,我又将每个模块的主函数部分又分出去一个函数,这样主函数掉每个模块的原来的主函数部分就好了。(3)在内存调度算法中由于 windows 里面没有 getpid()函数不了解 rand()就用结果造成却也计算率也来小。如图:图 4 内存调度算法 FIFO 中无 getpid()错误144.2 测试结果可设主界面:如图 图 5 设计主界面银行家算法:图 6 银行界算法主界面新加作业:图 7 添加作业查看资源情况:15图 8 资源使用情况为作业申请资源:图 9 申请资源撤销作业:图 10 撤销作业模拟文件管理:如图创建目录:图 11 模拟文件管理界面改变目录:16图 12 改变目录回到上一级目录:图 13 返回上一级目录显示目录:图 14 显示所有目录存储器管理模拟:如图显示空闲表:17图 15 显示空闲区分配表申请空间:图 16 申请空间进程调度模拟:优先数算法:图 17 优先数算法时间片轮转法:18图 18 时间片轮转法先来先服务算法:图 19 先来先服务算法19五、用户使用说明五、用户使用说明这次的课程设计实验主要是模拟一个操作系统的各个功能算法,重点在于算法的描述,应用。当运行的时候会出现一个主界面,上面列出了该系统主要实现的功能,可以根据提示选择 1.、进程调度 2、贮存空间分配与回收 3、模拟文件管理 4、内存调度算法 5、银行家算法 6、 退出系统。选择完后就进入该模块,如果选择的是 1 即银行家算法,进去后界面也会有提示,1、新加作业,2,、为作业申请资源 3、撤销作业 4、查看资源情况、0 退出系统,选择你想要操作的。会提示你相应的操作。如果选择的是 2 即模拟文件管理,进入后也有界面给予提示,但是这个模块有先后顺序,即应该先创建目录,之后在进行其他操作,我还加入了一个额外的功能,如果输入 cd . 就会回到上一级目录里。如果选择的是 3,即存储器管理,这个模块首先要在改程序在同一目录下建立一个空闲表,进入该模块后首先要输入改空闲表,例如,input.txt,如果该空闲表存在的话就会继续往下进行,根据提示做想要实现的操作。如果选择的是4,即进程调度,进入后可以选择 P、优先数算法,R、时间片轮转法 F、先来先服务算法、E 退出时间片轮转法的时间片由用户来定。这些模块中的退出都是退到主界面的,要想退出本系统,在主界面里有一个退出。20六、总结与体会六、总结与体会这次课程设计对我来说获益很大、体会很深,通过这次课程设计将所学的操作系统课程的知识用于实践,对所学的知识有了系统的了解、更深刻。在将各个模块连起来过正中首先要对各个模块都深入了解,不仅复习了所学的,以前不明白的现在明白了好多,而且对“操作系统”不再陌生,但是“操作系统“所要做的绝不是这么少的,所学的这些是远远不够的,希望还能有更深的了解。这次课程设计让我我熟练的练习了 VC+6.0 环境,更让那个我了解和运用 了 linux 操作系统,了解了 OS 内核结构,核心操作,以及最基本的 OS 管理。对以后学习有很大帮助。这次课程设计给我了很大的启示:无论学什么都要一步一个脚印,不能前面开始学很有劲头,后面就松懈了,要持之以恒。感谢老师耐心的教导,您认真的态度对我们很有帮助、很亲切,但对我来说是提升自身,我想我的 IT 之路还没走完,会有更深入的学习。再次感谢老师!2122参考文献参考文献1 李登实,徐宏云,计算机操作系统实验,北京,清华大学出版社,2000 年 9 月。2汤小丹,梁红兵,计算机操作系统,西安,西安电子科技大学出版社,2007 年 5 月。23附录附录:程序清单程序清单源码附录:#include#include#includeusing namespace std;#include#include#includeconst int MAX_P=20;const int MAXA=10;const int MAXB=5;const int MAXC=7;typedef struct anode int a,b,c,/*三种资源总数*/remain_a,remain_b,remain_c/*三种资源剩余数*/; bank;typedef struct node1 char name20; int a,b,c,need_a,need_b,need_c; process;bank banker;process processesMAX_P;int quantity;/作业的数量 typedef struct bnode char name50; int type;/*0 代表目录,1 代表普通文件*/ struct bnode *next,/* 兄弟节点*/*sub,/*第一个子节点*/*father/*父节点*/; int size; /*文件的大小*/dirnode;dirnode *workdir;/当前工作目录 dirnode root;/根目录 char path100;/定义路径信息 24const int MAXJOB = 100;/定义最大记录数typedef struct cnodeint start;int length;char tag20;job; job freesMAXJOB;/定义空闲区表 int free_quantity;job occupysMAXJOB;int occupy_quantity;typedef struct dnode char name10; int prio; int round; int cputime; int needtime; int count; char state; struct dnode *next;PCB;PCB *finish,*ready,*run,*r;int N;/银行家算法 /初始化函数void yinitial() int i; banker.a=MAXA; banker.b=MAXB; banker.c=MAXC; banker.remain_a=MAXA; banker.remain_b=MAXB; banker.remain_c=MAXC; for(i=0;iMAX_P;i+) strcpy(processesi.name,); processesi.a=0; processesi.b=0; 25 processesi.c=0; processesi.need_a=0; processesi.need_b=0; processesi.need_c=0; /新加作业void add() char name20; int flag=0,t,need_a,need_b,need_c,i; coutendl; cout新加作业 endl; cout-endl; coutname; for(i=0;iquantity;i+) if(!strcmp(processesi.name,name) flag=1;break; if(flag) cout错误,作业以存在endl; else coutneed_a; coutneed_b; coutneed_c; t=1; if(need_abanker.remain_a ) 26 cout错误,所需 A 类资源大于银行家所剩 A 类资源banker.remain_b ) cout错误,所需 B 类资源大于银行家所剩 B 类资源banker.remain_c ) cout错误,所需 C 类资源大于银行家所剩 C 类资源endl; t=0; if(t) strcpy(processesquantity.name,name); processesquantity.need_a=need_a; processesquantity.need_b=need_b; processesquantity.need_c=need_c; quantity+; cout新加作业成功endl; else cout新加作业失败endl; /为作业申请资源void bid() char name20; int i,p,a,b,c,flag; coutendl为作业申请资源endl;/输出 cout- endl; coutname;/输入27 p=-1; for(i=0;iquantity;i+) if(!strcmp(processesi.name,name) p=i;break; if(p!= -1) couta; coutb; coutc; flag=1; if(abanker.remain_a)|(aprocessesp.need_a-processesp.a) cout错误,所申请 A 类资源大于银行家所剩 A 类资源或该进程还需数量banker.remain_b)|(bprocessesp.need_b-processesp.b) cout错误,所申请 B 类资源大于银行家所剩 A 类资源或该进程还需数量banker.remain_c)|(cprocessesp.need_c-processesp.c) cout错误,所申请 A 类资源大于银行家所剩 A 类资源或该进程还需数量endl; flag=0; if(flag) banker.remain_a-=a; banker.remain_b-=b; banker.remain_c-=c; 28 processesp.a+=a; processesp.b+=b; processesp.c+=c; cout为作业申请资源成功endl; else cout为作业申请资源失败endl; else cout改作业不存在endl;/撤销作业void yfinished() char name20; int i,p; coutendl撤销作业endl; cout- endl; coutname; p=-1; for(i=0;iquantity;i+) if(!strcmp(processesi.name,name) p=i;break; if(p!=-1) banker.remain_a+=processesp.a; banker.remain_b+=processesp.b; banker.remain_c+=processesp.c; for(i=p;iquantity-1;i+) processesi=processesi+1; strcpy(processesquantity-1.name,); processesquantity-1.a=0; processesquantity-1.b=0; 29 processesquantity-1.c=0; processesquantity-1.need_a=0; processesquantity-1.need_b=0; processesquantity-1.need_c=0; quantity-; cout撤销作业成功endl; else cout撤销作业失败endl; /查看资源情况void yview() int i; cout查看资源情况endl; cout- endl; cout银行家所剩资源(剩余资源/总共资源)endl; coutA 类:banker.remain_a/banker.a ; coutB 类:banker.remain_b/banker.b ; coutC 类:banker.remain_c/banker.c; coutendlendl作业占用情况(已占用资源/所需资源)endl0) for(i=0;iquantity;i+) cout作业名:processesi.nameendl; coutA 类:processesi.a/processesi.need_a ; coutB 类:processesi.b/processesi.need_b ; coutC 类:processesi.c/processesi.need_c ; coutendl; else cout当前没有作业sub; if(p=NULL) cout错误,dirname子目录不存在type=0) if(!strcmp(p-name ,dirname) flag=1; break; p=p-next; if(flag=1) workdir=p; strcat(path,); strcat(path,p-name); cout工作目录已进入dirnameendl; else cout错误,dirname子目录不存在name,root) workdir = workdir-father; for(int i = strlen(path)-1; i = 0; i-) if(pathi =) pathi = 0;break; cout工作目录已进入pathendl; else cout错误,当前已是根目录name ,filename); q-sub=NULL; q-type=1; q-next=NULL; q-father=workdir; q-size=filesize; p=workdir-sub; if(p=NULL) workdir-sub=q; coutfilename文件创建成功type=1) if(!strcmp(p-name,filename) flag=1; cout错误,filename文件已存在next; if(flag=0) p=workdir-sub; while(p-next) 33 p=p-next; p-next=q; coutfilename文件创建成功sub; if(p=NULL) cout错误,filename文件不存在type=1) if(!strcmp(p-name,filename) flag=1; break; p=p-next; if(flag=1) if(p=workdir-sub) workdir-sub=p-next; else q=workdir-sub; while(q-next!=p) 34 q=q-next; q-next=p-next; delete p; coutfilename文件已删除endl; else cout错误,filename文件不存在type=0) cout name endl; else cout name sizenext; /显示由目录下子目录中的文件和目录 void dirs(dirnode *p,char str) char newstr100; dirnode *q; coutstr下子目录及文件:sub)/子 strcpy(newstr,); strcat(newstr,str); strcat(newstr,); strcat(newstr,q-name); dirs(q-sub,newstr); q=p; while(q-next)/兄弟 if(q-next-sub) strcpy(newstr,); strcat(newstr,str); strcat(newstr,); strcat(newstr,q-next-name); dirs(q-next-sub,newstr); q=q-next; /显示所有目录void LSALL() dirnode *p; cout显示所有目录结构; coutendl-endl; p=root.sub; if(p!=NULL) dirs(p,root); else cout目录为空name,dirname); q-sub=NULL; q-type=0; q-next=NULL; q-father=workdir; q-size=0; p=workdir-sub; if(p=NULL) workdir-sub=q; coutdirname子目录创建成功type=0) if(!strcmp(p-name,dirname) flag=1; cout错误,dirname子目录已存在next; if(flag=0) p=workdir-sub; while(p-next) p=p-next; p-next=q; coutdirname子目录创建成功sub; if(p=NULL) cout错误,dirname子目录已存在type=0) if(!strcmp(p-name,dirname) flag=1; break; p=p-next; if(flag=1) if(p=workdir-sub) workdir-sub=p-next; else q=workdir-sub; while(q-next!=p) q=q-next; 38 q-next=p-next; delete p; coutdirname子目录已删除endl; else cout错误,dirname子目录不存在endl;
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!