数据结构关于串的练习题,已经写了大概

问题:若S和T是用结点大小为1的单链表存储的两个串(S,T为头指针),设计一个算法将串S中首次与串T匹配的子串逆置。
尝试解决的方法:我想用KMP算法来解决。再返回值有多个,如何只求首次匹配位置那里代码不会写。还有如何简单写逆置之后的串也有些问题,求指点。或者这种思路对吗?如果不对该怎样写呢?

#include
#include
#include
#include 
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(ix+length(T))
        {
            printf("%s", &S->data[i]);
        }
        
    }
}