} }
七【上机实验中的其他它问题及心得】
此编辑器主要采用的是用链表的作为他的存储结构,此编辑器用了三个结构体来分别存储行(主要作用是存储列单链表的首地址)、每列的字符还有存储复制、剪切的字符。为什么要选择这种存储结构呢?因为在用键盘控制光标的情况下,我们必须知道光标的位置来控制字符的位置,所以此种结构能够很好建立光标和链表之间的配合。然后用光标来控制链表。最后实现文本的编辑。在选择存储方式的时候我也想过用串的块链表,但是在建立此种存储方式的时候必须先定义确定的空间,所以在很大程度上,空间会有冗余。
我想过用串和栈的知识,但是在用串和栈的知识的时候很难用光标去定位字符的位置,而且只能整体操作:比如说:在插入的是后必须是整体插入,不能直接定位到某一个特定的字符之间插入。还有在删除的时候也是,不能定位到某一个特定的位置删除某一个字符或者几个字符。用此种方法最方便的操作就是进行行操作(就是整行整行的插入和删除),这不符合我的初衷。
还有Turbo C2.默认定义的文本窗口为整个屏幕,共有80列(或40列),25行的文本单元,每个单元包括一个字符和一个属性,字符即ASCII码字符,属性规定该字符的颜色和强度。同时,他还规定整个屏幕的左上角坐标为(1,1),右下角坐标为(80,25)。并规定沿水平方向为X轴,方向朝右;眼垂直方向为Y轴,方向朝下。
功能心得: 一、 添加
当前光标处没有字符并且输入的是常规字符。
创建两个单链表,一个用来存储每列的字符,另一个用来存储每列的首地址(方便用光标定位字符的位置)称为行。
在添加的过程中如果当列的字符个数没到80个时,那么列单链表不断的创建(不断地在后面添加字符),当此行字符的个数到达了80的时候,那么重新创建一行,然后在不断在此行的后面添加字符。直到到达下次满足80的字符的个数。当在添加字符的过程中如果输入的是一个回车键,那么重新创建一个行链表节点,然后光标移动到下一行的开始的位置,此时再在列单链表的后面添加字符。
二、 插入
当前光标处有字符的时候并且输入的是常规字符,那么执行插入操作。
当光标的位置在第m行第n列的时候,那么在第m行第n列之前插入字符。如果在此行中只有一个元素则把把字符插在此字符之前,然后把此节点的地址赋给此行的行链表中。如果不只一个元素的话,那么直接把字符插在第m行第n列之前。然后再检查此列是否满足只有80个字符,如果满足则后面的字符不用移动。若果不满足,那么就要通过test()函数来处理。
三、 检查
此函数的作用主要是当执行插入操作后进行检查每行是否满足规则(每列的元素个数必须小于等于80个,当多余这个数的时候就要进行移动处理)。 先用指针指向此列的最后一个字符(tail),然后再分别用两个指针指向第80个字符(p1)和第81(p2)个字符。如果现在指针处在最后一行,那么新建一个行节点,然后直接把多出来的字符移动到下一行。如果光标不在最后一行,那么直接把此行的下一行的字符接到tail指针后,然后再把p2赋给下一行的行节点中。如果tail的数据域中试一个回车键,那就要再建一个行节点来存放多出来的字符。
四、 删除
如果光标所处的行中没有字符,那么返回不操作。如果光标处在行中的第一列,那么直接free掉第一个字符。如果光标处在列的其他位置,那么直接free掉此处的这个字符。
五、 复制、剪切、粘贴
复制和剪切这两个模块都有一个共同点就是要先把所选中的文本字符存入一个结构体中,这个结构体主要用来存储当前光标的x、y坐标和所选中的字符。这两个操作唯一的区别就是剪切需要把所选文本的字符删除掉,而复制不需要。
粘贴:这个操作时建立在复制、剪切的基础上的。其实粘贴的本质就是把所选的文本字符依次插入到编辑行中。
最后的阐述:因为第一次用光标来定位字符的位置,所以光标和链表的关系控制的不是很好。所以在程序当中还会有很多问题,但是我相信,随着知识的增长,我会很好的运用此种操作,最后达到很好的运行效果。