串这里基操相交于创销增删改查空多了:清空、求字串、比较、定位操作,介于此块代码的掌握不够熟练,这块需要多code
以下思维导图为这里的重点概括:
代码实现C
//
// main.c
// 串_基操
//
// Created by 郭宸羽 on 6/8/2022.
//
#include <stdlib.h>
#include <stdio.h>
#define MAXLEN 255
//串的顺序存储:
typedef struct
{
char ch[MAXLEN];//栈区分配空间存储释放
int length;
}SString;//静态数组实现(定长顺序存储)
typedef struct
{
char *ch;//ch指向串的基地址
int length;
}HString;//动态数组实现(堆分配存储)
void Initial(HString *S)
{
S->ch = (char*)malloc(MAXLEN * sizeof(char));//使用完后需要手动free
S->length = 0;
}
//串的链式存储
typedef struct StringNode
{
char ch;//每个节点存储一个字符 ⇔ 占1B
struct StringNode *next_p;//不存储信息的结构指针 ⇔ 占8B
}StringNode,*String;
//Q:怎么解决串的链式存储这种存储密度低的问题呢?
//AN:每个结点存放多个字符,从而提高存储密度。
//EX:
typedef struct NStringNode
{
char ch[4];//每个节点存储多个字符
struct NStringNode *next_p;//不存储信息的结构指针 ⇔ 占8B
}NStringNode,*NString;//关于细节:如果最后一个节点中有些位置存不满,可用特殊的字符填充如‘\0’
//求子串操作:
int SubString(SString *Sub,SString *S,int pos,int len)//Sub用来返回想要找到的子串的内容
{
if(pos + len -1 > S->length)//判断子串范围是否越界
return -1;
for(int i = pos; i < pos + len;i++)//将S中的字符从[pos]开始
Sub->ch[i - pos + 1] = S->ch[i];
Sub->length = len;
return 1;
}
//比较操作,从第一个字符开始比较,直到两者中有不同字符
int StrCompare(SString S,SString T)
{
for(int i = 1;i <= S.length && i <= T.length;i++)
{
if(S.ch[i] != T.ch[i])
return S.ch[i] - T.ch[i];//若S > T,则返回值 > 0;若S = T,则返回值 = 0;
//若S < T,则返回值 < 0;
}
//扫描过的所有字符都相同,则长度长的串更大
return S.length - T.length;
}
//查询长度操作:
int StrLength(SString S)
{
return S.length;
}
//定位操作:
int Index(SString S,SString T)
{
int i = 1, n = StrLength(S), m = StrLength(T);//求出S的长度和T的长度,我们知道了T的长
//度才能知道我们要求的子串有多长
SString sub;//用于暂存子串
while(i < n-m+1)
{
SubString(&sub, &S, i, m);
if(StrCompare(sub, T) != 0)
++i;
else
return i;
}
return 0;
}
int main()
{
//printf("%d",sizeof(struct StringNode*)); -> 8
}