本人使用VC2019进行编程,该软件C中可以使用C++语法,故可能不严谨
前言
在校大学生,学习差,写写帖子长长写代码的记性。不好的地方大家请指正,谢谢。
提示:以下是本篇文章正文内容,下面案例可供参考
一、串
1.什么是串
“dsandjkasdna”
“dsad1231561”
“!@#$%^&*(”
c语言中只要有双引号括起来的,就叫串。双引号里什么都没有就叫空串。
2.逻辑结构
串的逻辑结构显然是线性的。字符间的前驱后继都是一对一的关系。所以是线性。
3.在内存中的存储形式
1.通过顺序表存储
顺序表存储就是开辟一块连续空间来存储,这块空间被定义为数组。说白了我们的顺序表都是数组,数组中每一块空间来存放一个字符。
typedef struct SString {
char* str; //注意这里有指针但并不是用来做链表的,而是动态开辟数组用
int len;
}SString;
2.通过链表存储
链表就依然是最简单的链表定义,然后链表中的数据域就用来存放一个字符。
typedef struct LinkString{
char c;
struct LinkString *next;
}Stringnode;
3.通过块链存储
块链呢是为了解决链表的存储密度过低问题。比如我上面链式的定义里面,char c只占了1个空间,而struct LinkString *next占了4个,所以其实数据的存储密度只有20%。所以引出了块链,块链的数据域就不是指存放一个了,而是开辟一个数组多放几个,从而提高存储密度。
typedef struct KuaiLian {
char c[size]; //size大小自己要多大设置多大
struct LinkString* next;
}Stringnode;
二、代码实现
1.串的定义
typedef struct SString {
char* str;
int len;
}SString;
2.完整代码
#include<stdio.h>
#include <corecrt_malloc.h>
#include <string.h>
typedef struct SString {
char* str;
int len;
}SString;
void InitSString(SString &s,int size) { //动态开辟空间进行字符串输入
s.str =(char *) malloc(sizeof(char) * size);
if (s.str == NULL) {
printf("开辟空间失败。\n");
}
else
{
printf("input string:");
scanf("%s", s.str);
s.len = strlen(s.str);
printf("初始化完成,字符串长度为:%d,字符为:%s\n", s.len, s.str);
}
}
int BF(SString s,SString t) {
int i = 0, j = 0;
while (i<s.len&&j<t.len) //while结束条件就是主串或模式串已经比较到最后一个字符了
{
if (s.str[i] == t.str[j])
{
i++, j++;
}
else
{
i = i - j + 1;
j = 0;
}
}
if (j==t.len) //找到了子串的条件
{
return i-j+1;
}
else //没找到子串
{
return 0;
}
}
int main() {
SString s1,s2;
int len;
printf("input s1 length:");
scanf("%d", &len);
InitSString(s1, len);
printf("input s2 length:");
scanf("%d", &len);
InitSString(s2, len);
if (BF(s1, s2)) {
printf("找到子串在主串中的位置为:%d\n", BF(s1, s2));
}
else
{
printf("在主串中没有找到该子串。\n");
}
return 0;
}
总结
串的模式匹配bf算法挺好理解的。while,if的嵌套比较,最终就可以得到答案。但是对于指针的操作让我错了不少比如:
s.str =(char *) malloc(sizeof(char) * size);
if (s.str == NULL) {
printf("开辟空间失败。\n");
}
else
{
printf("input string:");
//注意这下面!!!!!
scanf("%s", &s.str);//这是错误写法,仅仅就比正确写法多了个&。
//注意这上面!!!!!
//另外下面对str求长度我用sizeof并不能算出str长度。所以直接用了strlen
s.len = strlen(s.str);
printf("初始化完成,字符串长度为:%d,字符为:%s\n", s.len, s.str);
}