已阅读5页,还剩33页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据结构课程设计:文本编辑(最后附完整代码) 一.问题描述-1 二.设计思路-1 三.系统实现功能1.建立单链表-22.显示文章内容- 33.查找文章语句-34.删除文章语句-55.替换文章语句-76.统计文章字数-107.写入文本结束程序-10 四.系统不足及需改进分-11 五.文件清单说明-11 六:附录-12 一:问题描述 本次我所做的课程设计为:文本编辑,主要内容是对中文文本的显示、查找、删除、替换、统计、写入文本。在程序选择功能后根据提示,输入任意长度中文语句即可对文章进行操作。二:设计思路 文本编辑,顾名思义就是对一遍文章进行编辑,我所设计的是对中文的编辑。中文有两个字节(汉字、标点),通常情况下通过文件输入流仅仅可以取一个字节或者是以空格为分隔符取单词这仅仅对英文的文章适用,周六周日我从网上搜索相关方法,未找到一条切实可用的对中文字符操作的方法。后因看到一种对string的操作灵光一闪,想到了对中文的操作。 因中文是两个字节,由两部分ASCII码组成,所以可用单链表一个节点存放一个汉字或字符,单链表的数据域是一个长度为二的char数组分别存汉字的两个字节。若用户从键盘输入则将其存入string然后遍历将其每一个字节取到char数组中,这样只需两个字节对比一次使char数组中相邻的两个字节与单链表中每一个节点的两个char对比即可遍历。我所用的数据结构为单链表,结构中由一个长度为2的char数组和一个指针组成具体结构如下:typedef struct LNodeElemType data2;/长度为2的char数组,char0存汉字前半部分,char1存后半部分struct LNode *next;LinkList;三:系统实现的功能 1.建立单链表void CLinkList(LinkList *&L) LinkList *s,*r;r=L;r-next=NULL;char temp; /存放判断变量,同时起到中间变量的作用ifstream fin(a.txt);/打开文件输入流while(!fin.eof() s=(LinkList *)malloc(sizeof(LinkList);/一个节点存一个汉字或字符temp=fin.get(); /从文件取一个字符if(temp!= ) /判断是否为空格、回车,若为空格回车则只存一个字符剩下一个用1代替s-data0=temp;s-data1=fin.get();else if(temp= )s-data0=temp;s-data1=1;elsefin.get();s-data0=n;s-data1=1;r-next=s;r=s;r-next=NULL;fin.close();2. 显示文章内容 void DisList(LinkList *L)LinkList *p=L-next;while(p!=NULL)/遍历单链表依次输出if(p-data0!= )/判断是否为空格决定输入方式coutdata0data1; else coutnext;3. 查找文章语句seek(LinkList *&p,char a,int m)函数,遍历查找单链表找到参数给定指针最近位置的对应语句并返回逻辑位置(不包括空格和回车)。seekCall(LinkList *L)函数,调用seek()传入一个位置可变的指针依次遍历查找出所有输入的语句的逻辑位置int seek(LinkList *&p,char a,int m)/位置可变的指针,语句的char数组,数组长度int n=0,flag=0,i;LinkList *r;while(p!=NULL)r=p;/p指针位置不变,通过r指针向下遍历for(i=0;idata0=ai&r-data1=ai+1) flag=1; /标识是否找到相应字符的变量r=r-next;else flag=0; /只要又一次不相同则为0 break; if(p-data0!= )/不统计空格的个数n+;p=p-next;if(flag=1)return n;if(flag=1)return n;else return 0;void seekCall(LinkList *L)cout请输入要查找的语句:str;int n=0,n2=0,m;m=str.size();char *a=new charm;/str长度为char数组长度for(int i=0;inext;while(p!=NULL)n2=seek(p,a,m);/遍历找到每个语句n+=n2;if(n0&n20)cout查找到语句:str 位于第:n位endl;else if(n=0)cout文章中无此语句!endl;4. 删除文章语句 seek2(LinkList *&p,char a,int m)函数查找语句在单链表中的具体位置(包括空格和回车)并返回他的位置Ldelete2(LinkList *&L,int n,int m)函数通过参数传入的语句位置和要删除的语句长度进行删除 LdeleteCall(LinkList *&L)调用seek2()和Ldelete2()函数删除对语句int seek2(LinkList *&p,char a,int m)/与seek基本相同,少一个判断是否为空格的语句int n=0,flag=0,i;LinkList *r;while(p!=NULL)r=p;/p指针位置不变,通过r指针向下遍历for(i=0;idata0=ai&r-data1=ai+1) flag=1;r=r-next;else flag=0; break; n+;p=p-next;if(flag=1)return n;if(flag=1)return n;else return 0;void Ldelete2(LinkList *&L,int n,int m)LinkList *p=L;for(int i=0;inext;LinkList *r=p;for(int i=0;inext;p-next=r-next; /删除对应语句void LdeleteCall(LinkList *&L)cout请输入要删除的语句:str;int n=0,n2=0,m;m=str.size();char *a=new charm;for(int i=0;im;i+)/将str转化为数组ai=stri;LinkList *p;/给seek2传入一个位置可变的指针,初始位置为L的头部p=L;int mm=0;while(p!=NULL)/判断文章中是否有此语句seek2(p,a,m);mm+;if(mm=0)cout文章中无此语句!endl;return;for(int i=0;inext;/从单链表头部依次遍历,删除所有语句n2=seek2(pp,a,m);n+=n2;if(n0&n20)Ldelete2(L,n,m);5.替换文章语句 StrToList(LinkList *&L2,string str)函数将输入的string型数据str转化为单链表L2Lreplace(LinkList *&L,LinkList *&L2,int n,int m)函数将L2单链表插入到L中并删除要替换的语句LreplaceCall(LinkList *&L)调用前两个函数void StrToList(LinkList *&L2,string str)/将str转化为单链表L2L2=(LinkList *)malloc(sizeof(LinkList);L2-next=NULL;int m=0;m=str.size();char *a=new charm;for(int i=0;im;i+)/将str转化为charai=stri;LinkList *s,*r;int i;r=L2;for(i=0;idata0=ai;s-data1=ai+1;r-next=s;r=s;r-next=NULL;void Lreplace(LinkList *&L,LinkList *&L2,int n,int m)LinkList *p=L;for(int i=0;inext;LinkList *r;r=p;for(int i=0;inext;LinkList *p2=L2;while(p2-next!=NULL)/p2指向L2尾部p2=p2-next;p-next=L2-next;/p指向L2p2-next=r-next;/p2指向r的下一个节点free(L2);void LreplaceCall(LinkList *&L)string str1,str2;cout请输入原替换的语句:str1;cout请输入替换语句:str2;LinkList *L2;int m=0;m=str1.size();char *a=new charm;for(int i=0;inext;int n=0,n2=0;while(p!=NULL)/遍历L替换所有语句n2=seek2(p,a,m);n+=n2;if(n0&n20)StrToList(L2,str2);/替换一次就建立一次L2,防止形成循环表Lreplace(L,L2,n,m);n2=0;6:统计文章字数int number(LinkList *L)LinkList *p;p=L;int n=0;while(p-next!=NULL)/循环遍历统计除了空格和回车的字数if(p-data0!= &p-data0!=n)n+;p=p-next;return n;7:写入文本结束程序void end(LinkList *L)ofstream fout(b.txt);/文件b,txt不是读取时的文件是一个,为了对照而写入的新文本LinkList *p=L-next;while(p!=NULL)if(p-data0!= &p-data0!=n)foutdata0data1;else if(p-data0= )foutdata0;else if(p-data0=n)foutdata0;p=p-next;四:系统不足及需改进部分 仅仅用单链表遍历系统效率较低,未找到一种可以用string直接读取文本中中文内容的方法,不能用于英文。 五:文件清单说明 六:附录 这是删除的第二个方法bool Ldelete1(LinkList *&L,char u)LinkList *p=L;LinkList *q;LinkList *r;while(p!=NULL)r=p-next;if(r-data0=u0&r-data1=u1)q=p-next;p-next=q-next;free(q);return true;p=p-next;return false;完整代码:#include #include #include using namespace std;typedef char ElemType;typedef struct LNodeElemType data2;/长度为2的char数组,char0存汉字前半部分,char1存后半部分struct LNode *next;LinkList;void InitList(LinkList *&L);void CLinkList(LinkList *&L);void DisList(LinkList *L);int seek(LinkList *&p,char a,int m);void seekCall(LinkList *L);int seek2(LinkList *&p,char a,int m);bool Listdelete(LinkList *&L,int i);void Ldelete2(LinkList *&L,int n,int m);void LdeleteCall(LinkList *&L);void StrToList(LinkList *&L2,string str);void Lreplace(LinkList *&L,LinkList *&L2,int n,int m);void LreplaceCall(LinkList *&L);int number(LinkList *L);void end(LinkList *L);void out();void InitList(LinkList *&L)L=(LinkList *)malloc(sizeof(LinkList);L-next=NULL;void CLinkList(LinkList *&L) LinkList *s,*r;r=L;r-next=NULL;char temp; /存放判断变量,同时起到中间变量的作用ifstream fin(a.txt);/打开文件输入流while(!fin.eof() s=(LinkList *)malloc(sizeof(LinkList);/一个节点存一个汉字或字符temp=fin.get(); /从文件取一个字符if(temp!= ) /判断是否为空格、回车,若为空格回车则只存一个字符剩下一个用1代替s-data0=temp;s-data1=fin.get();else if(temp= )s-data0=temp;s-data1=1;elsefin.get();s-data0=n;s-data1=1;r-next=s;r=s;r-next=NULL;fin.close();void DisList(LinkList *L)LinkList *p=L-next;while(p!=NULL)/遍历单链表依次输出if(p-data0!= )/判断是否为空格决定输入方式coutdata0data1; else coutnext;int seek(LinkList *&p,char a,int m)/位置可变的指针,语句的char数组,数组长度int n=0,flag=0,i;LinkList *r;while(p!=NULL)r=p;/p指针位置不变,通过r指针向下遍历for(i=0;idata0=ai&r-data1=ai+1) flag=1; /标识是否找到相应字符的变量r=r-next;else flag=0; /只要又一次不相同则为0 break; if(p-data0!= )/不统计空格的个数n+;p=p-next;if(flag=1)return n;if(flag=1)return n;else return 0;void seekCall(LinkList *L)cout请输入要查找的语句:str;int n=0,n2=0,m;m=str.size();char *a=new charm;/str长度为char数组长度for(int i=0;inext;while(p!=NULL)n2=seek(p,a,m);/遍历找到每个语句n+=n2;if(n0&n20)cout查找到语句:str 位于第:n位endl;else if(n=0)cout文章中无此语句!endl;int seek2(LinkList *&p,char a,int m)/于seek基本相同,少一个判断是否为空格的语句int n=0,flag=0,i;LinkList *r;while(p!=NULL)r=p;/p指针位置不变,通过r指针向下遍历for(i=0;idata0=ai&r-data1=ai+1) flag=1;r=r-next;else flag=0; break; n+;p=p-next;if(flag=1)return n;if(flag=1)return n;else return 0;bool Listdelete(LinkList *&L,int i)int j=0;LinkList *p=L,*q;while(jnext;if(p=NULL)return false;elseq=p-next;if(q=NULL)return false;p-next=q-next;return true;void Ldelete2(LinkList *&L,int n,int m)LinkList *p=L;for(int i=0;inext;LinkList *r=p;for(int i=0;inext;p-next=r-next; /删除对应语句bool Ldelete1(LinkList *&L,char u)LinkList *p=L;LinkList *q;LinkList *r;while(p!=NULL)r=p-next;if(r-data0=u0&r-data1=u1)q=p-next;p-next=q-next;free(q);return true;p=p-next;return false;void LdeleteCall(LinkList *&L)cout请输入要删除的语句:str;int n=0,n2=0,m;m=str.size();char *a=new charm;for(int i=0;im;i+)/将str转化为数组ai=stri;LinkList *p;p=L;int mm=0;while(p!=NULL)/判断文章中是否有此语句seek2(p,a,m);mm+;if(mm=0)cout文章中无此语句!endl;return;for(int i=0;inext;/从单链表头部依次遍历,删除所有语句n2=seek2(pp,a,m);n+=n2;if(n0&n20)Ldelete2(L,n,m);void StrToList(LinkList *&L2,string str)/将str转化为单链表L2L2=(LinkList *)malloc(sizeof(LinkList);L2-next=NULL;int m=0;m=str.size();char *a=new charm;for(int i=0;im;i+)/将str转化为charai=stri;LinkList *s,*r;int i;r=L2;for(i=0;idata0=ai;s-data1=ai+1;r-next=s;r=s;r-next=NULL;void Lreplace(LinkList *&L,LinkList *&L2,int n,int m)LinkList *p=L;for(int i=0;inext;LinkList *r;r=p;for(int i=0;inext;LinkList *p2=L2;while(p2-next!=NULL)/p2指向L2尾部p2=p2-next;p-next=L2-next;/p指向L2p2-next=r-next;/p2指向r的下一个节点free(L2);void LreplaceCall(LinkList *&L
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 产科医疗告知的法律要点与沟通技巧
- 创业策划书案例(18篇)
- 交叉设计在生物等效性试验中的质量控制样品应用
- 二线及以上耐药治疗的选择逻辑
- 初三化学实验教学计划
- 乙肝相关性肝硬化的抗病毒治疗
- 供应链视角的企业信息化应用模式研究
- 2026年中国激光设备行业发展展望及投资策略报告
- erp供应链采购管理论文
- 临床试验质量保证体系构建
- 生产计划排程课件
- 2025年中国诚通控股集团有限公司人员招聘笔试备考试题附答案详解(考试直接用)
- 安全保卫培训讲义课件
- 2025年《预防未成年人犯罪法》知识竞赛真题库(含答案)
- 研发经费归集管理办法
- 高速服务区安全知识培训课件
- 月子餐培训课件下载
- 55°非密封管螺纹量规
- 石墨烯防腐技术研究与应用
- 2025年湖南省政府采购评审专家考试历年参考题库含答案详解(5套)
- 龙岗区养老护理院建设项目公建民营实施方案
评论
0/150
提交评论