数据结构复习笔记(5)

简介:
1,KMP算法

void preKmp(char *x, int m, int kmpNext[])
 {

   int i, j;
   i = 0;
   j = kmpNext[0] = -1;

   while (i < m) {
      while (j > -1 && x[i] != x[j])
         j = kmpNext[j];
      i++;
      j++;
      if (x[i] == x[j])
         kmpNext[i] = kmpNext[j];
      else
         kmpNext[i] = j;
   }
}


void KMP(char *x, int m, char *y, int n) 
{//x为模式串,m为其长度,y为主串,n为其长度

   int i, j, kmpNext[MAXSIZE];//kmpNext数组存放next函数值

   /* Preprocessing */
   preKmp(x, m, kmpNext);

   /* Searching */
   i = j = 0;
   while (j < n) {
      while (i > -1 && x[i] != y[j])
         i = kmpNext[i];
      i++;
      j++;
      if (i >= m) {
         OUTPUT(j - i);
         i = kmpNext[i];
      }
   }
}


2,二叉排序树的建立及查找算法

#include <stdlib.h>
#include <stdio.h>
#define NULL 0
typedef int KeyType;
typedef struct
{
    KeyType key;
}ElemType;   //元素类型
typedef struct BiTNode
{
 ElemType data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
BiTree find(BiTree root,KeyType key)
{  //在二叉排序树中查找其关键字等于给定值的结点是否存在,并输出相应信息
BiTNode *p;
 p=root;
 if (p==NULL) return NULL;
    else if (p->data.key==key) return p;
    else if (key<p->data.key) return find(p->lchild,key);
    else return find(p->rchild,key);
}
void Insert(BiTree *p,BiTree t){               //在二叉排序树中插入一个新结点
 if (*p==NULL) *p=t;
    else if(t->data.key<(*p)->data.key) Insert(&((*p)->lchild),t);
    else if(t->data.key>(*p)->data.key) Insert(&((*p)->rchild),t);
}
void inorder(BiTree p){  //中序遍历所建二叉排序树,将得到一个按关键字有序的元素序列
 if(p!=NULL){
 inorder(p->lchild);
 printf("%5d",(p->data).key);
 inorder(p->rchild);
 }
}
void main(){
 char ch;
 KeyType key;
 BiTree p,s;
 int i=0;
 printf("Please input datas (9999:end):\n");//建立一棵二叉排序树,元素值从键盘输入,直到输入关键字等于9999为止
 scanf("%4d",&key);
 p=NULL;
 while(key!=9999){    
  s=(BiTree)malloc(sizeof(BiTNode));
  (s->data).key=key;
  s->lchild=s->rchild=NULL;
  Insert(&p,s);
  scanf("%d",&key);
 }
 printf("Create is completed\n");
 inorder(p);   //中序遍历已建立的二叉排序树
 printf("\n");
 do{    //二叉排序树的查找,可多次查找,并输出查找的结果
 printf("Input the key you want to search:");
 scanf("%4d",&key);
 s=find(p,key);
 if (s!=NULL) printf("success,the value is %4d ",s->data.key);
 else         printf("unsuccess");
 printf("\ncontinue?y:n\n");getchar();
 ch=getchar();
 }while(ch=='y'||ch=='Y');
 }





本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2006/09/24/513017.html,如需转载请自行联系原作者,如需转载请自行联系原作者

目录
相关文章
|
1月前
|
算法 搜索推荐 Java
数据结构与算法(Java篇)笔记--希尔排序
数据结构与算法(Java篇)笔记--希尔排序
|
5月前
|
自然语言处理 算法 测试技术
【数据结构原理】系统生命周期 | 算法规范 | 笔记
【数据结构原理】系统生命周期 | 算法规范 | 笔记
43 0
|
8月前
|
存储 算法 Java
完美!字节3-1级别大佬把《数据结构与算法》讲透了,带源码笔记
数据结构是计算机科学与技术专业非常重要的一门核心基础课,计算机科学各个领域以及各种应用软件都要使用相关的数据结构和算法。 本篇的主要目的不是提供关于数据结构和算法的定理及证明。本书采用的模式是利用不同的复杂度改善问题的解决(对于每个问题,你将发现多个具有不同复杂度及降低复杂度的解法)。基本上,这一思路就是列举某个问题的所有可能性。通过这种方式,即使你遇到一个新问题,它也能够向你指明如何思考该问题所有可能的结果。对于正在准备面试、参加选拔性考试以及校园面试的读者很有帮助。
|
1月前
|
算法 搜索推荐 Java
数据结构与算法(Java篇)笔记--快速排序
数据结构与算法(Java篇)笔记--快速排序
|
1月前
|
机器学习/深度学习 算法 搜索推荐
数据结构与算法(Java篇)笔记--归并排序
数据结构与算法(Java篇)笔记--归并排序
|
1月前
|
算法 搜索推荐 Java
数据结构与算法(Java篇)笔记--选择排序
数据结构与算法(Java篇)笔记--选择排序
【数据结构】做题笔记--区间反转链表
【数据结构】做题笔记--区间反转链表
|
2月前
|
存储 算法 Java
数据结构与算法笔记(一)
数据结构与算法笔记(一)
104 0
|
3月前
|
NoSQL Redis C语言
|
4月前
|
算法 搜索推荐
太厉害了!腾讯T4大牛把《数据结构与算法》讲透了,带源码笔记
经历过校招的人都知道,算法和数据结构都是不可避免的。 在笔试的时候,最主要的就是靠算法题。像拼多多、头条这种大公司,上来就来几道算法题,如果你没AC出来,面试机会都没有。