这篇文章收录了王道考研课程中涉及的数据结构的所有代码。此外,本博客可能会添加一些额外的代码(不仅限于王道考研),因为408考试中会频繁考察一些冷门的知识点,所以这篇博客会涵盖所有相关的代码。这也是我数据结构的第一轮复习,希望能与大家共同进步。由于博客篇幅的限制,可能无法一次性包含所有内容,欢迎指出代码错误部分!!!
// @FileName :10Chuan.c
// @Time :2023/8/15 21:10
// @Author :YKW
#include
#include
#include
#include
#define MAXLEN 255
//本文件数组下标从1开始,舍弃0位
//顺序存储
//静态数组实现/定长顺序存储
typedef struct Node{
int data;
struct Node* next;
}Node;
typedef struct{
char ch[MAXLEN];
int length;
}SString;
//动态数组实现/堆分配存储
typedef struct{
char *ch;
int length;
}HString;
/*
HString S;
S.ch=(char*)malloc(MAXLEN*sizeof(char));
S.length=0;
free(S)
*/
//链式存储
typedef struct StringNode{//存储密度低
char ch;//(如果设置成字符串大小1B->4B)
struct StringNode* next;//(大小4B)
}StringNode,*String;
int Strlength(SString S){
return S.length;
}
//用Sub返回串S的第pos个字符起长度为len的字串
bool SubString(SString *Sub,SString S,int pos,int len){
if(pos+len-1>=S.length)
return false;
for (int i=pos;ich[i-pos+1]=S.ch[i];
Sub->length=len;
return true;
}
//若S>T,返回>0
int StrCompare(SString S,SString T){
for (int i;i<=S.length&&i<=T.length;i++)
{
if (S.ch[i]!=T.ch[i])
return S.ch[i]-T.ch[i];
}
}
//定位操作,若S存在T字串,返回第一次位置,否则为0;
int Index(SString S,SString T){
int i=1,n=Strlength(S),m=Strlength(T);
SString sub;
while(i<=n-m+1){
SubString(&sub,S,i,m);
if(StrCompare(sub,T)!=0)
++i;
else
return i;
}
}
//朴素模式匹配算法
int Index2(SString S,SString T){
int i=1,j=1;
while(i<=S.length&&j<=T.length){
if(S.ch[i]==T.ch[j]){
i++;j++;
}
else {//匹配失败
i = i - j + 2;//i后移
j = 1;//T会到0位置
}
}
if(j>T.length)
return i-T.length;
else
return 0;
}
//KMP算法(i不回溯):先求next数组,优化版nextval数组
/*
前缀:字符串A和B,A=B+S,S非空,则B为A的前缀
后缀:字符串A和B,A=S+B,S非空,则B为A的后缀
PMT值:前缀集合和后缀集合的交集中,最长元素的长度
prefix:每一个下标位置对应一个PMT值,组成的数组
next:prefix向右移一个下标位置,组成的next数组
*/
int Next(SString T,int *next){
next[0]=-1;
int i=0,j=-1;//i后缀,j前缀
while(iT.length)
return i-T.length;//匹配成功
return 0;
}
int Index4(SString S,SString T){
for (int i=1;i<=T.length;i++){//对T每个字符,先找到0号字符所有索引,再在这些里面找到1号字符......
char c=T.ch[i];
Node *all=(Node*)malloc(sizeof(Node));
all->data=0;
all->next=NULL;
for (int i=1;idata=i;
new->next=NULL;
all->next=new;
all=new;
}
for (int i=0;i