简单的关联搜索:1 给文本分出各个段落,2 输入一个句子后提取各个单词,3 对于每个单词,分别在每个段落中查找,如果找到,给本段的单词个数标志加1,4以每段单词标志个数位依据进行从大到小排序,5输出所有的排好序的段落。结果就能按照对输入的句子的关联性大小输出各段落了。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LENGTH 33000
typedef struct con
{
char *begin;
char *end;
char *line;
int pnumber;
int lnumber;
int clength;
int m;
struct con *next;
}Content;
int l=0;
typedef struct
{
char line[2000];
int pnumber;
int lnumber;
int clength;
int m;
}Karry;
char commonwords[]={'a','I'};
int Initpage(Content *p);
void Read(Content *p);
int Table(Content *p);
int Getwords(char T[][10],char temp[]);
int Getkeywords(char T[][10],char S[][10],char *commonwords,int *keylength);
int Print(Karry arry[],int llength);
int Search(Content *p);
int Find(char *c,int length,char *temp);
int Sort(Karry arry[],Content *p,int keylength,int *llength);
int Getnext(int next[],char temp[]);
int Get(void);
int FPrint(Content *p);
void main(void)
{ char address[100];
Content *p=0,*ph=0;
int flag;
while(!(ph=(Content *)malloc(sizeof(Content))))
continue;
Initpage(ph);
p=ph;
printf("/n/n所有操作以行为单位,并且必须先进行输入!!!");
printf("/n你想做什么?/n1,读入/n2,查找/n0,退出/n选择=");
printf("读取文件");
Read(p);
printf("查找");
Search(p);
printf("/n谢谢使用,按任意键继续");
getchar();
free(ph->begin);
while(ph->next)
{ p=ph;
ph=ph->next;
free(p);
}
free(ph);
}
int Initpage(Content *p)
{ char *c=0;
while(!(c=(char *)malloc((LENGTH)*sizeof(char))))
continue;
p->begin=c;
p->line=c;
p->pnumber=0;
p->lnumber=0;
p->clength=0;
p->m=0;
p->next=0;
return 1;
}
void Read(Content *p)
{ FILE *fp=0;
int flag,i=0;
char *c=0,address[100],ch;
Content *ph=0;
ph=p;
c=p->begin;
printf("以什么方式读取?/n1,用键盘输入/n2,从硬盘读取/n0,放弃读取/n");
flag=Get();
getchar();
switch(flag)
{ case 1: printf("用 # 结束输入/n");
while((ch=getchar())!='#'&&i<LENGTH)
{ c[i]=ch;
i++;
}
p->end=&c[i-1];
printf("输入结束");
break;
case 2: printf("输入读取文件路径,例如:d:////诗集////李白的诗.txt/n路径=");
gets(address);
if(!(fp=fopen(address,"r")))
{ printf("文件:%s 打不开",address);
return ;
}
while(!feof(fp)&&i<LENGTH)
{ c[i]=fgetc(fp);
i++;
}
p->end=&c[i-2];
printf("/n读取完毕");
fclose(fp);
break;
}
Table(ph);
ph=p;
FPrint(ph);
}
int Table(Content *p)
{ Content *q=0,*t=0;
char *c=0,*e=0,*h=0;
int i=0,line,page=0;
h=c=p->begin;
e=p->end;
q=p;
while(c<e)
{ line=0;
while(c<e&&line<20)
{ q->line=c;
q->pnumber=page;
q->m=0;
q->lnumber=line;
while(*c!='/n'&&c<e)
{ c++;
i++;
}
c++;
q->clength=i;
line++;
i=0;
while(!(q->next=t=(Content *)malloc(sizeof(Content))))
continue;
q=t;
q->end=e;
q->line=0;
q->next=0;
}
page++;
}
return 1;
}
int Search(Content *p)
{ Content *ph=0;
char a[1000],b[10],c[1000];
Karry arry[100];
int flag=0,flag2=0,llength,kl,keylength=0;
char *tq=0,*tp=0,*t=0;
printf("输入字符串/n");
gets(a);
strcpy(c,a);
tp=a;
while(*tp!='/0')
{ if(flag2==0&&(*tp>='0'&&*tp<='9'||*tp>='A'&&*tp<='Z'||*tp>='a'&&*tp<='z'))
{ flag2=1;
tq=tp;
}
if(flag2==1&&(*tp<'0'||*tp>'9'&&*tp<'A'||*tp>'Z'&&*tp<'a'||*tp>'z'))
{ *tp='/0';
strcpy(b,tq);
keylength++;
printf("/n*****%s****/n",b);
{
ph=p;
while(ph->next)
{ if(Find(ph->line,ph->clength,b))
{ ph->m++;
flag=1;
}
ph=ph->next;
}
}
flag2=0;
}
tp++;
}
strcpy(b,tq);
printf("/n*****%s****/n",b);
{
ph=p;
while(ph->next)
{ if(Find(ph->line,ph->clength,b))
ph->m++;
ph=ph->next;
flag=1;
}
}
keylength++;
ph=p;
if(flag)////////////////////////////////////////////////////////////////////////////////
{ Sort(arry,p,keylength,&llength);
printf("/n***************找到了,结果如下:*****************");
Print(arry,llength);
}
else printf("/n*********************对不起,找不到与 %s 有关的内容***********************",c);
return 1;
}/////////////////////////////////////////////////////////////////////////////////////////
int Getwords(char T[][10],char temp[])
{ int flag=1,n;
char *c=0,*ch=0;
c=temp;
while(*c!='/n')
{ if(!flag&&*c>='A'&&*c<='z')
{ flag=1;
ch=c;
}
else if(flag&&(*c<'A'||*c>'z'))
{ *c='/0';
flag=0;
strcpy(T[l],ch);
l++;
}
c++;
}
return l-1;
}
int Sort(Karry arry[],Content *p,int keylength,int *llength)
{ int i=0,j,n;
Karry temp;
while(p->next)
{ if(p->m>0)
{ strncpy(arry[i].line,p->line,p->clength);
arry[i].pnumber=p->pnumber;
arry[i].lnumber=p->lnumber;
arry[i].clength=p->clength;
arry[i].m=p->m;
i++;
}
p=p->next;
}
*llength=n=i;
for(i=0;i<n-1;i++)
for(j=0;j<n;j++)
if(arry[j].m<arry[j+1].m)
{ temp=arry[j];
arry[j]=arry[j+1];
arry[j+1]=temp;
}
return 1;
}
int Print(Karry arry[],int llength)
{ int i,j;
for(i=0;i<llength;i++)
{ printf("/n%d页,%d行: ",arry[i].pnumber,arry[i].lnumber);
for(j=0;j<arry[i].clength;j++)
putchar(arry[i].line[j]);
}
return 1;
}
int FPrint(Content *p)
{ int i;
Content *ph=0;
char *c=0;
ph=p;
while(ph->next)
{ c=ph->line;
printf("/n%d页,%d行 ",ph->pnumber,ph->lnumber);
for(i=0;i<ph->clength;i++)
putchar(c[i]);
ph=ph->next;
}
return 1;
}
int Get(void)
{ int m;
while(scanf("%d",&m)!=1)
{ while(getchar()!='/n')
continue;
printf("请输入一个整数/n");
}
return m;
}
int Getnext(int next[],char temp[])
{ int i=0,j=-1,l;
l=strlen(temp);
next[0]=-1;
while(i<l&&j<l)
{ if(j==-1||temp[i]==temp[j])
{ i++;
j++;
if(temp[i]!=temp[j])
next[i]=j;
else next[i]=next[j];
}
else
j=next[j];
}
return 1;
}
int Find(char *c,int length,char *temp)
{ int next[100],i=0,j=0,l;
Getnext(next,temp);
l=strlen(temp);
while(i<length&&j<l)
{ if(j==0||c[i]==temp[j])
{ i++;
j++;
}
else
{ if(next[j]!=-1)
j=next[j];
else
{j=0;
i++;
}
}
}
if(j>=l)
return 1;
else return 0;
}