evansyangs evansyangs
首页
分类
标签
归档
GitHub (opens new window)

Evan Yang

摸鱼小能手
首页
分类
标签
归档
GitHub (opens new window)
  • 王道数据结构2019代码
  • Ch2 线性表(p12)
  • Ch3 栈和队列(p58)
  • Ch4 树与二叉树(p101)
  • Ch5 图(p177)
  • Ch6 查找(p234)
    • 6.2 顺序查找和折半查找(p235)
      • 6.2.1 顺序查找((p235)
      • 6.2.2 折半查找(p237)
    • 6.5 字符串模式匹配(p268)
      • 6.5.1 简单的模式匹配算法(p268)
      • 6.5.2 改进的模式匹配算法——KMP算法(p269)
  • Ch7 排序(p282)
目录

Ch6 查找(p234)

# 6.2 顺序查找和折半查找(p235)

# 6.2.1 顺序查找((p235)

  1. 一般线性表的顺序查找
typedef struct{        //查找表的数据结构
    ElemType *elem;    //元素存储空间基址,建表时按实际长度分配,0号单元留空
    int TableLen;    //表的长度
}SSTable;
int Search_Seq(SSTable ST,ElemType key){
//在顺序表ST中顺序查找关键字为key的元素。若找到则返回该元素在表中的位置
    ST.elem[0]=key;    //“哨兵”
    for (i=ST.TableLen;ST.elem[i]!=key; --i){    //从后往前找

    }
    return i;        //若表中不存在关键字为key的元素,将查找到i为0时退出for循环
}
1
2
3
4
5
6
7
8
9
10
11
12

# 6.2.2 折半查找(p237)

int Binary_Search(SeqList L, ElemType key) {
//在有序表L中查找关键字为key的元素,若存在则分会其位置,不存在返回-1
    int low = 0, high = L.length - 1, mid;
    while (low <= high) {
        mid = (low + high) / 2;    //取中间位置
        if (L.elem[mid] == key)
            return mid;        //查找成功则返回所在位置
        else if(L.elem[mid] > key)
            high = mid - 1;        //从前半部分继续查找
        else
            low = mid + 1;        //从后半部分继续查找
    }
    return -1;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 6.5 字符串模式匹配(p268)

# 6.5.1 简单的模式匹配算法(p268)

int Index(SString S,SString T){
    int i=1;j=1;
    while(i<=S[0]&&j<=T[0]){
        if(S[i]==T[j])
        {
            ++i;++j;        //继续比较后继字符
        }
        else
        {
            i=i-j+2;j=1;    //指针后退重新开始匹配
        }
    }
    if(j>T[0])
        return i-T[0];
    else
        return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 6.5.2 改进的模式匹配算法——KMP算法(p269)

void get_next(char T[],int next[]){
    i=1;
    next[1]=0;
    j=0;
    while(i<=T[0]){        //T[0]用于保存字符串的长度
    if(j==0||T[i]==T[j]){
        ++i;++j;next[i]=j;
    }
    else
        j=next[j];
    }
}
int KMP(char S[],char T[],int next[],int pos){
//利用模式串T的next函数求T在主串S中第pos个字符之后的位置的KMP算法
//其中,T非空,1<=pos<=strlen(S)
    i=pos;
    j=1;
    while(i<=S[0]&&j<=T[0]){
    if(j==0||S[i]==T[j]){
        ++i;
        ++j;
    }
    else
        j=next[j];
    }
    if(j>T[0])
    return i-T[0];
    else
    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
编辑 (opens new window)
#数据结构
上次更新: 2021/02/16, 02:45:37
Ch5 图(p177)
Ch7 排序(p282)

← Ch5 图(p177) Ch7 排序(p282)→

最近更新
01
Dell7472黑苹果
03-27
02
上手HackMD
04-13
03
Windows Terminal设置
03-14
更多文章>
Theme by Vdoing | Copyright © 2019-2023 Evan Yang
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式