数据结构课程设计:行编辑程序
数据结构行编辑程序报告

InitStack(S);
InitStack(S1);
char ch,c;
ch=getchar();
while(ch!=EOF){//EOF为全文结束符
while(ch!=EOF&&ch!='\n'){
switch(ch){
case'#':Pop(S,c); break;//仅当栈非空时退栈
二.设计
用栈编辑一个输入缓冲区
1.用“#”符号删除前一个错误的字符,用Pop退出栈顶元素已删除最后一个错误元素。
2.用“@”符号删除前面一行元素,循环使用判断前是否还有元素,如有用Pop删除。直至判断栈空为止。实现退行功能。
此程序很恰当的运用了栈后进先出的特点,将栈定义,在算法中直接调用,帮助实现“#”符号的退格功能和“@”符号的退行功能。
}
Status GetTop(SqStack S,SElemType &e)
{//取栈顶元素
if(S.top==S.base) return ERROR;
e=*(S.top-1);
return OK;
}//GetTop
Status Push(SqStack &S,SElemType e)
{//入栈将e放入栈里面
case'@':{
while(!StackEmpty(S))
Pop(S,c);
};break;//构造空栈S
default:Push(S,ch); break;//有效字符进栈,未考虑栈满情形
}
ch=getchar();//从终端接收下一字符
}
while(!StackEmpty(S)){
数据结构课程设计_中文文本编辑(文本删除、修改、查询、统计、添加)

数据结构课程设计:文本编辑(最后附完整代码)一.问题描述---------------------------------------------1二.设计思路---------------------------------------------1三.系统实现功能1.建立单链表-------------------------------------------22.显示文章内容---------------------------------------- 33.查找文章语句-----------------------------------------34.删除文章语句-----------------------------------------55.替换文章语句-----------------------------------------76.统计文章字数-----------------------------------------107.写入文本结束程序--------------------------------------10四.系统不足及需改进分------------------------------------11五.文件清单说明------------------------------------------11六:附录-------------------------------------------------12一:问题描述本次我所做的课程设计为:文本编辑,主要内容是对中文文本的显示、查找、删除、替换、统计、写入文本。
在程序选择功能后根据提示,输入任意长度中文语句即可对文章进行操作。
二:设计思路文本编辑,顾名思义就是对一遍文章进行编辑,我所设计的是对中文的编辑。
中文有两个字节(汉字、标点),通常情况下通过文件输入流仅仅可以取一个字节或者是以空格为分隔符取单词这仅仅对英文的文章适用,周六周日我从网上搜索相关方法,未找到一条切实可用的对中文字符操作的方法。
行编辑程序

// 《数据结构》//第一组:行编辑程序(+注释)#include<stdio.h>#include<stdlib.h>#include<malloc.h>#include<string.h>#include<conio.h>#define STACK_MAX_SIZE 100 //初始化分配空间最大值#define STACKINCREMENT 10 //空间增量struct SqStack{char *base;char *top;int stacksize;}; //定义结构体,头尾指针void Initstack(SqStack &S) //建立栈{S.base=(char*)malloc(STACK_MAX_SIZE *sizeof(char)); //分配空间,每个元素为一个存储单元if(!S.base) exit(1); //存储分配失败S.top=S.base; //初始化,头尾指针指向同一位置S.stacksize=STACK_MAX_SIZE; //栈的容量为100}void push(SqStack &S,char e) //插入元素e为栈顶元素{if(S.top-S.base>=S.stacksize) //判断是否满栈{S.base=(char*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char)); //追加栈的容量10if(!S.base) exit(1); //存储分配失败S.top=S.base+S.stacksize; //头指针指向栈顶元素的上一个位置S.stacksize+=STACKINCREMENT; //此时栈的长度为110}*S.top++=e;}char pop(SqStack &S,char e) //若栈不空,则删除S的栈顶元素,用e返回其值{if(S.top==S.base) //return false;e=*--S.top; // 等价于e=*(S.top-1); --S.top; e=*S.top;return e;}void clearstack(SqStack &S) //清空栈{S.top=S.base;}void destorystack(SqStack &S) //销毁栈{free(S.base); //释放空间S.top=S.base;}bool stackempty(SqStack &S) //查看栈是否为空,如果空,返回true,否则返回fasle {if(S.top==S.base)return true;return false;}void printstack(SqStack &S) //打印栈内元素{char e;while(!stackempty(S)) //判断循环{pop(S,e); //压栈,e为栈顶元素printf("%d",e); //输出e}}void main() //主函数{char ch,e;SqStack S,D; //定义两个栈S和Dprintf("请输入字符:\n");Initstack(S); //构造栈SInitstack(D); //构造栈Dch=getchar();while(ch!=EOF) //如果ch不是终止字符{while(ch!=EOF&&ch!='\n') //ch不是终止字符,且不是'\n'{switch(ch) //循环{case'#':pop(S,e); break; //遇#,删除栈顶元素case'@':clearstack(S); break; //遇@,清空栈Sdefault:push(S,ch); break; //否则,插入字符ch}ch=getchar(); //输入字符}while(!stackempty(S)) //如果栈S非空,循环{e=pop(S,e);push(D,e);}while(!stackempty(D)) //如果栈D非空,循环{e=pop(D,e);printf("%c",e);}clearstack(S);if(ch!=EOF)ch=getchar();}destorystack(S); //销毁栈S}/*遇到问题:1、头指针和尾指针的指向问题2、初始化空间容量问题,追加空间增量3、Switch分支语句判断问题*/。
行编辑程序

计算机系上机实验报告实验项目名称行编辑程序所属课程名称数据结构实验类型综合型实验班级完整学号姓名成绩实验概述:【实验目的】1.练习行编辑程序并写出栈的逻辑结构表示2.掌握栈的特点并实现栈的存储表示3.用栈解决行编辑的问题【实验环境】(使用的软件)Visual C++ 6.0 控制台编程环境实验内容(不够附页):【实验方案设计与实验过程】(分析、设计、实验步骤、测试数据、实验结果)一、分析行编辑程序的功能:接受用户从终端输入的程序或数据,并存入用户的数据区。
较好的做法:设立一个输入缓冲区,用来接收用户输入的一行字符,然后逐行存入用户数据区。
例如,当用户发现刚刚键入放入一个字符是错的时,可补符进一个退格符“#”,以表示前一个字符无效;如果发现当前键入的行内差错较多或难以补救,则可以键入一个退行符“@”,以表示当前行中的字符均无效。
二、设计使用栈结构实现输入缓冲区从终端接收一个字符进行判断:1、不是“#”也不是“@”则压入栈顶2、是“#”,则栈顶元素出栈3、是“@”,则栈清空4、接收到行结束符或全文结束符将数据送入用户数据区三、实验步骤四、测试数据【实验小结】(实验过程中出现的问题、结果分析、出错原因分析等)(实验过程中出现问题举例)1.问题:在程序实现过程中,编译时没有出现错误:但在运行结果时却出现如下错误:仔细检查程序,发现是由于少写了如下一段程序:case'@':{while(!StackEmpty(S))Pop(S,c);};break;//构造空栈S加上以上语句,再编译执行,程序运行正常。
成绩:批阅日期:。
简单行编辑器 数据结构 课程设计

简单行编辑器数据结构课程设计概述:本文旨在设计一种简单的行编辑器,以满足基本的文本编辑需求。
行编辑器是一种常见的文本编辑工具,它允许用户在文本中进行插入、删除、挪移光标等操作。
为了实现这一目标,我们将采用数据结构来管理文本的存储和操作。
1. 数据结构设计:1.1 文本存储:我们可以使用链表作为文本的基本数据结构,每一个节点存储一个字符。
链表的每一个节点包含一个字符和指向下一个节点的指针。
这样的设计可以方便地进行插入和删除操作,同时保持文本的顺序。
1.2 光标位置:光标的位置可以用一个指针指向链表中的某个节点。
这个指针可以指向一个字符之前、之后或者字符本身的位置。
通过挪移光标指针,用户可以在文本中进行插入、删除和挪移操作。
2. 功能实现:2.1 插入操作:用户可以在光标当前位置插入一个字符。
插入操作包括以下步骤:- 创建一个新节点,存储要插入的字符。
- 将新节点插入到光标所在节点的前面或者后面,更新链表的指针。
2.2 删除操作:用户可以删除光标当前位置的字符。
删除操作包括以下步骤:- 找到光标所在节点。
- 更新链表的指针,将光标所在节点从链表中移除。
2.3 光标挪移操作:用户可以通过挪移光标来改变插入和删除操作的位置。
光标挪移操作包括以下步骤:- 根据用户输入的指令,将光标指针向前或者向后挪移一个节点。
2.4 文本显示:用户可以查看当前编辑的文本内容。
通过遍历链表,将字符挨次输出即可。
3. 用户界面设计:为了方便用户操作,我们可以设计一个简单的用户界面,包括以下组件:- 文本显示区域:显示当前编辑的文本内容。
- 光标位置指示器:显示光标当前位置。
- 命令输入框:接收用户输入的命令。
4. 实例演示:假设用户输入以下命令序列:- 插入字符 'A':光标指向开头,文本变为 "A"。
- 插入字符 'B':光标指向 'A' 后面,文本变为 "AB"。
行编辑程序说明书

摘要本课程设计是实现“简单的行编辑程序”,此编辑程序的主要用处是接受用户从终端输入的程序和数据,并存入用户的数据区。
这个行编辑程序需要实现的功能包括:能够设立一个输入缓冲区,用于接受用户输入的一行字符然后逐行存入用户数据区;用户在输入出差错时,并在发现有误时可以及时更改。
此程序是一个课程设计的程序,只是模拟的一个简单的行编辑器,如需要真正设计一个行编辑器,那么还需要更为完善的程序。
关键词:行编辑;数据结构;VC++;线性结构AbstractThis course is designed to achieve "a simple line editor", the main use of this editing program is to accept input from the terminal user programs and data, and the data stored in the user's area. This program needs to achieve line editing features include: the ability to set up an input buffer for receiving a line of characters entered by the user and stored in the user data area progressive; awry when the user input, and can be found in time to change the wrong time . This program is a curriculum design process, just simulate a simple line editor, such as the need to really design a line editor, you also need a more comprehensive program.Keyword:Line editing; data structure; VC + +; linear structure目录1课题设计要求 (1)1.1课程设计的题目及内容 (1)1.2 题目要求 (2)2概要设计 (3)2.1存储结构的定义 (3)2.2功能函数 (3)2.3主函数 (4)2.4 函数设计 (4)2.4.1 主函数界面设计 (4)2.4.2帮助函数界面设计 (5)2.4.3用户操作界面设计 (5)3详细设计 (10)3.1主函数的设计 (10)3.2帮助函数子程序设计 (10)3.3编辑函数子程序设计 (11)3.4活区显示函数子程序设计 (12)3.5活区切换函数子函数设计 (13)3.6行删除函数子程序设计 (14)3.7行插入行数子程序的设计 (15)4调试过程及实验结果 (16)4.1调试过程 (16)4.2实验结果 (16)4.2.1帮助函数调试结果 (16)4.2.2打开文件函数调试结果 (17)4.2.3活区显示函数调试结果 (17)4.2.4活区切换函数调试结果 (18)4.2.5行删除函数调试结果 (18)4.2.6行插入函数调试结果 (19)5结论 (20)参考文献 (21)致谢 (22)附录1:用户使用说明 (23)附录2:源程序 (24)1课题设计要求1.1课程设计的题目及内容本次课程设计的题目为:简单的行编辑程序。
简单行编辑器 数据结构 课程设计

中国矿业大学徐海学院计算机系《软件认知实践》报告姓名:学号:专业:设计题目:简单行编辑器指导教师:2012年12月25目录第1章题目概述 (1)第1.1节题目要求 (1)第1.2节主要难点 (2)第2章系统流程图 (3)第3章数据结构和算法 (4)第4章核心代码分析 (6)第5章复杂度分析 (10)第6章总结 (11)参考文献 (13)第1章题目概述在这次课程设计中我选的题目是文本编辑,文本编辑几乎是每个使用电脑的人都会遇到的问题,特别是网络小说作家们。
在文本的编辑中,我们会时常遇到文本信息的统计问题、小型子串的查找问题、子串的查找和删除问题等。
如果靠人自己去观察和执行相关操作的话,不仅累人,而且很容易出错。
而使用计算机程序去实现的话,则会省力不少,而且相对来说非常精确。
本程序使用了较快速的查找算法,可以大大提高检索的效率,相信这可一极大的方便用户用电脑编辑文本文件。
第1.1节题目要求文章编辑功能:输入一页文字,程序可以统计出文字、数字、空格的个数。
静态存储一页文章,每行最多不超过80个字符,共N行;要求(1)分别统计出其中英文字母数和空格数及整篇文章总字数;(2)统计某一字符串在文章中出现的次数,并输出该次数;(3)删除某一子串,并将后面的字符前移。
存储结构使用线性表,分别用几个子函数实现相应的功能;输入数据的形式和范围:可以输入大写、小写的英文字母、任何数字及标点符号。
输出形式:(1)分行输出用户输入的各行字符;(2)分4行输出"全部字母数"、"数字个数"、"空格个数"、"文章总字数"(3)输出删除某一字符串后的文章;实现功能(1)文章内容的输入:包括字母、标点符号、数字等;(2)文章内容的统计:包括文章中大写字母、小写字母、数字、标点符号、空格以及文章所有字数的个数的统计;(3)文章内容的处理:包括对文章内容的查找、删除以,其中在查找的过程中统计出该字符或字符串在文章中出现的次数;第1.2节主要难点本程序是对一段英文文章的内容进行处理,存储方式采用链式存储,没有文件操作,故本程序对其文本内容的所有操作都是在链表中进行的。
行编辑程序课程设计

行编辑程序课程设计一、课程目标知识目标:1. 学生能理解行编辑程序的基本概念,掌握其功能和用途。
2. 学生能掌握行编辑程序的基本操作,如插入、删除、替换和查找。
3. 学生了解行编辑程序与文本处理软件(如记事本、Word等)的区别和联系。
技能目标:1. 学生能够独立使用行编辑程序进行文本编辑和操作。
2. 学生能够运用行编辑程序解决实际问题,如修改代码、配置文件等。
3. 学生通过行编辑程序的学习,培养逻辑思维和问题解决能力。
情感态度价值观目标:1. 学生对计算机编程产生兴趣,树立编程学习的自信心。
2. 学生培养良好的编程习惯,注重代码规范和团队协作。
3. 学生认识到行编辑程序在实际应用中的价值,激发学习计算机科学的热情。
分析课程性质、学生特点和教学要求:1. 课程性质:本课程为信息技术学科,以实践操作为主,理论讲解为辅。
2. 学生特点:六年级学生具备一定的计算机操作基础,思维活跃,好奇心强。
3. 教学要求:结合学生实际,注重实践操作,提高学生的动手能力和解决问题的能力。
二、教学内容1. 行编辑程序基本概念:介绍行编辑程序的定义、功能和用途,结合课本第二章第一节内容,让学生了解行编辑程序在计算机编程中的重要性。
2. 行编辑程序基本操作:详细讲解插入、删除、替换和查找等操作,对应课本第二章第二节,通过实例演示和练习,使学生熟练掌握操作方法。
3. 行编辑程序与文本处理软件的对比:分析行编辑程序与文本处理软件的异同,以课本第二章第三节为例,让学生明白两者在实际应用中的适用场景。
4. 实践操作:安排学生进行行编辑程序的操作练习,结合课本第二章练习题,巩固所学知识,提高实际操作能力。
5. 行编辑程序在实际应用中的案例:介绍行编辑程序在编程、配置文件等领域的应用,参照课本第二章案例分析,激发学生学习兴趣,培养实际应用能力。
6. 编程习惯与规范:讲解编程过程中应注意的规范和习惯,结合课本相关内容,培养学生良好的编程素养。
简单行编辑

电子信息工程学院
课程设计报告
设计名称:数据结构课程设计
简单行编辑程序
姓名:学号:
专业班级:电子信息工程学院
系(院):
设计时间:
设计地点:EDA实验室
要打开的文件内容显示出来。
3.在执行“5.Open the file”时,输入想要打开文件的正确路径,回车。
如果想要打开的文件不存在,则跳出运行。
4.在进行保存文件的操作时,在提示后输入想要保存的正确路径名,再按回车,文件即被保存。
六测试成果
图(1):
图(2):
图(3):
图(4):
七附录(源程序清单)
#include "stdio.h"
#include "stdlib.h" #include "string.h" struct line{。
数据结构课程设计——简单行编辑程序

数据结构课程设计——简单行编辑程序电子信息工程学院课程设计报告设计名称: 数据结构课程设计简单行编辑程序姓名: 学号:专业班级: 电子信息工程学院系 (院):设计时间:设计地点: EDA实验室指导教师评语:成绩:签名:年月日数据结构课程设计报告第 1 页,共 15 页1(课程设计目的1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。
2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4.训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。
2(课程设计任务与要求:任务问题描述:文本编辑程序是利用计算机进行文字加工的基本软件工具,实现对文本文件的插入、删除等修改操作。
限制这些操作以行为单位进行的编辑程序称为行编辑程序。
被编辑的文本文件可能很大,全部读入编辑程序的数据空间(内存)的做法即不经济,又不总能实现。
一种解决方法是逐段的编辑。
任何时刻只把待编辑文件的一段放在内存,称为活区。
试按这种方法实现一个简单的行编辑程序,设文件每行不超过320个字符,很少超过80个字符。
要求:实现以下4条基本的编辑命令:(1)行插入。
格式:i<行号><回车><文本>. <回车>将<文本>插入活区中第<行号>行之后。
(2)行删除。
格式:d<行号1>[<空格><行号2>.]<回车>例如删除活区中第<行号1>行(到第<行号2>行)。
例如:例如:“d10?”和d1014?”。
(3)活区切换。
格式:n<回车>将活区写入输出文件,并从输入文件中读入下一段,作为新的活区。
简单行编辑系统数据结构课程设计

数据结构课程设计说明书2012 年 8月 30 日1. 概述 (1)1.1 设计目的 (1)1.2 设计目标及要求设计要求 (1)1.3 设计进度 (1)1.4 分工 (2)2. 需求分析及总体设计 (2)2.1 数据结构 (2)2.2 功能框架 (2)3.功能模块详细设计 (2)3.1设计流程 (3)3.2主要源代码 (3)4.功能模块详细设计 (5)4.1设计流程......................................................................... 错误!未定义书签。
4.2主要源代码 (5)1. 概述1.1 设计目的被编辑的文本文件可能很大,全部读入编辑程序的数据空间(内存)的作法既不经济,也不总能实现。
所以设计这一种以行为单位进行的编辑程序。
主要是逐段地编辑。
任何时刻只把待编辑文件的一段放在内存,称为活区。
需要用到的数据结构是链表。
1.2 设计目标及要求设计要求(1)行插入:格式: i<回车><行号><回车><文本><回车>功能:在指定行之后插入一行或几行。
(2)行删除:格式: d<回车><行号1>[<空格><行号2>]<回车>功能:在指定行之后插入一行或几行。
(3)行替换:格式: i<回车><行号><回车><文本><回车>功能:在指定行之后插入一行或几行。
(4)活区切换:格式: n<回车>功能:将活区写入文件,并从文件中读入下一段,作为新的活区。
(5)活区显示:格式: p<回车>功能:逐页地(每页20行)显示活区内容,每显示一页之后请用户决定是否继续显示以后备页(如果存在)。
印出的每一行要前置行号和一个空格符,行号固定占4位,增量为1。
实验三 行编辑程序

实验三行编辑程序一、预备知识1. 栈的存储结构形式及其描述2. 栈的建立、查找、插入和删除操作3. 栈的LIFO原则二、实验目的1. 掌握顺序栈的存储结构形式及其描述2. 掌握顺序栈的建立、查找、插入和删除操作3. 掌握利用顺序栈存储用户输入的字符,及做出相应的操作三、实验内容一个简单的行编辑程序的功能是:接受用户从终端输入的字符,并存入用户的数据区。
允许用户输入出错时可以及时更正。
可以约定'#'为退格符,表示前一个字符无效,'@'为退行符,表示当前行所有字符均无效,以换行符('\n')表示输入结束。
例:在终端上用户输入为whli##ilr#e(s#*s)则应为while(*s)四、实验说明顺序栈的类型定义#include <stdio.h>typedef struct {SElemType *base; //栈底指针SElemType *top; //栈顶指针int stacksize;} SqStack;我们可以用一个栈来实现这种功能的文字编辑器,每次读入一个字符,编辑器就进行判别:若读入的字符是'#',则退栈;若读入的字符是'@',则置空栈;若读入的字符是'\n',则编辑结束;当读入其余字符时,则执行进栈操作,将其加入栈中。
因此,我们可以画出程序流程图,如下图所示:五、注意问题1. 重点理解顺序栈存储的特点及两个指针的含义。
2. 注意比较顺序存储与链式存储的各自特点。
3. 请考虑栈的“下溢”和“上溢”是否是出错状态?还有哪些问题可以使用栈这种数据结构来解决?六、实验报告根据实验情况和结果撰写并递交实验报告。
数据结构-课程设计-简单行编辑程序

由学生依据软件工程的测试技术自己确定。注意测试边界数据,如首行、尾行。
4)实现提示
(1) 设活区的大小用行数activemaxlen(可设为100)来描述。考虑到文本文件行长通常为正态分布,且峰值在60到70之间,用320×activemaxlen大小的字符数组实现存储将造成大量浪费。可以以标准行块为单位为各行分配存储,每个标准行块含81个字符。这些行块可以组成一个数组,也可以利用动态链表连接起来。一行文字可能占多个行块。行尾可用一个特殊的ASCII字符(如(012)8)标识。此外,还应记住活区起始行号。行插入将引起随后各行行号的顺序下推。
(2) 初始化过程包括:请用户提供输入文件名(空串表示无输入文件)和输出文件名,两者不能相同。然后尽可能多地从输入文件中读入各行,但不超过activemaxlen-x。x的值可以自定。
(3) 在执行行插入命令的过程中,每接收到一行时到要检查活区大小是否已达activemaxlen。如果是,则为了在插入这一行之后仍保持活区大小不超过activemaxlen,应将插入点之前的活区部分中第一行输出到输出文件中;若插入点为第一行之前,则只得将新插入的这一行输出。
学号
数据结构课程设计
设计说明书
简单行编辑程序
起止日期:2011年12月12日至2011年12月16日
学生姓名
班级
成绩
指导教师(签字)
电子与信息工程系
2011年12月16日
天津城市建设学院
课程设计任务书
2011—2012学年第1学期
电子与信息工程系软件工程专业班级
课程设计名称:数据结构课程设计
设计题目:简单行编辑程序
void putIn()将文件从文件读入内存;
简单的行编辑器课程设计报告--学弟学妹们不用这么辛苦找了

长春工程学院C语言课程设计题目编号和名称简单的行编辑器教师姓名学生姓名学生学号学生班级所在院系日期2011 年 6 月日简单的行编辑器目录1.题目要求…………………………………………2.需求分析………………………………………....3.总体设计…………………………………………4.详细设计…………………………………………5.总结……………………………………………….1.【题目要求】设计一个简单的行编辑器【要求】(1)设置一个简单的行编辑器,每行以回车结束(2)数据以文件形式存储(3)编辑器具有查找、替换、修改数据的功能2.【需求分析】根据题目要求,行编辑器的数据以文本文件存放在文件中,故需要提供文件的输入、输出等操作;在程序运行过程中要实现查找、替换、修改数据的功能应提供查找、替换、修改数据等操作;另外还应提供键盘式选择菜单功能选择。
3.【总体设计】根据上面的需求分析,可以将这一系统的设计分为输入、查找、替换修改数据、退出等四个模块(系统功能模块如图1所示)图1 行编辑器功能模块图4.【详细设计】1. 主函数主函数的设计一般较简单,一般只提供输入、功能处理和输出部分的函数调用其中各功能模块用菜单方式选择。
主函数流程图如图1-1 程序如下 void main() { cout<<"\t\t\t 简单行编辑.\n"; Str s1; Str s2; Str ss; Str ss1; Str ss2; int n; s1.input_str(); int choice=-1;while(choice!=0) 图1-1 行编辑器主函数流程 { //system("cls");cout<<"\t\t\t *******简单行编辑******\n"; cout<<"\t\t\t ***********************\n";cout<<"\t\t\t 1: 打印字符串.\n";cout<<"\t\t\t 2: 插入字符串.\n"; cout<<"\t\t\t 3: 删除字符串.\n";cout<<"\t\t\t 4: 复制整个字符串.\n";cout<<"\t\t\t 5: 替换字符串.\n";cout<<"\t\t\t 6: 查找一个字符串的位置.\n"; cout<<"\t\t\t 7: 继续输入. \n"; cout<<"\t\t\t 0: 退出.\n";cout<<"\t\t\t ************************\n";cout<<"\t\t\t 请选择: ";cin>>choice;switch(choice){case 1: cout<<"\t\t\t1: 打印出字符串.\n";s1.print_str(s1);break;case 2: cout<<"\t\t\t2: 插入字符串.\n";s1.insert_str(s1,s2,ss);break;case 3: cout<<"\t\t\t3: 删除字符串.\n";s1.delete_str(s1,s2);break;case 4: cout<<"\t\t\t4: 复制整个字符串.\n";s1.copy_str(s1,s2);break;/*case 5: cout<<"\t\t\t5: 替换字符串.\n";s1.instead_str(s1,s2,ss1,ss2,n);break;*/case 6: cout<<"\t\t\t6: 查找一个字符串的位置.\n";s1.find_position(s1,ss,n);break;case 7: cout<<"\t\t\t7: 继续输入.\n";s1.go_on_input(s1);break;case 0: cout<<"\t\t\t0: 退出.\n";break;default:cout<<"\t\t\terror.\n";break;}}}2.各功能模块的设计(1)输入、打印模块该程序需要输入一段字符串作为其待处理数据,所以通过键盘输入字符串作为待处理数据,以回车进入主函数界面。
字符串实现一个简单的行编辑器(数据结构课程设计参考样本)

用字符串实现一个简单的行编辑器学生姓名:OOO 指导老师:XXX摘要:本课程设计主要解决在文本编辑中,对行编辑的问题,通过字符串完善对文本的编辑,实现对文本的查找、替换、和修改数据。
在本课程设计中,系统开发平台为Windows2000,程序设计语言为C语言,程序运行平台为Windws 98/2000/XP。
在程序设计中采用了字符串的方法实现对简单的行编辑器。
程序通过调试运行,初步实现了设计目标,并且经过适当完善后,将可以应用在实际中解决问题。
关键词:程序设计;行编辑器;C语言;1 引言对于日常生活中的文本编辑来说,行编器是一个很重要的问题,文本的完善关系到文件做出的完美,决定了人们在编辑文本的时效率。
一个好的用字符串实现的行编辑可以大大的提高人们办公效率。
1.1 课题背景行编辑器是文本编辑器的一种,针对行进行编辑。
现在看来当然非常地老式,这种编辑器起源于操作员还使用电传打字机的年代,也就是一个打印机连着键盘,因为没有显示器,也就无法在文档中移动光标。
行编辑器只能从事最简单的输入输出。
输入、编辑、文档显示并不能同步地进行。
一般而言,用户无法直接输入文本,而只能在文本终端上通过简要的命令,对已有的文档进行添加或编写。
命令和文本,以及编辑器的相应输出,会根据他们的输入顺序,从底部开始逐一显示。
虽然命令一般会显示被修改的行,但如果要将行连同文档中的上下文显示,则需要另外单独的命令。
现在常见的编辑器,都是通过移动光标,来选取要编辑的文本段落,与此不同的是,行编辑只能对“当前行”进行编辑。
一般也可以在行内进行上下文匹配,或者选择特定行,以决定哪部分文档将被编辑或显示。
当然,这些编辑每次都只能针对一行。
行编辑器就只能一行一行的编辑,不能出错,一出错就得重来。
因此我们用字符串来定义,可以增强行编辑器的应用,增强可读性,加快人们的编辑文本的效率,从而推进社会的发展。
这就是其重要意义。
1.2 课程设计目的数据结构是在整个计算机科学与技术领域上广泛被使用的术语。
数据结构课程设计——简单行编辑程序

/*指向表中最后一个项目的指针 */
struct line *find(int),*dls_store(struct line *);
void patchup(int,int),delete_text(),list(),save(char *),load(char *);
menu_select(); enter(int linenum);
四 设计与调试分析
这个程序的源程序是我在图书馆资料上找的,当时不能运行,main 的界面也不是现在这样。 源程序里面也没有存文件和读取文件的功能,我先对源程序进行调试分析,把里面的错误一一 改正,编写出 mian 程序。然后在里面添加了存文件和打开文件的功能,使的程序更加完善。 本程序在运行时,必须选择“3.Display a line”才能将输入,删除或者打开后的文件显示出 来,这就有点浪费时间,使得操作有点复杂。
}
/* 显示菜单,供用户选择 */ menu_select() {
char s[80]; int c; printf("\t\t1.Enter\n"); printf("\t\t2.Delete a line\n"); printf("\t\t3.Display a line\n"); printf("\t\t4.Save the file\n"); printf("\t\t5.Read the file\n"); printf("\t\t6.Quit\n"); do{ printf("\n\n\t\t Please choice a num :"); gets(s); c=atoi(s); }while(c<0||c>6); return(c); }
数据结构课程设计:行编辑程序

一、需求分析由于被编辑的文本文件可能很大,全部读入编辑程序的数据空间(内存)的作法既不经济,也不总能实现。
而用行编辑把待编辑文件的一段放进内存,称为活区。
本行编辑程序是以每行不超过320个字符为前提的。
每次编辑会读入80行,活区每次只显示20行。
1.该程序要实现以下基本编辑命令和一些相关的命令:(1)行插入。
格式:i<回车><行号><回车><文本><回车>。
将<文本>插入活区第<行号>行之后。
(2)行删除。
格式:d<回车><行号1>,<行号2><回车>。
删除活区中第<行号1>行到第<行号2>行。
(3)活区切换。
格式:n<回车><页数><回车>。
由于每次从输入文件读入80行,而活区每页显示20行,而活区切换就是要切换到需编辑的页面上去。
(4)活区显示。
格式p<回车>。
显示当前要编辑的活区内容。
印出的每一行都有一个前置行号和一个空格符,行号固定为2位,增量为1。
(5)清屏。
格式:c<回车>。
(6)获得帮助。
格式:h<回车>。
(7)退出。
格式:e<回车>。
二、概要设计程序结构流程图:存储结构的定义如下:typedef struct text{char string[80];//存储每一行的元素struct text *next;//指向后一个节点的指针int flat;//确定此行是否被删除的标志}text,*textp;功能函数:Status Createlist(textp &head);功能:建立一个80个节点的链表,是整个活区的大小int del(textp head);功能:删除显示的活区的任意一行。
int display(textp &head);功能:按照每页20行的规格显示活区的内容。
数据结构-课程设计-简单行编辑程序

由学生依据软件工程的测试技术自己确定。注意测试边界数据,如首行、尾行。
4)实现提示
(1) 设活区的大小用行数activemaxlen(可设为100)来描述。考虑到文本文件行长通常为正态分布,且峰值在60到70之间,用320×activemaxlen大小的字符数组实现存储将造成大量浪费。可以以标准行块为单位为各行分配存储,每个标准行块含81个字符。这些行块可以组成一个数组,也可以利用动态链表连接起来。一行文字可能占多个行块。行尾可用一个特殊的ASCII字符(如(012)8)标识。此外,还应记住活区起始行号。行插入将引起随后各行行号的顺序下推。
(2) 初始化过程包括:请用户提供输入文件名(空串表示无输入文件)和输出文件名,两者不能相同。然后尽可能多地从输入文件中读入各行,但不超过activemaxlen-x。x的值可以自定。
(3) 在执行行插入命令的过程中,每接收到一行时到要检查活区大小是否已达activemaxlen。如果是,则为了在插入这一行之后仍保持活区大小不超过activemaxlen,应将插入点之前的活区部分中第一行输出到输出文件中;若插入点为第一行之前,则只得将新覆盖后一个。然后将要插入的内容写入插入处即可。
行与行之间交换,这个比较容易实现。只需将要交换的两行的内容交换即可。
三、总体设计
程序的功能图:
程序流程图
否
是
四、详细设计
struct Row行的结构体,包含行的内容,行的编号;
class Active活区的类,包含活区内行的总数量、行的结构体;
2)基本要求
实现以下4条基本编辑命令:
(1) 行插入。格式:i<行号><回车><文本><回车>
数据结构实现行编辑程序(严蔚敏老师数据结构3.2)

数据结构实现⾏编辑程序(严蔚敏⽼师数据结构3.2)————————————————————————————————————————————/**************************************************//* ⾏编辑程序 *//* 输⼊的数据存⼊缓冲区⽤来接收⽤户输⼊的⼀⾏字符 *//* 之后逐⾏存⼊⽤户数据区 *//* 当⽤户输⼊出错时可以输⼊退格符 # 来表⽰前⼀个字符⽆效 *//* 输⼊@ 表⽰当前⾏中之前输⼊的字符⽆效 *//**************************************************/————————————————————————————————————————————v1:读取⼀⾏直接打印,不存⼊数据区代码实现:1/**************************************************/2/* v1:读取⼀⾏直接打印,不存⼊数据区 */3/**************************************************/4 #include <stdio.h>5 #include <string.h>6 #include <stdlib.h>7#define STACK_INIT_SIZE 1008#define STACKINCREAMENT 109#define OK 110#define ERROR 011#define OVERFLOW -212 typedef char SElemtype;13 typedef int Status;14 typedef struct15 {16 SElemtype *top;17 SElemtype *base;18int stacksize;19 } SqStack;20 Status InitStack(SqStack *s)21 {22 s->base = (SElemtype *)malloc(STACK_INIT_SIZE * sizeof(SElemtype));23if (!s->base)24 exit(OVERFLOW);25 s->top = s->base;26 s->stacksize = STACK_INIT_SIZE;27return OK;28 }29 Status Push(SqStack *s, SElemtype c)30 {31if (s->top - s->base == s->stacksize)32 {33 s->base = (SElemtype *)realloc(s->base, (s->stacksize + STACKINCREAMENT) * sizeof(SElemtype));34if (!s->base)35 exit(OVERFLOW);36 s->top = s->base + s->stacksize;37 s->stacksize += STACKINCREAMENT;38 }39 s->top++;40 *(s->top) = c;41return OK;42 }43 Status Pop(SqStack *s)44 {45if (s->top == s->base)46return ERROR;47 --s->top; //此处弹栈不需要返回栈顶元素,直接删除即可48 }49 Status PrintStack(SqStack *s)50 {51int i = 0;52while((s->base + i) != (s->top))//遍历栈,从栈底+1开始直到栈顶为⽌53 {54 i++;55 printf("%c", *(s->base + i));56 }57return OK;58 }59 Status ClearStack(SqStack *s)60 {61 s->top = s->base;62return OK;63 }64/**************************************************/65/* 通过getchar()接收当前输⼊的⼀个字符 */66/* 输⼊为⾮#@ 时压栈 */67/* 输⼊为 # 时弹栈删除上⼀个字符 */68/* 输⼊为 @ 时清空栈中元素 */69/* 输⼊为 \n 时清栈 */70/* 输⼊为 EOF 时结束输⼊ */71/**************************************************/72void LineEdit(SqStack *s, SElemtype c)73 {74switch(c)75 {76case'#':77 Pop(s);78break;79case'@':80 ClearStack(s);81break;82default:83 Push(s, c);84break;85 }86 }87int main(void)88 {89 SqStack s;90 SElemtype c, *temp;91 InitStack(&s);92 c = getchar();93while(c != EOF)94 {95while(c != EOF && c != '\n')96 {97 LineEdit(&s, c);98 c = getchar();99 }100 PrintStack(&s);101 ClearStack(&s);102 printf("\n");103// if(c != EOF)104 c = getchar(); // 读取下⼀⾏的第⼀个字符105 }106return0;107 }————————————————————————————————————————————v2:将读取到的⾏存⼊数据区(字符串数组),最终统⼀打印代码实现:1/**************************************************/2/* v2:将读取到的⾏存⼊数据区(字符串数组),最终统⼀打印 */3/**************************************************/4 #include <stdio.h>5 #include <string.h>6 #include <stdlib.h>7#define STACK_INIT_SIZE 1008#define STACKINCREAMENT 109#define OK 110#define ERROR 011#define OVERFLOW -212 typedef char SElemtype;13 typedef int Status;14 typedef struct15 {16 SElemtype *top;17 SElemtype *base;18int stacksize;19 } SqStack;20 Status InitStack(SqStack *s)21 {22 s->base = (SElemtype *)malloc(STACK_INIT_SIZE * sizeof(SElemtype));23if (!s->base)24 exit(OVERFLOW);25 s->top = s->base;26 s->stacksize = STACK_INIT_SIZE;27return OK;28 }29 Status Push(SqStack *s, SElemtype c)30 {31if (s->top - s->base == s->stacksize)32 {33 s->base = (SElemtype *)realloc(s->base, (s->stacksize + STACKINCREAMENT) * sizeof(SElemtype)); 34if (!s->base)35 exit(OVERFLOW);36 s->top = s->base + s->stacksize;37 s->stacksize += STACKINCREAMENT;38 }39 s->top++;40 *(s->top) = c;41return OK;42 }43 Status Pop(SqStack *s)44 {45if (s->top == s->base)46return ERROR;47 --s->top;48 }49 Status ClearStack(SqStack *s)50 {51 s->top = s->base;52return OK;53 }54/**************************************************/55/* 通过getchar()接收当前输⼊的⼀个字符 */56/* 输⼊为⾮#@ 时压栈 */57/* 输⼊为 # 时弹栈删除上⼀个字符 */58/* 输⼊为 @ 时清空栈中元素 */59/* 输⼊为 \n 时清栈 */60/* 输⼊为 EOF 时结束输⼊ */61/**************************************************/62void LineEdit(SqStack *s, SElemtype c)63 {64switch(c)65 {66case'#':67 Pop(s);68break;69case'@':70 ClearStack(s);71break;72default:73 Push(s, c);74break;75 }76 }77/**************************************************/78/* 读取栈中的元素存⼊字符串数组str中 */79/* 需要传⼊已有的数据长度,避免覆盖之前⾏的数据 */80/**************************************************/81 Status SaveStack(SqStack *s, char *str, int lenData)82 {83char temp;84int i, j;85for (i = 0; i < s->top - s->base; ++i)86 *(str + i + lenData) = *(s->base + i + 1);87return OK;88 }89/**************************************************/90/* 打印数据区元素 */91/**************************************************/92 Status PrintDataField(char *str, int lenData)93 {94int i;95for(i = 0; i < lenData; i++)96 printf("%c", *(str + i));97 printf("\n");98 }99int main(void)100 {101 SqStack s;102 SElemtype c;103char str[]; //数据区通过字符串数组str存放104int lenData = 0; //定义数据区长度105 InitStack(&s);106 c = getchar();107while(c != EOF)108 {109while(c != EOF && c != '\n')110 {111 LineEdit(&s, c);112 c = getchar();113 }114 Push(&s, '\n'); //本⾏结束,将换⾏符压⼊栈中115 SaveStack(&s, str, lenData); //保存到数据区116 lenData += s.top - s.base;117 ClearStack(&s); //清空栈118 c = getchar(); //读取下⼀⾏的第⼀个字符119 }120 printf("- - - - - - data field - - - - - - \n");121 PrintDataField(str, lenData); //打印数据区122return0;123 }————————————————————————————————————————————v3:将读取到的⾏存⼊数据区(结构体),最终统⼀打印代码实现:1/**************************************************/2/* v3:将读取到的⾏存⼊数据区(结构体),最终统⼀打印 */3/**************************************************/4 #include <stdio.h>5 #include <string.h>6 #include <stdlib.h>7#define STACK_INIT_SIZE 1008#define STACKINCREAMENT 109#define OK 110#define ERROR 011#define OVERFLOW -212 typedef char SElemtype;13 typedef int Status;14 typedef struct15 {16 SElemtype *top;17 SElemtype *base;18int stacksize;19 } SqStack;20/**************************************************/21/* 定义结构体SqDataField,使⽤字符数组存放数据 */22/**************************************************/23 typedef struct24 {25char str[100];26 } SqDataField;27 Status InitStack(SqStack *s)28 {29 s->base = (SElemtype *)malloc(STACK_INIT_SIZE * sizeof(SElemtype));30if (!s->base)31 exit(OVERFLOW);32 s->top = s->base;33 s->stacksize = STACK_INIT_SIZE;34return OK;35 }36 Status Push(SqStack *s, SElemtype c)37 {38if (s->top - s->base == s->stacksize)39 {40 s->base = (SElemtype *)realloc(s->base, (s->stacksize + STACKINCREAMENT) * sizeof(SElemtype));41if (!s->base)42 exit(OVERFLOW);43 s->top = s->base + s->stacksize;44 s->stacksize += STACKINCREAMENT;45 }46 s->top++;47 *(s->top) = c;48return OK;49 }50 Status Pop(SqStack *s)51 {52if (s->top == s->base)53return ERROR;54 --s->top;55 }56 Status ClearStack(SqStack *s)57 {58 s->top = s->base;59return OK;60 }61void LineEdit(SqStack *s, SElemtype c)62 {63switch(c)64 {65case'#':66 Pop(s);67break;68case'@':69 ClearStack(s);70break;71default:72 Push(s, c);73break;74 }75 }76 Status SaveStack(SqStack *s, SqDataField *data, int lenData) //形参接收指向结构体data的地址77 {78char temp;79int i, j;80for (i = 0; i < s->top - s->base; ++i)81 data->str[i + lenData] = *(s->base + i + 1);82return OK;83 }84 Status PrintDataField(SqDataField *data, int lenData)85 {86int i;87for(i = 0; i < lenData; i++)88 printf("%c", data->str[i]);89 printf("\n");90 }91int main(void)92 {93 SqDataField data;94 SqStack s;95 SElemtype c;96int lenData = 0;97 InitStack(&s);98 c = getchar();99while(c != EOF)100 {101while(c != EOF && c != '\n')102 {103 LineEdit(&s, c);104 c = getchar();105 }106 Push(&s, '\n');107 SaveStack(&s, &data, lenData); //传⼊结构体data的地址108 lenData += s.top - s.base;109 ClearStack(&s);110 c = getchar();111 }112 printf("- - - - - - data field - - - - - - \n");113 PrintDataField(&data, lenData);114return0;115 }————————————————————————————————————————————v4:定义结构体数组为数据区代码实现:1/**************************************************/2/* v4:定义结构体数组为数据区 */3/**************************************************/4 #include <stdio.h>5 #include <string.h>6 #include <stdlib.h>7#define STACK_INIT_SIZE 1008#define STACKINCREAMENT 109#define OK 110#define ERROR 011#define OVERFLOW -212 typedef char SElemtype;13 typedef int Status;14 typedef struct15 {16 SElemtype *top;17 SElemtype *base;18int stacksize;19 } SqStack;20/**************************************************/21/* 定义结构体数组来存放数据 */22/**************************************************/23 typedef struct SqDataField24 {25char c;26 } SqStr;27 Status InitStack(SqStack *s)28 {29 s->base = (SElemtype *)malloc(STACK_INIT_SIZE * sizeof(SElemtype));30if (!s->base)31 exit(OVERFLOW);32 s->top = s->base;33 s->stacksize = STACK_INIT_SIZE;34return OK;35 }36 Status Push(SqStack *s, SElemtype c)37 {38if (s->top - s->base == s->stacksize)39 {40 s->base = (SElemtype *)realloc(s->base, (s->stacksize + STACKINCREAMENT) * sizeof(SElemtype)); 41if (!s->base)42 exit(OVERFLOW);43 s->top = s->base + s->stacksize;44 s->stacksize += STACKINCREAMENT;45 }46 s->top++;47 *(s->top) = c;48return OK;49 }50 Status Pop(SqStack *s)51 {52if (s->top == s->base)53return ERROR;54 --s->top;55 }56 Status ClearStack(SqStack *s)57 {58 s->top = s->base;59return OK;60 }61void LineEdit(SqStack *s, SElemtype c)62 {63switch(c)64 {65case'#':66 Pop(s);67break;68case'@':69 ClearStack(s);70break;71default:72 Push(s, c);73break;74 }75 }76 Status SaveStack(SqStack *s, struct SqDataField *SqStr, int lenData)//形参为指向结构体数组的指针77 {78char temp;79int i, j;80for (i = 0; i < s->top - s->base; ++i)81 SqStr[i + lenData].c = *(s->base + i + 1);82return OK;83 }84 Status PrintDataField(struct SqDataField *SqStr, int lenData)85 {86int i;87for(i = 0; i < lenData; i++)88 printf("%c", SqStr[i].c);89 printf("\n");90 }91int main(void)92 {93struct SqDataField SqStr[STACK_INIT_SIZE]; //声明结构体数组94 SqStack s;95 SElemtype c;96int lenData = 0;97 InitStack(&s);98 c = getchar();99while(c != EOF)100 {101while(c != EOF && c != '\n')102 {103 LineEdit(&s, c);104 c = getchar();105 }106 Push(&s, '\n');107 SaveStack(&s, SqStr, lenData); //传⼊结构体数组的⾸地址108 lenData += s.top - s.base;109 ClearStack(&s);110 c = getchar();111 }112 printf("- - - - - - data field - - - - - - \n");113 PrintDataField(SqStr, lenData);114return0;115 }。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、需求分析由于被编辑的文本文件可能很大,全部读入编辑程序的数据空间(内存)的作法既不经济,也不总能实现。
而用行编辑把待编辑文件的一段放进内存,称为活区。
本行编辑程序是以每行不超过320个字符为前提的。
每次编辑会读入80行,活区每次只显示20行。
1.该程序要实现以下基本编辑命令和一些相关的命令:(1)行插入。
格式:i<回车><行号><回车><文本><回车>。
将<文本>插入活区第<行号>行之后。
(2)行删除。
格式:d<回车><行号1>,<行号2><回车>。
删除活区中第<行号1>行到第<行号2>行。
(3)活区切换。
格式:n<回车><页数><回车>。
由于每次从输入文件读入80行,而活区每页显示20行,而活区切换就是要切换到需编辑的页面上去。
(4)活区显示。
格式p<回车>。
显示当前要编辑的活区内容。
印出的每一行都有一个前置行号和一个空格符,行号固定为2位,增量为1。
(5)清屏。
格式:c<回车>。
(6)获得帮助。
格式:h<回车>。
(7)退出。
格式:e<回车>。
二、概要设计程序结构流程图:存储结构的定义如下:typedef struct text{char string[80];//存储每一行的元素struct text *next;//指向后一个节点的指针int flat;//确定此行是否被删除的标志}text,*textp;功能函数:Status Createlist(textp &head);功能:建立一个80个节点的链表,是整个活区的大小int del(textp head);功能:删除显示的活区的任意一行。
int display(textp &head);功能:按照每页20行的规格显示活区的内容。
void freemem(textp &head);功能:销毁链表,释放内存。
int insert(textp &head);功能:在显示的活区插入一行内容。
Status SaveFile(textp head,FILE *out);功能:将活区的内容保存到输出文件。
Status LoadFile(textp head,FILE *fp);功能:从输入文件读取内容到活区。
void HELP();功能:提供命令的格式。
主函数:void main(){初始化;输入命令;Switch(c){case ‘e’:退出并保存编辑的内容case ‘p’: 显示活区case ‘n’: 活区切换case ‘d’: 删除一行case ‘i’: 插入一行case ‘c’: 清屏case ‘h’: 获得帮助}}三、详细设计#include<string.h>#include<stdio.h>#include<stdlib.h>#include<io.h>#include<process.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;typedef struct text{char string[80];//存储每一行的元素struct text *next;//指向后一个节点的指针int flat;//确定此行是否被删除的标志}text,*textp;//函数声明Status Createlist(textp &head);int del(textp head);int display(textp &head);void freemem(textp &head);int insert(textp &head);Status SaveFile(textp head,FILE *out);Status LoadFile(textp head,FILE *fp);void HELP();void main()//主函数,用来接受命令//编辑函数,用来接受处理编辑命令{textp head,q,p,p1;int page=0;FILE *fp,*out;char c,inname[30],outname[30];printf("################################欢迎使用行编辑程序#############################\n");HELP();printf("按任意键开始。
");c=getchar();/*打开输入、输出文件*/printf("Enter the infile name:");scanf("%s",inname);printf("Enter the outfile name:");scanf("%s",outname);if((fp=fopen(inname,"r"))==NULL){ printf("can't open the file! \n");exit(0);}if((out=fopen(outname,"w"))==NULL){ printf("can't open the file!\n");exit(0);}Createlist(head); /*创建一个80个结点的链表*/p=head;LoadFile( head,fp);do{printf("input order:");fflush(stdin);c=getchar();switch(c){case 'e':SaveFile(head,out); /* 退出并保存编辑的内容*/fclose(fp);fclose(out);break;case 'p': q=p;display(p);page++;if(page>4)page=1;printf("**********************page%d************************\n",page);if(page==4){p=head;page=0;}break;case 'n': /*活区切换*/SaveFile(head,out);LoadFile(head,fp);page=1;q=p=head;display(p);printf("**********************page%d************************\n",page);break;case 'd':p=q; /*显示活区*/del(p);display(p);printf("**********************page%d************************\n",page);break;case 'i': /*插入行*/p=q;insert(p);if(head->flat==1)fputs(head->string,out);p=q=q->next;p1=head;head=head->next;free(p1);display(p);printf("**********************page%d************************\n",page);break;case 'c':system("cls");break;case 'h':HELP();break;default:printf("\n\n\ninput error"); /*命令格式非法提示*/}}while(c!='e');freemem(head);}Status Createlist(textp &head)//建立一个80个节点的链表,是整个活区的大小{int n=0;textp p1,p2;p1=p2=(textp)malloc(sizeof(text));head=NULL;while(n<80){n=n+1;if(n==1){ head=p1;head->flat=0;}else{p2->next=p1;p1->flat=0;}p2=p1;p1=(text *)malloc(sizeof(text));}p2->next=NULL;return OK;}int del(textp head)//删除d命令对应的函数,用来删max-min中的行,用结构体中的flat表示是否被删除{text *p1,*p2;int min,max,i;scanf("%d %d",&min,&max);if(head==NULL){printf("\nlist null!\n");return OK;}p1=p2=head;for(i=0;i<min-1;i++)/*找到要删除的第一行*/p1=p1->next;for(i=0;i<max;i++)/*找到要删除的最后一行*/p2=p2->next;for(;p1!=p2;p1=p1->next)/*删除中间的节点,将flat赋值0*/{p1->flat=0;}return OK;}int display(textp &head)//显示P命令对应的函数,用来显示活区的内容{int i;textp p;for(i=1,p=head;i<=20&&p;p=p->next)if(p->flat==1){printf("%2d",i); /*输出每一行的行号*/i++;printf(" %s",p->string);}head=p;return 0;}void freemem(textp &head)//释放链表所占的内存{text *p;for(p=head;head!=NULL;){head=p->next;free(p);p=head;}}int insert(textp &head)//插入i命令对应的函数{int hang,i;textp p,p1;scanf("%d",&hang);p=(textp)malloc(sizeof(text));//为插入行分配空间p->flat=1;fflush(stdin);fgets(p->string,80,stdin); /*输入插入行的内容*/p1=head;if(hang==1){ if(!head->flat) /*头结点已被删除*/for(;p1&&!p1->flat;p1=p1->next); /*找到第一个flat=1的点*/p->next=p1->next;p1->next=p;}else{for(i=1,p1=head;i<hang;p1=p1->next)//找到要插入行的后一行if(p1->flat==1)i++;p->next=p1->next;//从此行向下将插入行插入到链表中p1->next=p;}return OK;}Status LoadFile(textp head,FILE *fp) /*从文件读内容到活区*/{textp p;for(p=head;p&&(!feof(fp));p=p->next){ if(!fgets(p->string,80,fp))break;p->flat=1;}return 0;}Status SaveFile(textp head,FILE *out) /*存储活区的函数*/{ textp p;for(p=head;p;p=p->next)if(p->flat==1){fputs(p->string,out); /*输出活区的内容到指定的文件*/p->flat=0;}return OK;}void HELP()//帮助函数,显示一些命令的格式{printf("\n\t **********************************************************\n"); printf("\t ** 行插入格式:i<行号><回车><文本><回车> **\n");printf("\t ** 行删除格式:d<回车><行号1>[<空格><行号2>]<回车> **\n"); printf("\t ** 活区切换格式:n<回车> **\n");printf("\t ** 活区显示格式:p<回车> **\n");printf("\t ** 清屏格式:c<回车> **\n");printf("\t ** 帮助格式:h<回车> **\n");printf("\t **********************************************************\n");}四、调试分析测试数据:任意的TXT文件,只要每行不超过80个字符。