3.3.2行插入行数insert()子程序的设计
行插入函数的开始定义了三个指向struct text结构体的指针变量p,p1,p2,在给hang赋初值后使p1指向头结点,利用for循环,找到要插入行的前一行hang-1,然后给插入的行分配内存空间。输入文本内容并连入链表。行程序流程图如3.3所示。
开 始 定义三个类型的指针变量p,p1,p2 输出“请输入要插入的行” 给变量行赋初始值 令p1=头结点,找到行 插入要插入的文本内容 输出修改后的链表(文本内容) 将修改后的链表存盘(savveandedisplay) 返 回
图3.3 行插入函数流程图
函数实现
int insert(textp &head)//插入i命令对应的函数 {
int hang,i; textp p,p1;
scanf(\
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
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; }
3.3.3活区切换函数saveanddisplay(20)子函数设计
活区切换函数实现活区之间的切换,把文本的每一页(20行)作为一个活区,可以逐页的把活区内容显示出来。在活区切换函数中定义了一个指向struct text结构体的指针变量p赋初值*p=NULL,当i小于20时,如果行没有被删除(flag=1)就通过fputs函数把活区内容写入到文件(out).
开 始 定义变量 i 利用指针变量p 到hang 的具体位 行没有被删除p-flat==1 Y N将行的内容写入到文件out Y 输出活区内容 判断文件 是否存在 非空 N 输出file end! 返 回1 返 返 回返0
图3.4活区切换函数save()流程图
函数实现
void HELP()//帮助函数,显示一些命令的格式 {
printf(\ printf(\ 行插入格式: i<行号><回车><文本><回车> **\\n\
printf(\ 行删除格式: d<回车><行号1>[<空格><行号2>]<回车> **\\n\ printf(\ 活区切换格式: n<回车> **\\n\ printf(\ 活区显示格式: p<回车> **\\n\ printf(\ 清屏格式: c<回车> **\\n\ printf(\ 帮助格式: h<回车> **\\n\ printf(\ 串替换: t<回车><文本> **\\n\ printf(\ 退出程序: e<回车> **\\n\
printf(\}
3.3.4显示函数display()子程序设计
显示函数display()在程序运行过程中经常得以调用,是行编辑程序中极其重要的一个函数。行编辑程序通过对显示函数display()的调用,在程序执行行插入、行删除等编辑功能后,输出编辑后的文本。
在活区显示中首先把文本内容链入链表,函数中用page来实现页码的自增。函数种定义了一个指向struct text结构体的指针变量p ,在文件fp非空和行号小于20的情况下,利用fgets函数使p->string从打开的文件fp中得到字符的值,然后输出每一行的行号和每一行的内容。其程序流程图如图3.5所示。

