weixin_63226529 2022-10-13 15:55 采纳率: 75%
浏览 31
已结题

串的块链存储的模式匹配算法

问题遇到的现象和发生背景
用代码块功能插入代码,请勿粘贴截图

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define FALSE 0
#define TRUE 1

#define CHUNKSIZE 4
typedef int Status;
typedef struct Chunk
{
char ch[CHUNKSIZE];
struct Chunk *next;
}Chunk;

typedef struct
{
Chunk *head, *tail; //串的头指针和尾指针
int curlen; //串的当前长度
}LString;

char blank = '#'; //全局变量,用于填补空余

void InitString(LString *T) //初始化(产生空串)字符串
{
(*T).curlen = 0;
(*T).head = NULL;
(*T).tail = NULL;
}

int StrAssign(LString *T, char *chars) //生成一个其值等于chars的串T(要求chars中不包含填补空余的字符) */
{
int i, j, k, l;
Chunk *p, *q=NULL;
i = strlen(chars); //i为串的长度
if (!i || strchr(chars, blank)) //串长为0或chars中包含填补空余的字符
return ERROR;
(*T).curlen = i;
j = i / CHUNKSIZE; //j为块链的结点数
if (i%CHUNKSIZE)
j++;
for (k = 0; k < j; k++)
{
p = (Chunk*)malloc(sizeof(Chunk));
if (!p)
return ERROR;
if (k == 0) /* 第一个链块 */
(*T).head = q = p;
else
{
q->next = p;
q = p;
}
for (l = 0; l < CHUNKSIZE&&*chars; l++)
*(q->ch + l) = *chars++;
if (!chars) / 最后一个链块 */
{
(*T).tail = q;
q->next = NULL;
for (; l < CHUNKSIZE; l++) /* 用填补空余的字符填满链表 */
*(q->ch + l) = blank;
}
}
return 0;
}

int Index(LString &S, LString &T, int pos) //返回子串T在主串S中的位置。若不存在,则函数值为0。
{
int i=pos,j=1;
while(i<=S[0]&&j<=T[0])
{
if(S[i]==T[j]
{
i++;
j++;
}
else
{
i=i-j+2;
j=1;
}
}
if(j>T[0])
return i-T.curlen;
else
return OK;
}

int StrLength(LString S)
{
return S.curlen;
}

void StrPrint(LString T)//打印函数
{
int i = 0, j;
Chunk h;
h = T.head;
while (i < T.curlen)
{
for (j = 0; j < CHUNKSIZE; j++)
if (*(h->ch + j) != blank) /
不是填补空余的字符 */
{
printf("%c", *(h->ch + j));
i++;
}
h = h->next;
}
printf("\n");
}

int main()
{
char s,t;
Status k;
int pos,a;
LString T,S;
InitString(&S);
InitString(&T);
printf("请输入主串S:");
gets(s);
k = StrAssign(&S,s);
if (k == OK)
{
printf("主串S为: ");
StrPrint(S);
}
printf("请输入子串T:");
gets(t);
k = StrAssign(&T, t);
if (k == OK)
{
printf("子串T为: ");
StrPrint(T);
}
printf("请输入pos:");
scanf("%d",&pos);
a=Index(S, T, pos);
printf("%d\n",a);
return 0;
}

运行结果及报错内容

img

  • 写回答

1条回答 默认 最新

  • 日向晚,声声慢 2022-10-15 11:24
    关注

    你还不如将链式的转化为顺序的,然后再求是在哪个位置

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月23日
  • 已采纳回答 11月15日
  • 创建了问题 10月13日

悬赏问题

  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 一直显示正在等待HID—ISP