码迷,mamicode.com
首页 > 编程语言 > 详细

KMP算法变形——对链表的处理

时间:2015-03-31 00:26:48      阅读:406      评论:0      收藏:0      [点我收藏+]

标签:

KMP算法简单粗暴的代码,严密的逻辑,初学的时候,真的很难搞懂,不过曾力胜老师这周出的模式串匹配的变形题目,让我反思了一下KMP算法,昨天晚上写出了链表形式,也算是进步吧。昨天太急,没来得及记录,今天补充起来。

 

/*

Name: KMP之链表写法
Date :2015/3/29
Write by:杨领


  */

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

typedef struct  node
{
    
    int data;//数据域
    struct node *next;//指针域
    struct node  *search;//对于模式串,记录匹配失败后,移动的位置。相当于KMP的NEXT数组
    
}Lnode,*P_node;//链表结点

P_node CreactNode(int x)//创建并初始化每一个结点
{
    
    P_node q=(P_node)malloc(sizeof(Lnode));
    
    q->next=NULL;
    q->search=NULL;
    q->data=x;
    
    return q;
    
}

P_node LinkNode(int x)//创建长度为x的链表(含有头结点),并返回头指针的值
{
    
    P_node root=CreactNode(x);
    P_node p=root;
    
    int i,temp; 
    
   for(i=1;i<=x;i++)
   {
       
       scanf("%d",&temp);
       
       p->next=CreactNode(temp);
       
       p=p->next;
       
   }       
   
    return root;
    
}

void GetSearch(P_node root)//对头指针root引出的模式串处理,相当于KMP算法中对NEXT数组的处理
{
    
    P_node p,q,head;
    
    head=p=root;
    q=p->next;
    q->search=head;
    
    while(q){
        
        if(p==head||p->data==q->data||q->next==NULL)
        {
            
            p=p->next;
            q=q->next;
            
            if(q) q->search=p;
            
        }
        
        else p=p->search;

        
    }
    
}

int main()
{
    
    int n,m;
    
    while(scanf("%d%d",&n,&m)!=EOF){//目标链表节点数n,模式链表节点数m
        
        P_node p,q,root1,root2;//root1是目标链表,root2是模式链表
        
        root1=LinkNode(n);
        root2=LinkNode(m);
        
        q=root2;
        p=root1->next;
        
        GetSearch(root2);
        
        while(p&&q){
            
            if(p->data==q->data||q==root2){
                
                p=p->next;
                q=q->next;
                
            }
            
            else q=q->search; 
            
        }
        
        printf(!q?"Yes\n":"No\n");
        
    }
    
}


测试数据:

技术分享

KMP算法变形——对链表的处理

标签:

原文地址:http://www.cnblogs.com/yanglingwell/p/4379437.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!