城墙下的一颗大石榴 2022-10-12 21:03 采纳率: 100%
浏览 85
已结题

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

问题:若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]);
        }
        
    }
}


  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 已结题 (查看结题原因) 10月12日
    • 赞助了问题酬金15元 10月12日
    • 创建了问题 10月12日

    悬赏问题

    • ¥15 如何让企业微信机器人实现消息汇总整合
    • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
    • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
    • ¥15 TLE9879QXA40 电机驱动
    • ¥20 对于工程问题的非线性数学模型进行线性化
    • ¥15 Mirare PLUS 进行密钥认证?(详解)
    • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
    • ¥20 想用ollama做一个自己的AI数据库
    • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
    • ¥15 请问怎么才能复现这样的图呀