数据结构复习笔记(5)

1,KMP算法

None.gifvoid preKmp(char *x, int m, int kmpNext[])
ExpandedBlockStart.gifContractedBlock.gif 
dot.gif{
InBlock.gif
InBlock.gif   
int i, j;
InBlock.gif   i 
= 0;
InBlock.gif   j 
= kmpNext[0= -1;
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif   
while (i < m) dot.gif{
InBlock.gif      
while (j > -1 && x[i] != x[j])
InBlock.gif         j 
= kmpNext[j];
InBlock.gif      i
++;
InBlock.gif      j
++;
InBlock.gif      
if (x[i] == x[j])
InBlock.gif         kmpNext[i] 
= kmpNext[j];
InBlock.gif      
else
InBlock.gif         kmpNext[i] 
= j;
ExpandedSubBlockEnd.gif   }

ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif
void KMP(char *x, int m, char *y, int n) 
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{//x为模式串,m为其长度,y为主串,n为其长度
InBlock.gif

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

ExpandedSubBlockStart.gifContractedSubBlock.gif   
/**//* Preprocessing */
InBlock.gif   preKmp(x, m, kmpNext);
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif   
/**//* Searching */
InBlock.gif   i 
= j = 0;
ExpandedSubBlockStart.gifContractedSubBlock.gif   
while (j < n) dot.gif{
InBlock.gif      
while (i > -1 && x[i] != y[j])
InBlock.gif         i 
= kmpNext[i];
InBlock.gif      i
++;
InBlock.gif      j
++;
ExpandedSubBlockStart.gifContractedSubBlock.gif      
if (i >= m) dot.gif{
InBlock.gif         OUTPUT(j 
- i);
InBlock.gif         i 
= kmpNext[i];
ExpandedSubBlockEnd.gif      }

ExpandedSubBlockEnd.gif   }

ExpandedBlockEnd.gif}

None.gif

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

None.gif#include <stdlib.h>
None.gif#include 
<stdio.h>
None.gif
#define NULL 0
None.giftypedef 
int KeyType;
None.giftypedef 
struct
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    KeyType key;
ExpandedBlockEnd.gif}
ElemType;   //元素类型
None.gif
typedef struct BiTNode
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif ElemType data;
InBlock.gif    
struct BiTNode *lchild,*rchild;
ExpandedBlockEnd.gif}
BiTNode,*BiTree;
None.gifBiTree find(BiTree root,KeyType key)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{  //在二叉排序树中查找其关键字等于给定值的结点是否存在,并输出相应信息
InBlock.gif
BiTNode *p;
InBlock.gif p
=root;
InBlock.gif 
if (p==NULL) return NULL;
InBlock.gif    
else if (p->data.key==key) return p;
InBlock.gif    
else if (key<p->data.key) return find(p->lchild,key);
InBlock.gif    
else return find(p->rchild,key);
ExpandedBlockEnd.gif}

ExpandedBlockStart.gifContractedBlock.gif
void Insert(BiTree *p,BiTree t)dot.gif{               //在二叉排序树中插入一个新结点
InBlock.gif
 if (*p==NULL) *p=t;
InBlock.gif    
else if(t->data.key<(*p)->data.key) Insert(&((*p)->lchild),t);
InBlock.gif    
else if(t->data.key>(*p)->data.key) Insert(&((*p)->rchild),t);
ExpandedBlockEnd.gif}

ExpandedBlockStart.gifContractedBlock.gif
void inorder(BiTree p)dot.gif{  //中序遍历所建二叉排序树,将得到一个按关键字有序的元素序列
ExpandedSubBlockStart.gifContractedSubBlock.gif
 if(p!=NULL)dot.gif{
InBlock.gif inorder(p
->lchild);
InBlock.gif printf(
"%5d",(p->data).key);
InBlock.gif inorder(p
->rchild);
ExpandedSubBlockEnd.gif }

ExpandedBlockEnd.gif}

ExpandedBlockStart.gifContractedBlock.gif
void main()dot.gif{
InBlock.gif 
char ch;
InBlock.gif KeyType key;
InBlock.gif BiTree p,s;
InBlock.gif 
int i=0;
InBlock.gif printf(
"Please input datas (9999:end):\n");//建立一棵二叉排序树,元素值从键盘输入,直到输入关键字等于9999为止
InBlock.gif
 scanf("%4d",&key);
InBlock.gif p
=NULL;
ExpandedSubBlockStart.gifContractedSubBlock.gif 
while(key!=9999)dot.gif{    
InBlock.gif  s
=(BiTree)malloc(sizeof(BiTNode));
InBlock.gif  (s
->data).key=key;
InBlock.gif  s
->lchild=s->rchild=NULL;
InBlock.gif  Insert(
&p,s);
InBlock.gif  scanf(
"%d",&key);
ExpandedSubBlockEnd.gif }

InBlock.gif printf(
"Create is completed\n");
InBlock.gif inorder(p);   
//中序遍历已建立的二叉排序树
InBlock.gif
 printf("\n");
ExpandedSubBlockStart.gifContractedSubBlock.gif 
dodot.gif{    //二叉排序树的查找,可多次查找,并输出查找的结果
InBlock.gif
 printf("Input the key you want to search:");
InBlock.gif scanf(
"%4d",&key);
InBlock.gif s
=find(p,key);
InBlock.gif 
if (s!=NULL) printf("success,the value is %4d ",s->data.key);
InBlock.gif 
else         printf("unsuccess");
InBlock.gif printf(
"\ncontinue?y:n\n");getchar();
InBlock.gif ch
=getchar();
ExpandedSubBlockEnd.gif }
while(ch=='y'||ch=='Y');
ExpandedBlockEnd.gif }

None.gif
None.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值