1、文学助手研究 数据结构 测试五#include #include #include #include #include #define MAXSIZE 1000#define MAXLEN 20#define MAXNUM 16#define FALSE 0#define TRUE 1/*-堆结构的定义-*/typedef struct char storesMAXSIZE; int freep; /当前可用空间开始位置 HeapSpace;HeapSpace sp;/*-单词数据类型定义-*/*-单词在堆中的位置描述-*/typedef struct int stadr; /单词在对空间中的
2、开始位置 int len; /单词长度 WordType;/*-单词描述-*/typedef struct char chMAXLEN; /单词字符串 int size; /单词长度 Sequence;/*-有序表类型定义-*/*-单词有序表结点定义-*/typedef WordType ElemType;typedef struct NodeType ElemType data; struct NodeType *next; NodeType,*LinkType;/*-单词有序表定义-*/typedef struct LinkType head; /有序表头指针 LinkType tail;
3、 /有序表尾指针 int size; /有序表结点个数 OrderList;/*-记录一行中匹配成功单词在目标词汇表中的位置-*/typedef struct int eqelemMAXNUM; /单词在目标词汇表中的位置 int last; /匹配成功单词的个数 EqelemList;/*-文件测试相关的数据类型定义-*/*-单词在文件中的位置-*/typedef struct Node int elem; /被测单词在文件中的行号 struct Node *next;/指向下一个行号结点的指针 Node,*Link;/*-单词统计分析记录结构定义-*/typedef struct Word
4、Type data; /被测试的单词 int count; /在文件中出现的次数 Link next; /记录出现的所有行号的脸表头指针 HeadNode;/*-文本文件测试结果记录定义-*/typedef HeadNode ResultTypeMAXNUM;typedef int status;/*-与单词相关的函数-*/*-*/* 定义新单词函数 */* 功能:把新单词放入堆中 */* 参数:WordType *nw-单词描述信息指针 */* Sequence cha-单词信息 */* 返回值:操作成功与否的状态信息 */* 0-操作失败,空间不足;1-操作成功 */*-*/status
5、NewWord(WordType *nw,Sequence cha) int i,k; if(sp.freep+cha.size=MAXSIZE) printf(Heap Full!n); getchar(); return(0); else i=sp.freep; sp.freep=sp.freep+cha.size; for(k=0;kstadr=i; nw-len=cha.size; return(1); /*-*/* 复制单词信息函数 */* 功能:把一个单词信息复制到另一个变量中 */* 参数:WordType *nw-新单词描述信息指针 */ /* WordType oldw-旧单
6、词描述信息指针 */* 返回值:无 */*-*/void CopyWord(WordType *nw,WordType oldw) nw-stadr=oldw.stadr; nw-len=oldw.len; /*-*/* 单词比较函数 */* 功能:比较堆中两单词的大小 */* 参数:WordType wd1-第一个单词描述信息 */* WordType wd2-第二个单词描述信息 */* 返回值:-1-小于;0-等于;1-大于 */*-*/int WordCmp(WordType wd1,WordType wd2) int si,sj; for(si=wd1.stadr,sj=wd2.sta
7、dr;si(wd1.stadr+wd1.len)&sjsp.storessj)return (1);else if(sp.storessiwd2.len)/*两个单词长度不相等*/return (1); else if(wd1.lenwd2.len)return (-1); elsereturn (0); /*-*/* 打印单词函数 */* 功能:打印堆中一个单词 */* 参数:WordType wd-单词描述信息 */* 返回值:无 */*-*/void PrintWord(WordType wd) int i; for(i=0;idata.stadr=e.stadr; (*p)-data.
8、len=e.len; (*p)-next=NULL; return(TRUE); /*-*/* 有序表初始化函数 */* 功能:申请头结点,初始化有序表 */* 参数:OrderList *L-有序表指针 */* 返回值:TRUE-初始化成功;FALSE-初始化失败*/*-*/status InitList(OrderList *L) ElemType wd; wd.stadr=-1; wd.len=0; if(MakeNode(&(L-head),wd) L-tail=L-head; L-head-next=NULL; L-size=0; return(TRUE); else L-head=
9、NULL;return(FALSE); /*-*/* 撤销有序表函数 */* 功能:释放有序表所有结点,撤销有序表 */* 参数:OrderList *L-有序表指针 */* 返回值:无 */*-*/void DestroyList(OrderList *L) LinkType p,q; if(L-size=0) return; p=L-head; while(p) q=p;p=p-next; free(q); L-head=L-tail=NULL; /*-*/* 有序表查找函数 */* 功能:确定给定单词e在有序表中的位置 */* 参数:OrderList L-有序表 */* ElemTyp
10、e e-给定要查找的数据e */* LinkType *q-有序表结点指针 */* 查找成功,q指向具有e值的结点 */* 查找失败,q指向小于e的结点 */* 返回值:int型,1-查找成功;0-查找失败 */*-*/status LocateElem(OrderList L,ElemType e,LinkType *q) LinkType pre,p; int t; pre=L.head; p=L.head-next; while(p) t=WordCmp(p-data,e); if(t=0)*q=p;return (1);else if(t=-1)pre=p;p=p-next;else*
11、q=pre;return (0); *q=pre; return (0); /*-*/* 有序表插入函数 */* 功能:在指定结点q后插入一个结点s */* 参数:OrderList *L-有序表指针 */* LinkType q-指定结点指针 */* LinkType s-待查入结点指针 */* 返回值:无 */*-*/void InsertAfter(OrderList *L,LinkType q,LinkType s) if(L-head&q&s) s-next=q-next;q-next=s; if(L-tail=q) L-tail=s; L-size+; /*-*/* 表匹配函数 *
12、/* 功能:把Lb表中匹配La表成功的元素放入s表 */* 参数:OrderList La-存放统计单词的有序表 */* OrderList Lb-存放待匹配单词的有序表 */* EqelemList *s-存放匹配成功单词信息表指针*/* 返回值:无 */*-*/void ListCompare(OrderList La,OrderList Lb,EqelemList *s) int pos; LinkType pa,pb; if(La.head&Lb.head) pb=Lb.head-next; s-last=0;pos=0; for(pa=La.head-next;pa!=NULL;pa
13、=pa-next)while(pb)if(WordCmp(pa-data,pb-data)=0) s-eqelems-last+=pos;else if(WordCmp(pa-data,pb-data)=-1)break;pb=pb-next;/whilepos+;pb=Lb.head-next;/for /if/*-*/* 判表空函数 */* 功能:判断表L是否是空表 */* 参数:OrderList L-有序表 */* 返回值:0-非空表;1-空表 */*-*/status ListEmpty(OrderList L) if(L.size=0) return(TRUE); return(F
14、ALSE); /*-与文本文件有关的函数-*/*-*/* 字符判断函数 */* 功能:判断文件中下一个字符是否为回车符 */* 参数:FILE *f-文件指针 */* 返回值:0-不是回车符;1-是回车符 */*-*/int feoln(FILE *f) char cha; cha=fgetc(f); ungetc(cha,f); if(cha=n) return(TRUE); return(FALSE); /*-*/* 读取单词函数 */* 功能:从文件中读取一个单词 */* 参数:FILE *f-文件指针 */* Sequence *st-指向单词的指针 */* 返回值:无 */*-*/
15、void GetAWord(FILE *f,Sequence *st) char ch; st-size=0; printf(get a wordn); doch=fgetc(f);while(ch= );/do.while if(ch=n) st-size=0; return; /if while(ch!= ) st-chst-size=ch; st-size+; ch=fgetc(f); if(ch=n|ch=-1) ungetc(ch,f);return; /*-*/* 读取文件当前行单词函数 */* 功能:提取文件指针所在行所有单词 */* 参数:FILE *f-文件指针 */* Or
16、derList *ta-存放单词有序表的指针 */* 返回值:0-操作失败;1-操作成功 */*-*/status ExtractWord(FILE *f,OrderList *ta) Sequence str; WordType nwd; LinkType p; LinkType s; printf(Extract wordn); if(InitList(ta)=0) printf(InitList ta have errors!n); return (0); /if while(!feof(f)&!feoln(f)/*文件结束或行结束*/ GetAWord(f,&str); if(str.
17、size=0)return (1); if(NewWord(&nwd,str)=0)printf(NewWord errors!n);return (0); if(MakeNode(&p,nwd)=0) printf(MakeNode errors!n);return (0); LocateElem(*ta,nwd,&s); InsertAfter(ta,s,p); /while fgetc(f); return (1);/*-*/* 文件单词匹配函数 */* 功能:统计指定单词在文件中出现的次数和位置 */* 参数:FILE *f-文件指针 */* OrderList pat-指定统计的单词
18、有序表 */* ResultType rs-统计结果列表 */* 返回值:0-统计失败;1-统计成功 */*-*/status match(FILE *f,OrderList pat,ResultType rs) int i,k,linenum,failed,fsp; OrderList sa; EqelemList eqlist; Link q; linenum=1; while(!feof(f) if(InitList(&sa)=0) printf(InitList(sa) errors!n); return (0); /if eqlist.last=0; if(!ExtractWord(
19、f,&sa) printf(ExtractWord errors!n); return 0; /if ListCompare(pat,sa,&eqlist); DestroyList(&sa); if(eqlist.last!=0) for(i=0;ieqlist.last;i+) failed=1; fsp=eqlist.eqelemi; rsfsp.count+;for(k=0;kelem=linenum;q-next=rsfsp.next; rsfsp.next=q;/if语句 /for语句 /if语句 linenum+; /while语句 return (1);/*-*/* 初始化文件
20、函数 */* 功能:输入指定的文件名并打开文件 */* 参数:FILE *f-返回的文件指针 */* 返回值:0-初始化失败;1-初始化成功 */*-*/status Initialization(FILE *fr) char FileName30; printf(Input file name:); do scanf(%s,FileName); while(strlen(FileName)=0); *fr=fopen(FileName,r); if(*fr) printf(file open!n); return(TRUE); else printf(file not open!n);return(FALSE); /*-*/* 输入统计的词集函数 */* 功能:输入待统计的词集并建立起数据结构 */* 参数:OrderList *pt-返回的词集有序表指针 */* 返回值:无 */*-*/void InputWord(OrderList *pt) char cc; int t=0; Sequence ws; LinkType p,q; WordType nwd; if(!InitList(pt)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1