C语言 数据结构之 字符串暴力匹配

目录

什么是串 及其特点

初始化串

串赋值

打印

暴力匹配

主函数(验证)


什么是串 及其特点

串在一块连续的内存,在C语言中可以看成是一个字符数组;

结构体包含:1.数据域(字符串内容)

                      2.字符串长度

这里就不讲什么是暴力匹配了,用文字讲不太清楚,不懂的可以去找视频讲解

初始化串

typedef struct String {

    char* data;

    int lenth;

}String;

String* initString() {

    String* S = (String*)malloc(sizeof(String));

    S->data = NULL;

    S->lenth = 0;

    return S;

}

串赋值

void assignString(String* S,char* data) {

//先判断S是否为空

    //if (S->data)

    if(S->lenth == 0)

        free(S->data);

    int len =0;

    char* temp = data;

    while (*temp) {//当temp指向\0是结束循环

        len++;

        temp++;

    }

    if (len == 0) {

        S->data = NULL;

        S->lenth = 0;

    }

    else{

        //temp = data;

        S->data = (char*)malloc(sizeof(char)*(len + 1));

        //多一位用于保存字符串结尾\0

        S->lenth = len;

        for (int i = 0; i < len; i++) {

        S->data[i] = data[i];

        }

    }

}

打印

void printString(String* S) {

    for (int i = 0; i < S->lenth; i++) {

        printf(i == 0 ? "%c" : "->%c", S->data[i]);

    }

    printf("\n");

}

暴力匹配

void forcematch(String* S, String* sub) {

    int i = 0;//指向主串

    int j = 0;//指向子串

    while (i <= S->lenth && j lenth) {

        if (S->data[i] == sub->data[j]) {

            i++;

            j++;

        }

        else {//重置指针

            i = i - j + 1;

            j = 0;

        }

    }

    if (j == sub->lenth) {

        printf("force match success\n");

    }

    else

        printf("force match fail\n");

}

主函数(验证)

int main() {

    String* S = initString();

    String* sub = initString();

    assignString(S, "huang");

    printString(S);

    assignString(sub, "ang");

    printString(sub);

    forcematch(S, sub);

    return 0;

}

完整源代码

#include "headfile.h"
typedef struct String {
	char* data;
	int lenth;
}String;
String* initString() {
	String* S = (String*)malloc(sizeof(String));
	S->data = NULL;
	S->lenth = 0;
	return S;
}
void assignString(String* S,char* data) {
//先判断S是否为空
	//if (S->data)
	if(S->lenth == 0)
		free(S->data);
	int len =0;
	char* temp = data;
	while (*temp) {//当temp指向\0是结束循环
		len++;
		temp++;
	}
	if (len == 0) {
		S->data = NULL;
		S->lenth = 0;
	}
	else{
		//temp = data;
		S->data = (char*)malloc(sizeof(char)*(len + 1));
		//多一位用于保存字符串结尾\0
		S->lenth = len;
		for (int i = 0; i < len; i++) {
		S->data[i] = data[i];
		}
	}
}
void printString(String* S) {
	for (int i = 0; i < S->lenth; i++) {
		printf(i == 0 ? "%c" : "->%c", S->data[i]);
	}
	printf("\n");
}
void forcematch(String* S, String* sub) {
	int i = 0;//指向主串
	int j = 0;//指向子串
	while (i <= S->lenth && j lenth) {
		if (S->data[i] == sub->data[j]) {
			i++;
			j++;
		}
		else {//重置指针
			i = i - j + 1;
			j = 0;
		}
	}
	if (j == sub->lenth) {
		printf("force match success\n");
	}
	else
		printf("force match fail\n");
}
int main() {
	String* S = initString();
	String* sub = initString();
	assignString(S, "huang");
	printString(S);
	assignString(sub, "ang");
	printString(sub);
	forcematch(S, sub);
	return 0;
}