简单的关联搜索

 
 

简单的关联搜索: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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值