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日

悬赏问题

  • ¥20 数学建模,尽量用matlab回答,论文格式
  • ¥15 昨天挂载了一下u盘,然后拔了
  • ¥30 win from 窗口最大最小化,控件放大缩小,闪烁问题
  • ¥20 易康econgnition精度验证
  • ¥15 msix packaging tool打包问题
  • ¥28 微信小程序开发页面布局没问题,真机调试的时候页面布局就乱了
  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能