这个程序词索引表的程序 求大神指点错误在哪里

#include < stdio.h >
#include < stdlib.h >
#include < string.h >
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MaxBookNum 1000 //假设只对1000本书建立索引表
#define MaxKeyNum 2500 //索引表的最大容量
#define MaxLineLen 500 //书目串的最大长度
#define MaxWordNum 10 //词表的最大容量
typedef int ElemType ; //定义链表数据元素类型为整型(书号类型)
typedef struct
{
char *ch;
int length;
}HString;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
void InitList(LinkList *L) ;
void PrintList(LinkList L) ;
ElemType GetElem(LinkList L, int i, ElemType *e) ;
int LocateElem(LinkList L,ElemType e) ;
void DestroyList(LinkList L) ;
void InitString(HString *T) ;
void StrAssign( HString *T, char *cha) ;
void StrCopy( HString *T , HString S ) ;
void StrPrint(HString T, FILE *fp) ;
void ClearString(HString *T) ;
int StrCompare(HString S,HString T) ;
//--------------------------------------------------------//
typedef struct {
char item[ 20 ][ 20 ] ; //字符串的数组
int last ; //词表的长度
} WordListType ; //词表类型(顺序表)
typedef struct {
HString key ; //关键词
LinkList bnolist ; //存放书号索引的链表
} IdxTermType ; //索引项类型
typedef struct {
IdxTermType item[ MaxKeyNum + 1 ] ;
int last ;
} IdxListType ; //索引表类型(有序表)
//主要变量
char buf[ 256 ] ; //书目串缓冲区
WordListType wdlist ; //词表
HString oftenwords[ 7 ] ; //常用词表

//---------------------Basic Operation---------------------//
void InitIdxList( IdxListType *idxlist ) ; //初始化,置索引表idxlist为空表,且在idxlist.item[0]设一空串
void GetLine( FILE *fp ) ; //从文件中读入一个书目信息到书目串缓冲区buf
void ExtractKeyWord( ElemType *bno ) ; //从书目串缓冲区提取书名关键词到词表wdlist,书号存入bno
int InsIdxList( IdxListType *idxlist , ElemType bno ) ; //将书号为bno的书名关键词按词典顺序插入索引表idxlist
void PutText( FILE *fp , IdxListType idxlist ) ; //将生成的索引表idxlist输入到文件中
//---------------------For Insert--------------------------//
void GetWord( int i , HString *wd ) ; //用wd返回词表wdlist中第i个关键词
int Locate( IdxListType idxlist , HString wd , int *b );//在索引表idxlist中插叙是否存在与wd相等关键词.若存在,则返回其在索引表中的位置,且b取TREUE;否则返回插入位置,且b取值FALSE.
void InsertNewKey( IdxListType *idxlist , int i , HString wd ) ;//在索引表idxlist的第i项上插入新关键词wd,并初始化书号索引的链表为空表
int InsertBook( IdxListType *idxlist , int i , int bno ) ; //在索引表idxlist的第i项中插入书号为bno的索引
void OftenWords( ) ;
int IsOftWords( char *temp ) ;
int MakeNode( LinkList *p , ElemType bno ) ;
void Appand( LinkList bnolist , LinkList p ) ;
//---------------------For Query---------------------------//
void ExtractyWord( int BookNum[ ] , char words[ ] ) ;
void ExtractyName( char name[ ] , WordListType *namewords ) ;
void FindtheSame( int BookNum[ ] , int Num[ ] ) ;
void Query( FILE *fp , char *name ) ; //从关键词索引表中查找是否包含某本书
//-------------------------------------------------------//
#include "bookinfo.txt"
void InitIdxList( IdxListType *idxlist );
{
(*idxlist).last = 1 ;
InitString( &(*idxlist).item[ 0 ].key ) ;
(*idxlist).item[ 0 ].bnolist = ( LinkList )malloc( sizeof( LNode ) ) ;
(*idxlist).item[ 0 ].bnolist->next = NULL ;
}
void GetLine( FILE *fp )
{
buf[ 256 ] = ‘ ‘ ;
fgets( buf , 256 , fp ) ;
}
void OftenWords( ) //构造常用词表
{
int i ;
for( i = 0 ; i < 7 ; ++ i )
{
InitString( (oftenwords+i) ) ;
}
StrAssign( &(oftenwords[ 0 ]) , "an" ) ;
StrAssign( &(oftenwords[ 1 ]) , "a" ) ;
StrAssign( &(oftenwords[ 2 ]) , "to" ) ;
StrAssign( &(oftenwords[ 3 ]) , "of" ) ;
StrAssign( &(oftenwords[ 4 ]) , "the" ) ;
StrAssign( &(oftenwords[ 5 ]) , "The" ) ;
StrAssign( &(oftenwords[ 6 ]) , "and" ) ;

}
int IsOftWords( char *temp ) //判断是否为常用词表
{
int i ;
for( i = 0 ; i < 7 ; ++ i )
{
if( !strcmp( oftenwords[ i ].ch , temp ) )
return OK ;
}
return ERROR ;
}
void ExtractKeyWord( ElemType *bno )
{
char temp[ 20 ] ;
int j , i = 0 ;

wdlist.last = 0 ;
while( buf[ i ] != ‘\0‘ && buf[ i ] != ‘\n‘ && buf[ i ] != ‘ ‘ )
{
j = 0 ;
while( buf[ i ] != ‘ ‘ && buf[ i ] != ‘\0‘ && buf[ i ] != ‘\n‘ )
{
temp[ j ] = buf [ i ] ;
++ i ;
++ j ;
}
temp[ j ] = ‘\0‘ ;
if( 0 == wdlist.last )
{
*bno = atoi( temp ) ;
wdlist.last ++ ;

else
{
if( !IsOftWords( temp ) )
{
strcpy( wdlist.item[ wdlist.last - 1 ] , temp ) ;
wdlist.last++ ;
}
}
++ i ;
}
wdlist.last-- ;
}
int InsIdxList( IdxListType *idxlist , ElemType bno )
{
int i , j , b ;
HString wd ;
for( i = 0 ; i < wdlist.last ; ++ i )
{
GetWord( i , &wd ) ;
j = Locate( *idxlist , wd , &b ) ;
if( !b )
InsertNewKey( idxlist , j , wd ) ; //插入新的索引项
if( !InsertBook( idxlist , j , bno ) ) //插入书号索引
return OVERFLOW ;
}
return OK ;
}
void PutText( FILE *fp , IdxListType idxlist )
{
int i ;
LinkList p ;
for( i = 1 ; i < idxlist.last ; ++ i ) //0号空置
{
StrPrint( idxlist.item[ i ].key , fp ) ;
p = idxlist.item[ i ].bnolist->next ;
while( p )
{
printf( "%d " , p->data ) ;
fprintf( fp , "%d " , p->data ) ;
p = p->next ;
}
printf( "\n" ) ;
fprintf( fp , "%c " , ‘\n‘ ) ;
}
}
//------------------------For Insert------------------------------//
void GetWord( int i , HString *wd )
{
char *p = *( wdlist.item + i ) ; //取词表中第i个字符串
StrAssign( wd , p ) ; //生成关键字字符串
}
int Locate( IdxListType idxlist , HString wd , int *b )
{
int i , m ;
for( i = idxlist.last - 1 ; ( m = StrCompare( idxlist.item[ i ].key , wd ) ) > 0 ; -- i ) ;
if( m == 0 ) //找到
{
*b = TRUE ;
return i ;
}
else
{
*b = FALSE ;
return i + 1 ; //返回插入的位置
}
}
void InsertNewKey( IdxListType *idxlist , int i , HString wd )
{
int j ;
for( j = (*idxlist).last - 1 ; j >= i ; -- j ) //后移索引项
(*idxlist).item[ j + 1 ] = (*idxlist).item[ j ] ;
//插入新的索引项
StrCopy( &(*idxlist).item[ i ].key , wd ) ; //串赋值
InitList( &(*idxlist).item[ i ].bnolist ) ; //初始化书号索引表为空表
++ (*idxlist).last ;
}
int MakeNode( LinkList *p , ElemType bno )
{
*p = ( LinkList )malloc( sizeof( LNode ) ) ;
if( !( *p ) )
return ERROR ;
( *p )->data = bno ;
return OK ;
}
void Appand( LinkList bnolist , LinkList p ) 
{
p->next = bnolist->next ;
bnolist->next = p ;
}
int InsertBook( IdxListType *idxlist , int i , int bno )
{
LinkList p ;
if( !MakeNode( &p , bno ) ) 
return ERROR ; //分配失败
Appand( (*idxlist).item[ i ].bnolist , p ) ; //插入新的书号索引
return OK ;
}
//--------------------------For Query-----------------------------------//
void ExtractyWord( int BookNum[ ] , char words[ ] ) 
{
int i = 0 , j = 0 , k = 0 ;
char temp[ 5 ] ;
while( buf[ i ] != ‘:‘ ) //key word
{
words[ i ] = buf[ i ] ;
++ i ;
}
words[ i ] = ‘\0‘ ;

while( buf[ i ] != ‘\n‘ )
{
j = 0 ;
i++ ;
while( buf[ i ] != ‘ ‘ && buf[ i ] != ‘\n‘ )
{
temp[ j ] = buf[ i ] ;
++ j ; ++ i ;
}
temp[ j ] = ‘\0‘ ;
BookNum[ k ] = atoi( temp ) ;
++ k ;
}
}
void ExtractyName( char name[ ] , WordListType *namewords ) 
{
int i = 0 , j = 0 ;
(*namewords).last = 0 ;
while( name[ i ] != ‘\0‘ )

j = 0 ;
while( name[ i ] != ‘ ‘ && name[ i ] != ‘\0‘ )
{
(*namewords).item[ (*namewords).last ][ j ] = name[ i ] ;
++ i ; ++ j ;
}
(*namewords).item[ (*namewords).last ][ j ] = ‘\0‘ ;
++ (*namewords).last ;
if( name[ i ] == ‘\0‘ )
break ;
else
++ i ;
}
}
void FindtheSame( int BookNum[ ] , int Num[ ] )
{
int k , j = 0 ;
for( k = 0 ; k < 10 ; ++ k ) //也可以设法把BookNum[]的长度传近来
{
if( BookNum[ k ] )
{
j = 0 ;
while( Num[ j ] && j < 10 )
{
if( BookNum[ k ] == Num[ j ] )
break ;
++ j ;
}
if( !Num[ j ] || j >= 10 )
BookNum[ k ] = 0 ;
}
}
}
void Query( FILE *fp , char *name ) 
{
char words[ 20 ] ;
WordListType namewords ;
int i , times = 0 , j = 0 ;
int BookNum[ 10 ] = { 0 }, Num[ 10 ] = { 0 };
ExtractyName( name , &namewords ) ;
while( !feof( fp ) )
{
j = 0 ;
GetLine( fp ) ;
ExtractyWord( Num , words ) ;
for( i = 0 ; i < namewords.last ; ++ i )
{
if( !strcmp( words , namewords.item[ i ] ) )
{ //存储书号
if( 0 == times ) //第一次,保留所有书号
{
while( Num[ j ] )
{
BookNum[ j ] = Num[ j ] ;
++ j ;
}
times++ ;
}
else //后续次,保留相同的书号,不同的书号则置为0
{
FindtheSame( BookNum , Num ) ;
}
}
} // for
} // while 
//判断并锁定书号
j = 0 ;
while( !BookNum[ j ] && j < 10 )
j ++ ;
if( j >= 10 )
printf( "Can‘t find that book!" ) ;
else
printf( "Oh, Find the book you want! The Number is :%d\n" , BookNum[ j ] ) ;
}
//----------------------------------------------------------------//
int main( )
{
FILE *fi , *fo , *fp ;
IdxListType idxlist ;
ElemType bno ;
if( !( fi = fopen( "书目文件.txt" , "r" ) ) || !( fo = fopen( "关键词索引文件.txt" , "w") ) )
{ //注意:“书目文件”的最后一条字符串后面要多打一个空格!
printf( "Cannot Open the file!\n" ) ;
exit( 0 ) ;
}
OftenWords( ) ;
InitIdxList( &idxlist ) ;
while( !feof( fi ) )
{
GetLine( fi ) ;
ExtractKeyWord( &bno ) ;
InsIdxList( &idxlist , bno ) ;
}
PutText( fo , idxlist ) ;
fclose( fi ) ;
fclose( fo ) ;

if( !( fp = fopen( "关键词索引文件.txt" , "r") ) )
{
printf( "Cannot Open the file!\n" ) ;
exit( 0 ) ;
}
Query( fp , "Numerical Analysis" ) ;
fclose( fp ) ;
return 0 ;
}

时间: 2024-10-14 04:35:02

这个程序词索引表的程序 求大神指点错误在哪里的相关文章

dll注册到GAC还是bin - 跪求大神指点 - sharepoint程序

通常来说程序在使用dll的时候,会先去GAC中查找是否有存在合适的dll,然后才会到应用程序下的bin目录去查找: 前几天遇到了一个奇葩问题,web项目工程添加了一个第三方dll的引用,然后把这个第三方的dll注册到了GAC里面,但是web程序在运行时,报错程序集未引用:然后就在bin目录下也copy了一份dll,然后程序就OK了:但是这个情况推翻了上面的逻辑,于是进行了多次测试修改,终于发现,如果在前台页面(aspx页面)中调用了第三方dll中的方法(<%%>的方式调用),则此第三方dll就

自己封装了一个EF的上下文类.,分享一下,顺便求大神指点

using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.Entity; using System.Data.Entity.Core.Objects; using System.Data.Entity.Infrastructure; using System.Data.Entity.Migrations; using System

ssh2整合: No bean named &#39;sessionFactory&#39; is defined(求大神指点)

applicationContext.xml 中已经配置 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="hibernate

最近学到的知识概述,求大神指点后续的路该怎么规划

求大神指导迷津: 前端的路,已经走了一年多了,从懵懂地编码到现在的熟悉的操作,学会使用了svn.git.webstrom这些版本控制和开发软件,尤其是当学会用webstrom进行git提交代码时,才很惊喜的发现,学会使用好用的工具可以节省很多时间,大大提升工作的效率![工具很重要]. 在搭建好的框架下,去开发设计好的网页图,对我来说都是没问题的了,前段时间,在没有人指导的情况下,自己摸索着在现有的框架下,调用ztree完成一个功能,包括API接口该如何设计.保存后如何向后台传数据.[自学能力在成

蓝桥杯 历届试题 约数倍数选卡片 求大神指点 首先声明,我的代码有问题!不喜勿进,若有意向,可以讨论,我百度不到这道题的题解

历届试题 约数倍数选卡片 时间限制:1.0s   内存限制:256.0MB 问题描述 闲暇时,福尔摩斯和华生玩一个游戏: 在N张卡片上写有N个整数.两人轮流拿走一张卡片.要求下一个人拿的数字一定是前一个人拿的数字的约数或倍数.例如,某次福尔摩斯拿走的卡片上写着数字"6",则接下来华生可以拿的数字包括: 1,2,3, 6,12,18,24 .... 当轮到某一方拿卡片时,没有满足要求的卡片可选,则该方为输方. 请你利用计算机的优势计算一下,在已知所有卡片上的数字和可选哪些数字的条件下,怎

求大神指点这个程序格式错在哪里了。

杭电1002题Problem DescriptionI have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B.InputThe first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines

获取网络时间失败,求大神指点

private void GainTime() { new Thread(new Runnable() { @Override public void run() { try { URL url=new URL("http://www.taobao.com"); URLConnection uc=url.openConnection(); uc.connect(); long id=uc.getDate(); Date date=new Date(id); SimpleDateForm

页面显示多个计时器,有开始暂停按钮来控制倒计时的开关????求大神指点

是这样的,项目需要一个这样的效果我先上个图 需求是这样的,从数据库获取来的列表,组装时间换算成分钟,点击开始时换算成时分秒的格式倒计时,点击暂停按钮停止倒计时,向后台发送原因,可以开启多个倒计时,可以暂停任意一个,还可以点击开始后继续倒计时, 大神们,这可真难着了,这到底该怎么玩呢??? 这个需求是销售公司规定员工在规定时间内完成组装便可以得到奖励金,超过便没有,该怎么实现呢???

水仙花问题求大神指点哪里有错!

6y4ys4姑窍星夏郊目<http://weibo.com/p20180413Pp/230927983240056418340864> h7pk9y眉皆牢梁皆悍<http://weibo.com/RnDShp/230927983077305872031744> h2bhnn拔诚浅任镜簇<http://weibo.com/20180413p/230927982948654052548608> w5ffv0淳汛运澜雷俣<http://weibo.com/UsitJp/