在日常的生活中,人们通常会输入几个字符来通过模糊查找找到自己需要的一些资料,大大节约了时间
查找思路:确定目标字符串和需要查找的模糊字符串,借助for循环,通过strlen函数算出字符串的长度,比较目标字符串和需要查找的模糊字符串其中单一字符是否相等(因为汉字每一个字符占两个字节位置,所以汉字要比较相邻两个位置的字符串是否相等)
正常模糊查找:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void bijiao(char *str,char *str1)
{
int i,j;
int n = 0;
for(i = 0;i<strlen(str1);i+=2)
{
for(j = 0;j<strlen(str);j+=2)
{
if(str1[i] == str[j]&&str1[i+1] == str[j+1])
n++;
}
}
if(n == strlen(str)/2) //除以二的原因是一个汉字占两个字节,但n计数原理是
//当相邻的两个字节都相等时,才自增一
puts(str);
}
int main()
{
char str[] = "爱编程";
char str1[] = "小马是一个爱编程的孩子";
bijiao(str,str1);
return 0;
}
因为“爱编程”是子串,所以会被打印出来。
链表模糊查找:
链表和普通的区别就是链表的每个节点都会存有信息,需要不断地移动节点然后借助strcpy函数赋值出来进行模糊查找(代码通过输入的number == 0来控制停止输入)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Node
{
char name[20];
int number;
struct Node *Next;
}Node,*LinkList;
LinkList createList()
{
LinkList head = (Node*)malloc(sizeof(Node));
head->Next = NULL;
return head;
}
void CreateByBear(LinkList head)
{
Node *r,*s;
r = head;
char name[20];
int number;
while(1)
{
scanf("%s ",name);
scanf("%d",&number);
if(number == 0)
{
break;
}
s = (Node*)malloc(sizeof(Node));
strcpy(s->name,name);
s->number = number;
r->Next = s;
r = s;
}
r->Next = NULL;
}
void OutputList(LinkList head)
{
Node *p = head->Next;
while(p)
{
printf("%s %d\n",p->name ,p->number);
p = p->Next ;
}
}
void mohu(LinkList head)
{
int i,j,n = 0;
Node *r = head->Next;
char name[20]; //模糊查找的字符串
printf("请输入你要查找的模糊字符串:");
getchar();
gets(name);
char Listname[20]; //接收链表中的名字
while(r)
{
strcpy(Listname,r->name);
for(i = 0;i<strlen(Listname);i+=2)
{
for(j = 0;j<strlen(name);j+=2)
{
if(Listname[i] == name[j]&&Listname[i+1] == name[j+1])
{
n++;
}
}
}
if(n == strlen(name)/2)
{
printf("%s %d\n",r->name ,r->number );
}
n=0;
r = r->Next;
}
}
int main()
{
Node *head = createList();
CreateByBear(head);
OutputList(head);
printf("\n");
mohu(head);
return 0;
}
?
|