putchar(sp.stores[wd.stadr+i]);
}
/*---------------与有序表相关的函数-----------*/
/*--------------------------------------------*/
/*结点生成函数*/
/*功能:
生成一个单词在堆中存储信息的结点*/
/*参数:
LinkType*p--生成的新结点指针*/
/*ElemTypee--单词存储信息*/
/*返回值:
TRUE--成功;FALSE--失败*/
/*--------------------------------------------*/
statusMakeNode(LinkType*p,ElemTypee)
{*p=(LinkType)malloc(sizeof(NodeType));
if(!
(*p))return(FALSE);
(*p)->data.stadr=e.stadr;
(*p)->data.len=e.len;
(*p)->next=NULL;
return(TRUE);
}
/*--------------------------------------------*/
/*有序表初始化函数*/
/*功能:
申请头结点,初始化有序表*/
/*参数:
OrderList*L--有序表指针*/
/*返回值:
TRUE--初始化成功;FALSE--初始化失败*/
/*--------------------------------------------*/
statusInitList(OrderList*L)
{ElemTypewd;
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=NULL;
return(FALSE);
}
}
/*--------------------------------------------*/
/*撤销有序表函数*/
/*功能:
释放有序表所有结点,撤销有序表*/
/*参数:
OrderList*L--有序表指针*/
/*返回值:
无*/
/*--------------------------------------------*/
voidDestroyList(OrderList*L)
{LinkTypep,q;
if(L->size==0)
return;
p=L->head;
while(p){
q=p;p=p->next;
free(q);
}
L->head=L->tail=NULL;
}
/*--------------------------------------------*/
/*有序表查找函数*/
/*功能:
确定给定单词e在有序表中的位置*/
/*参数:
OrderListL--有序表*/
/*ElemTypee--给定要查找的数据e*/
/*LinkType*q--有序表结点指针*/
/*查找成功,q指向具有e值的结点*/
/*查找失败,q指向小于e的结点*/
/*返回值:
int型,1--查找成功;0--查找失败*/
/*--------------------------------------------*/
statusLocateElem(OrderListL,ElemTypee,LinkType*q)
{LinkTypepre,p;
intt;
pre=L.head;
p=L.head->next;
while(p)
{
t=WordCmp(p->data,e);
if(t==0)
{
*q=p;
return
(1);
}
elseif(t==-1)
{
pre=p;
p=p->next;
}
else
{
*q=pre;
return(0);
}
}
*q=pre;
return(0);
}
/*--------------------------------------------*/
/*有序表插入函数*/
/*功能:
在指定结点q后插入一个结点s*/
/*参数:
OrderList*L--有序表指针*/
/*LinkTypeq--指定结点指针*/
/*LinkTypes--待查入结点指针*/
/*返回值:
无*/
/*--------------------------------------------*/
voidInsertAfter(OrderList*L,LinkTypeq,LinkTypes)
{if(L->head&&q&&s){
s->next=q->next;q->next=s;
if(L->tail==q)L->tail=s;
L->size++;
}
}
/*------------------------------------------------*/
/*表匹配函数*/
/*功能:
把Lb表中匹配La表成功的元素放入s表*/
/*参数:
OrderListLa--存放统计单词的有序表*/
/*OrderListLb--存放待匹配单词的有序表*/
/*EqelemList*s--存放匹配成功单词信息表指针*/
/*返回值:
无*/
/*------------------------------------------------*/
voidListCompare(OrderListLa,OrderListLb,EqelemList*s)
{intpos;
LinkTypepa,pb;
if(La.head&&Lb.head){
pb=Lb.head->next;
s->last=0;
pos=0;
for(pa=La.head->next;pa!
=NULL;pa=pa->next)
{
while(pb)
{
if(WordCmp(pa->data,pb->data)==0)
s->eqelem[s->last++]=pos;
elseif(WordCmp(pa->data,pb->data)==-1)
break;
pb=pb->next;
}//while
pos++;
pb=Lb.head->next;
}//for
}//if
}
/*--------------------------------------------*/
/*判表空函数*/
/*功能:
判断表L是否是空表*/
/*参数:
OrderListL--有序表*/
/*返回值:
0--非空表;1--空表*/
/*--------------------------------------------*/
statusListEmpty(OrderListL)
{if(L.size==0)return(TRUE);
return(FALSE);
}
/*-----------与文本文件有关的函数-------------*/
/*--------------------------------------------*/
/*字符判断函数*/
/*功能:
判断文件中下一个字符是否为回车符*/
/*参数:
FILE*f--文件指针*/
/*返回值:
0--不是回车符;1--是回车符*/
/*--------------------------------------------*/
intfeoln(FILE*f)
{charcha;
cha=fgetc(f);
ungetc(cha,f);
if(cha=='\n')return(TRUE);
return(FALSE);
}
/*--------------------------------------------*/
/*读取单词函数*/
/*功能:
从文件中读取一个单词*/
/*参数:
FILE*f--文件指针*/
/*Sequence*st--指向单词的指针*/
/*返回值:
无*/
/*--------------------------------------------*/
voidGetAWord(FILE*f,Sequence*st)
{charch;
st->size=0;
printf("getaword\n");
do{
ch=fgetc(f);
}while(ch=='');//do......while
if(ch=='\n')
{
st->size=0;
return;
}//if
while(ch!
='')
{
st->ch[st->size]=ch;
st->size++;
ch=fgetc(f);
if(ch=='\n'||ch==-1)
{
ungetc(ch,f);
return;
}
}
}
/*--------------------------------------------*/
/*读取文件当前行单词函数*/
/*功能:
提取文件指针所在行所有单词*/
/*参数:
FILE*f--文件指针*/
/*OrderList*ta--存放单词有序表的指针*/
/*返回值:
0--操作失败;1--操作成功*/
/*--------------------------------------------*/
statusExtractWord(FILE*f,OrderList*ta)
{
Sequencestr;
WordTypenwd;
LinkTypep;
LinkTypes;
printf("Extractword\n");
if(InitList(ta)==0)
{
printf("InitListtahaveerrors!
!
\n");
return(0);
}//if
while(!
feof(f)&&!
feoln(f))/*文件结束或行结束*/
{
GetAWord(f,&str);
if(str.size==0)
return
(1);
if(NewWord(&nwd,str)==0)
{
printf("NewWorderrors!
\n");
return(0);
}
if(MakeNode(&p,nwd)==0)
{
printf("MakeNodeerrors!
\n");
return(0);
}
LocateElem(*ta,nwd,&s);
InsertAfter(ta,s,p);
}//while
fgetc(f);
return
(1);
}
/*--------------------------------------------*/
/*文件单词匹配函数*/
/*功能:
统计指定单词在文件中出现的次数和位置*/
/*参数:
FILE*f--文件指针*/
/*OrderListpat--指定统计的单词有序表*/
/*ResultTypers--统计结果列表*/
/*返回值:
0--统计失败;1--统计成功*/
/*--------------------------------------------*/
statusmatch(FILE*f,OrderListpat,ResultTypers)
{
inti,k,linenum,failed,fsp;
OrderListsa;
EqelemListeqlist;
Linkq;
linenum=1;
while(!
feof(f))
{
if(InitList(&sa)==0)
{
printf("InitList(sa)errors!
\n");
return(0);
}//if
eqlist.last=0;
if(!
ExtractWord(f,&sa))
{
printf("ExtractWorderrors!
\n");
return0;
}//if
ListCompare(pat,sa,&eqlist);
DestroyList(&sa);
if(eqlist.last!
=0)
{
for(i=0;i{
failed=1;
fsp=eqlist.eqelem[i];
rs[fsp].count++;
for(k=0;k
if(eqlist.eqelem[i]==eqlist.eqelem[k])
{failed=0;break;}
if(failed==1)
{
q=(Link)malloc(sizeof(Node));
q->elem=linenum;
q->next=rs[fsp].next;
rs[fsp].next=q;
}//if语句
}//for语句
}//if语句
linenum++;
}//while语句
return
(1);
}
/*--------------------------------------------*/
/*初始化文件函数*/
/*功能:
输入指定的文件名并打开文件*/
/*参数:
FILE**f--返回的文件指针*/
/*返回值:
0--初始化失败;1--初始化成功*/
/*--------------------------------------------*/
statusInitialization(FILE**fr)
{charFileName[30];
printf("Inputfilename:
");
do{scanf("%s",FileName);
}while(strlen(FileName)==0);
*fr=fopen(FileName,"r");
if(*fr)
{printf("fileopen!
\n");
return(TRUE);
}
else{printf("filenotopen!
\n");
return(FALSE);
}
}
/*--------------------------------------------*/
/*输入统计的词集函数*/
/*功能:
输入待统计的词集并建立起数据结构*/
/*参数:
OrderList*pt--返回的词集有序表指针*/
/*返回值:
无*/
/*--------------------------------------------*/
voidInputWord(OrderList*pt)
{charcc;
intt=0;
Sequencews;
LinkTypep,q;
WordTypenwd;
if(!
InitList(pt))
{