问题:若S和T是用结点大小为1的单链表存储的两个串(S,T为头指针),设计一个算法将串S中首次与串T匹配的子串逆置。
尝试解决的方法:我想用KMP算法来解决。再返回值有多个,如何只求首次匹配位置那里代码不会写。还有如何简单写逆置之后的串也有些问题,求指点。或者这种思路对吗?如果不对该怎样写呢?
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <iostream>
typedef char datatype;
//创建结点
typedef struct node
{
datatype data;
struct node*next;
}linklist;
//用尾插法建立不带头结点的单链表
linklist *create_linklist(void)
{
linklist *head, *p, *r; char ch;
head = NULL; r = NULL;//尾指针为空
while((ch=getchar())!='\n')
{
p = (linklist*)malloc(sizeof(linklist));
p->data = ch;
if(head == NULL) head = p;//新结点插入到空表
else r->next = p;//新结点插入到非空表的末尾
r = p;
}
if(r != NULL) r->next = NULL;//将终端结点的指针域置空
return head;//不带头结点的尾插法,返回单链表的头指针
}
//求单链表长度
int length(linklist *head){
linklist *p;
int count=0;
p = head->next;
while(p!=NULL){
count++;
p=p->next;
}
return count;
}
//KMP算法匹配找到主串上匹配位置
int Index_KMP(linklist *S, linklist *T, int next[], int begin)
{
int i = begin, j = -1;
while(i < length(S) && j < length(T))
{
if(j = -1 || S->data[i] == T->data[j])
{
i++; j++;
}
else
j = next[j];//i不变,将下标回溯到next[j]位置
}
if(j = length(T) return i-length(T);//返回首字符位置
else return -1;
}
void get_next(linklist *T, int next[])
{
int k, j;
j = 0; k = -1; next[0] = -1;
while (j < length(T))
{
if (k == -1 || T->data[j] == T->data[k])
{
j++; k++;
next[j] = k;
}
else k = next[k];
}
}
int main()
{
linklist *S, *T;
S = create_linklist();
T = create_linklist();
int i;
for (i = 0;i<length(S);i++)//打印目标单链表
{
if(i<x||i>x+length(T))
{
printf("%s", &S->data[i]);
}
}
}