中文模糊查找(C语言)+ 链表操作

在日常的生活中,人们通常会输入几个字符来通过模糊查找找到自己需要的一些资料,大大节约了时间

查找思路:确定目标字符串和需要查找的模糊字符串,借助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;
}

  • 16
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
单链表模糊查找可以通过遍历链表的方式来实现,具体的算法设计如下: 1. 遍历单链表,从头结点开始,依次访问每个节点。 2. 对于每个节点,判断其存储的数据是否与目标数据相匹配。这里可以使用模糊匹配算法,如字符串匹配中的模糊匹配算法。 3. 如果匹配成功,则记录该节点,并继续遍历下一个节点;否则,继续遍历下一个节点。 4. 当遍历完整个单链表后,返回所有匹配成功的节点。 下面是一个简单的C语言代码实现: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义链表节点结构体 typedef struct ListNode { char data[50]; struct ListNode *next; } ListNode; // 单链表模糊查找算法 ListNode *fuzzySearch(ListNode *head, char target[]) { ListNode *p = head; ListNode *result = NULL; while (p != NULL) { if (strstr(p->data, target) != NULL) { // 如果匹配成功,则记录该节点 ListNode *temp = (ListNode *)malloc(sizeof(ListNode)); strcpy(temp->data, p->data); temp->next = result; result = temp; } p = p->next; } return result; } int main() { // 创建单链表 ListNode *head = (ListNode *)malloc(sizeof(ListNode)); strcpy(head->data, "apple"); head->next = NULL; ListNode *node2 = (ListNode *)malloc(sizeof(ListNode)); strcpy(node2->data, "banana"); node2->next = NULL; head->next = node2; ListNode *node3 = (ListNode *)malloc(sizeof(ListNode)); strcpy(node3->data, "orange"); node3->next = NULL; node2->next = node3; // 调用模糊查找算法 ListNode *result = fuzzySearch(head, "a"); // 输出查找结果 printf("fuzzy search result:\n"); ListNode *p = result; while (p != NULL) { printf("%s\n", p->data); p = p->next; } return 0; } ``` 在上面的代码中,我们通过定义链表节点结构体来表示单链表,然后实现了一个名为 `fuzzySearch` 的函数,该函数用于实现单链表模糊查找算法。在函数中,我们使用了字符串匹配中的 `strstr` 函数来实现模糊匹配,如果匹配成功,则将该节点记录下来,并返回所有匹配成功的节点。最后,我们在 `main` 函数中创建了一个简单的单链表,并调用了 `fuzzySearch` 函数来进行模糊查找,并输出查找结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜路难行々

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值