第四章 串操作应用举例

225 views
132 views

Published on

严蔚敏 - 数据结构

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
225
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

第四章 串操作应用举例

  1. 1. 第四章 串操作应用举例
  2. 2. 文本编辑• 文本编辑程序是一个面向用户的系统服务程序 , 广泛应用于源程序的输入和修改 . 其实质是修改字符数据的形式或格式 . 基本操作包括 : 串查找 , 插入和删除 等基本操作 .
  3. 3. 文本编辑 201• 文本可以看成是一个字符串 ( 文本串 ). 页 m a i n ( ) { ↵是文本串的字串 , 行 f l o a t a , b ,是页的字串 . m a x ; ↵ s c a 文本 : n f ( “ %f , %f ” main() { ,& a , & b ) ; ↵ float a, b,max; i f a > b m scanf(“%f,%f”, &a, &b); a x = a ; e l s e if a>b max=a; m a x = b ; ↵ } ; ↵ else max=b; };
  4. 4. 文本编辑• 建立文本串的 页表与行表页表: 记录页号和对应页的起始行号行表:行号,对应行的起始地址和行字串的长度。 行号 起始地址 长度 100 201 8 101 209 17 102 226 24 103 250 17 104 267 15 105 282 2
  5. 5. 文本编辑• 文本串的操作的实现设立页指针,行指针,字符指针,分别指示当前操作的页,行和字符。 插入与删除操作: 字符的插入或删除 行或页的插入与删除
  6. 6. 文本编辑• 文本串的操作的实现 插入或删除字符 • 修改行表中行的长度 • 行超出设定的存储空间,需要重新分配存储 空间,同时修改行的起始位置。
  7. 7. 文本编辑• 文本串的操作的实现 行的插入或删除• 删除行若为页的起始行,需要修改对应页的 起始行号• 行表的顺序存储要求,执行插入或删除操作 时需移动插入或删除位置后的所有表项。• 访问以页表和行表为索引,进行行或页的操 作时只需对行表和页表进行修改,不涉及字 符。
  8. 8. 文本编辑程序的实现 HString char• 数据结构的描述 ch1. 采用串的堆分配存结构 lengthc4-2.hstruct HString{ char *ch; // 若是非空串 , 则按串长分配存储区 ; 否则 ch 为 NULL int length; // 串长度}
  9. 9. 文本编辑程序的实现2. 串的基本操作 bo4-2.cppvoid InitString(HString &T); // 串的初始化void StrAssign(HString &T,char *chars) ; // 生成一个其值等于串常量 c ha rs 的串 Tint Index(HString S, HString T, int pos);//T 为非空子串 . 若主串 S 中第 p o s 个字符后存在与 T 相等的子串 , 则返回第一个这样的子串在 S 中的位置 ; 否则返回 0
  10. 10. 文本编辑程序的实现2. 串的基本操作 bo4-2.cppStatus StrInsert(HString &S,int pos, HString T)// 在串 S 的第 p o s 个字符前插入串 TStatus StrDelete(HString &S,int pos, int len) ; // 从串 S 中删除第 p o s 个字符起长度为 le n 的子串...
  11. 11. 文本编辑程序的实现• 引入的头文件及宏定义#include “c1.h”#include “c4-2.h” // 采用串的堆分配存储结构#include “bo4-2.cpp” // 串的堆分配基本操作#define MAX_LEN 25 // 文件的最大行数#define LINE_LEN 75 // 每行字符数最大值 +1#define NAME_LEN 20 // 文件名最大长度
  12. 12. 文本编辑程序的实现 T 第 1 行内容 [0] • 存储结构与全局变量 n1 HString T[MAX_LEN]; 第 2 行内容 [1] char str[LINE_LEN], n2 filename[NAME_LEN]=“”; 第 3 行内容 [2] FILE *fp; n3 int n=0; // 文本行数 ... [24]str[pos] 为当前位置 pos 的字符T[n] 为当前的文本行
  13. 13. 文本编辑程序的实现•程序功能与算法描述void Open( ) // 打开文件 , 若文件存在则打开 , 若不存在则创建void Save( ) // 存盘void List( ) // 显示文本内容void Insert( ) // 插入行void Delete( ) // 删除行void Search( ) // 查找字符串...
  14. 14. 文本编辑程序的实现void Open( ){ if (filename[0]) printf(“ 已存在打开的文件 n”); // 文件已 打开 else { printf(“ 请输入文件名 : ” ) ; scanf(“&s”,filename); fp = fopen(filename,“r”); // 以只读方式打开文件 if(fp) // 已存在此文件 { ... // 将文件中的内容输入至编辑系统的存储结构 中 fclose(fp); // 关闭文件 } else printf(“ 新文件 n”); } //end else}
  15. 15. 文本编辑程序的实现void Open( ){ ... // 将文件中的内容输入至编辑系统的存储结构 中 while (fgets(str,LINE_LEN,fp)) // 由文件读入一行字 符成功 { str[strlen(str)-1] = 0; // 将换行符换为串结束符 0 if (n>=MAX_LEN){ printf(“ 文件太大 ” ); return;} StrAssign(T[n], str); // 读一行字符入当前行 T[n] n++; } ...}
  16. 16. 文本编辑程序的实现void Insert () // 插入行操作{ int i, l, m; printf(“ 在第 l 行前插入 m 行,输入 l 和 m: ”); scanf(“%d%d*c”,&l,&m); if ( n+m > MAX_LEN ) { printf(“ 插入行太多 n”); return;} if ( n>=l-1&&l>0) // 输入的插入位置满足条件 for ( i=n-1; i>=l-1;i--) T[i+m]=T[i]; // 将插入位置后的行向后移动 n+=m; printf(“ 请顺序输入待插入内容 :n”); ...
  17. 17. 文本编辑程序的实现void Insert () // 插入行操作{ printf(“ 请顺序输入待插入内容 :n”); for(i=l-1; i<l-1+m;i++){ gets(str);// 取插入字符串 InitString(T[i]); StrAssign(T[i],str); } } else printf(“ 行超出范围 ” );}
  18. 18. 文本编辑程序的实现void Search( ) // 查找字符串{ int i,k,f=1; //f 为继续查找标志 char b[2]; HString s; printf(“ 请输入待查找的字符串: ” ); scanf(“&s&*c”,str); InitString(s); StrAssign(s,str); for (i=0;i<n&&f;i++) { // 逐行查找 k = 1; // 由每行的第一个字符开始查找 while(k) { k=Index(T[i],s,k); // 由本行的第 k 个字符开始查 找 ...
  19. 19. 文本编辑程序的实现void Search( ) // 查找字符串{ ... if (k) // 找到 { printf(“ 第 %d 行: ” , i+1); strPrint(T[i]); pirntf(“ 第 %d 个字符处找到 n” , k); printf(“ 继续查找吗( Y/N)?”); gets(b); if (b[0]!=‘Y’&&b[0]!=‘y’) // 中断查找 { f = 0; break; } else k++; } //end if(k) }//end while(k)}//end forif(f) printf(“ 没有找到 n”);}
  20. 20. 文本编辑程序的实现main ( ){ Status s = TRUE; int i,k; for( i = 0; i<MAX_LEN,i++) // 初始化串 InitString (T[i]); while(s);{ printf(“ 请选择 ” : 1. 打开文件 2. 显示文件内容 n”); printf(“ 3. 插入行 4. 删除行 5. 拷贝行 6. 修改行 n”); printf(“ 7 . 查找字符串 8. 替换字符串 n”); printf(“ 9. 存盘退出 0. 放弃编辑 n”); scanf(%d”,&k); ...
  21. 21. 文本编辑程序的实现main ( ){ ... switch(k) { case 1: Open(); break; case 2: List( ); break; case 3: Insert( ); break; 。。。 case 0: s = FALSE; } //end switch(k)} //end while(s)}
  22. 22. 建立词索引表• 词的索引表常常用在信息检索中,以图书馆的书目检索为例。在实际系统图书馆的书目检索系统通常采用 “书名关键词索引”
  23. 23. 建立词索引表书号 书名 关键词 书号索引005 Computer Data Structure algorithms 034010 Introduction to Data analysis 034,050,067 Structures computer 005,034023 Fundamentals of Data data 005,010,023 Structures design 034034 The Design and Analysis fundamentals 023 of Computer algorithms Introduction 010,050050 Introduction to Numerical Analysis numerical 050,067067 Numerical Analysis structures 005,010,023 书目文件 关键词索引表
  24. 24. 关键词索引表通常按词典顺序排列建立索引表 关键词 书号索引 algorithms 034例如 : analysis 034,050,067 computer 005,0341. 检索词 :“algorithms”+“analysis” data 005,010,023 ... ...结果:(034)=(034)∧ (034,050,067) 书目文件 书号 书名 ... ... 034 The Design and Analysis of Computer algorithms ... ...
  25. 25. 建立索引表 关键词 书号索引 algorithms 0342. 检索词 : analysis 034,050,067“algorithms” ,“analysis” ... ...结果: 书号 书名034,050,067=(034)∨ (034, ... ...050,067) 034 The Design and Analysis of Computer algorithms 050 Introduction to Numerical Analysis 067 Numerical Analysis
  26. 26. 如何建立索引表重复下列操作直至文件结束:(2) 从书目文件中读入一个书目串(3) 从书目串中提取所有关键词插入词表(4) 对词表中的每一个关键词,在索引表 中进行查找并作相应的插入操作。
  27. 27. 如何建立索引表重复下列操作直至文件结束:(2) 从书目文件中读入一个书目串 BookInfo.txt 005 buf Computer Data Structures 005 Computer Data 010 Structures Introduction to Data Structures 023 从书目文件中读取 1 Fundamentals of Data Structures 行信息到缓存 b uf 034 The Design and Analysis of Computer ...
  28. 28. 如何建立索引表 wdlist [0] Computer(2) 从书目串中提取 Data [1] 所有关键词插入 [2] Structure 词表 buf 005 Computer Data Structures ... ... BookNo 005 [9] last 3 当前书号对应的关键词 表
  29. 29. 如何建立索引表(3) 对词表中的每一个关键词,在索引表中进行查找并 作相应的插入操作。 关键词 书号索引 [0] Computer algorithms 034 [1] Data analysis 034,050,067 computer 034 005 [2] Structure data 010,023 005 design 034 ... ... fundamentals 023 Introduction 010,050 [9] numerical 050,067 last 3 wdlist structure 010,023 005
  30. 30. 如何建立索引表提取关键词的处理: 顺序扫描书目单,分词,剔除常用词,为此设定“停用词表”。将确定为关键词的词汇置于临时词表中。书名: The Design and Analysis of Computer algorithms剔除: The and of关键词: Design Analysis Computer Algorithm
  31. 31. 如何建立索引表• 索引表中查询关键词 关键词 Algorithm 034 书号索引 的处理 034书 034 : The Design and analysis 050,067Analysis of Computer computer 005,034algorithms data 005,010,023关键词: Design AnalysisComputer Algorithm design 034 fundamentals 023Analysis Introduction 010,050 numerical 050,067Algorithm structures 005,010,023
  32. 32. 如何建立索引表 wdlist [0] design•数据结构 [1] Analysis词表: 线性表,存放关键 [2] Computer词 [3] AlgorithmsTyp e d e f s truc t{ ... ...c ha r * ite m[ ] ; // 字符串的数组 [9] int la s t ; // 词表的长度 last 4} Wo rld L is tTyp e ; //词表类型(顺序表)
  33. 33. 如何建立索引表•数据结构书号类型:Typedef int ElemType; // 书号类型索引项类型:Typedef struct{ HString key; // 关键词 LinkList bnolist;// 存放书号索引的链表} IdxTermType; // 索引项类型
  34. 34. 如何建立索引表•数据结构索引表类型(有序表)Typedef struct{ IndexTermTypeitem[MaxKeyNum+1] int last;} IndexListType;
  35. 35. 关键词 key bnolist 存放书号索引的链表 NULL 0 NULL [0] 0Algorithms 1 34 NULL 10 Analysis 3 34 8 50 ... 67 NULL 1[MaxKeyNum] 索引表 idxlist 的结构 last 9 ( 有序表 )
  36. 36. 如何建立索引表 noidx [0] A•主要变量 [1] AnChar *buf; // 书目缓 [2] The冲区 [3] OfWordListType ... ...wdlist; // 词表 , 存放书目的关键词包括 , [9]停用词表也采用 last 4WordListType
  37. 37. 如何建立索引表•基本操作void InitInxList(IndxListType &idxlist);// 初始化操作 , 置索引表 idxlist 为空表 , 且在idxlist.item[0] 设一空串void GetLine(FILE f); // 从文件 f 读入一个书目信息到书目缓冲区 bufvoid ExtractKeyWord(ElemType &bno); // 从 buf中提取书名关键词到词表 wdlist, 书号存入 bno
  38. 38. 如何建立索引表•基本操作Status InsIndxList(IdxListType &idxlist, ElemTypebno); // 将书号为 bno 的书名关键词按照词典顺序插入索引表 idxlist 中Void PutText(FILE g, IdxListType idxlist); // 将生成的索引表 idxlist 输出到文件 g
  39. 39. 如何建立索引表 •主函数void main( ){If (f = openf(“BookInfo.txt”,”r”)) if( g = openf(“BookIdx.txt”,”w”)){ InitIndxList(idxlist); // 初始化索引表为空表 while(!feof(f)) { GetLine(f); // 从文件 f 读入一个书目信息到 buf ExtractKeyWord(BookNo); // 从 buf 提取关键词到词表 , 书号存入 BookN InsIdxList(idxlist, BookNo); // 将书号为 BookNo 的关键词插入索引表 } //end while PutText(g, idxlist); // 将生成的索引表 idxlist 输出到文件 g}}//end main
  40. 40. 如何建立索引表初始化操作void InitIdxList( IdxListType &idxlist){ // 置索引表 idxlist 为空表 , 且在 idxlist.item[0] 设空串 idxlist.last = 0; InitString(idxlist.item[0].key); // 初始化 [0] 单元 InitList(idxlist.item[0].bnolist); // 初始化 [0] 单元} idxlist NULL 0 [0] NULL 0 last 0
  41. 41. 如何建立索引表在索引表上进行插入的操作Status InsIdxList(IdxListType &idxlist,int bno)// 将书号为 bno 的关键词插入索引表{ for (i=0; i<wdlist.last;++i){ GetWord(i,wd); // 用 wd 返回词表 wdlist 中第 i 个关键词 j = Locate(idxlist,wd,b); // 在索引表 idxlist 中查询是否存 在与 wd 相等的关键词 . 若存在 , 则返回其在索引表中的 位置 , 且 b 取 TRUE; 否则返回插入位置 , 且 b 取值 FALSE ...
  42. 42. 如何建立索引表在索引表上进行插入的操作Status InsIdxList(IdxListType &idxlist,int bno){ ... if(!b) InsertNewKey(idxlist,j,wd); // 在索引表 idxlist 的第 j 项上插入新关键词 , 并初始化书号索引的链表为空表 if(!InsertBook(idxlist,j,bno)) return OVERFLOW; // 在索引 表 idxListType 的第 i 项中插入书号为 bno 的索引 } //end for return OK;}//InsertIdexList
  43. 43. 如何建立索引表四个操作的具体实现Void GetWord( int i, HString &wd) {// 用 wd 返回词表 wdlist 中第 i 个关键词 p = *(wdlist.item+i); // 取词表中第 i 个字符串 StrAssign(wd,p); // 生成关键字字符串}
  44. 44. 如何建立索引表四个操作的具体实现int Locate(idxListType &idxlist, HString wd,Boolean &b)// 在索引表 idxlist 中查询是否存在与 wd 相等的关键词 . 若存在 , 则 返回其在索引表中的位置 , 且 b 取 TRUE; 否则返回插入位置 , 且 b 取值 FALSE{ for (i = idlist.last-1; (m=StrCompare(idxlist.item[i].key,wd))>0; --i); if (m==0) { b=TRUE; return i;} // 找到 else (b=FALSE; return i+1;}} //end locate
  45. 45. 如何建立索引表void InsertNewKey(int i, StrType wd) {// 在索引表 idxlist 的第 j 项上插入新关键词 , 并初始化书号索引的链表为空表 for(j=idxlist.last-1;j>=i; --j) idxlist.item[j+1] = idlist.item[j]; // 后移索引项 // 插入新的索引项 StrCopy(idxlist.item[i].key,wd); // 串赋值 InitList(idxlist.item[i].bnolist); // 初始化书号索引表为空表 ++idxlist.last;} //InsertNewKey
  46. 46. 如何建立索引表Status InsertBook (IdxListType &idxlist, int I, int bno) {// 在索引表 idxListType 的第 i 项中插入书号为 bno 的索引 if (!MakeNode(p,bno) return ERROR; // 分配失败 Appand(idxlist.item[i].bnolist,p); // 插入新的书号索引 return OK;} //InsertBook
  47. 47. 关键词 key bnolist 存放书号索引的链表 NULL 0 NULL [0] 0 Algorithms 1 34 NULL 10 Analysis 3 34 8 50 NULL ... P 67 NULLAppand(idxlist.item[i].bnolist,p); // 插入新的书号索引

×