串知识点详解(数据结构,严蔚敏版)

1.堆分配存储表示(也是一种顺序表)

typedef struct{
	char *ch;
	int length;
}HString;

2.串操作函数


//初始化一个串
void InitalStr(HString &T);
//生成一个其值等于串常量chars的串T.
void StrAssign(HString &T, char *chars);
//返回串的长度
int StrLength(HString &T);
//比较串大小,从第一个开始比较,若T>S返回>0,若S=T 返回0;若T

3.函数实现

#include
#include
#include"HStringOp.h"
//初始化一个串
void InitalStr(HString &T){
	T.ch = NULL;
	T.length = 0;
}

//生成一个其值等于串常量chars的串T.
void StrAssign(HString &T,char *chars){
	int i = 0,j=0;
	char *c;
	if (T.ch)free(T.ch);
	for (i = 0, c = chars; *c; ++i, ++c);
	if (!i)
	{
		T.ch = NULL;
		T.length = 0;
	}
	else
	{
		if (!(T.ch = (char *)malloc(i*sizeof(char))))exit;
		while (jS返回>0,若S=T 返回0;若T T.length)return 0;
	if (Sub.ch)free(Sub.ch);
	if (T.length<(pos+len-1))Sub.length = T.length - pos + 1;
	else  Sub.length = len;
	
	Sub.ch = (char *)malloc(Sub.length*sizeof(char));
	for (int i = 0; i < Sub.length; i++)
	{
		Sub.ch[i] = T.ch[i + pos-1];
	}
	return 1;
}


4.子串位置定位一般算法,返回第pos个字符后子串的位置

int pos_substr(HString &F,HString &S,int pos){
	int i = pos, j = 0;
	int Flength = StrLength(F);
	int Slength = StrLength(S);
	if (Slength+pos>Flength)
	{
		return 0;
	}
	while (i=Slength)return i+1 - Slength;
	else  return 0;
}


5.KMP算法

(1)求next函数

//next函数求值
void get_next(HString &S,int *p){
	int i = 0, j = 0;
	i = 0; *p = 0;
	while (i


求next函数改进算法

//KMP模式匹配改进算法
void get_nextval(HString &S, int *p){
	int i = 0, j = 0;
	i = 0; *p = 0;
	while (i < S.length - 1)                //书中T[0]存放的是字符串的长度,我们这里T[0]也属于字符串的内容
	{
		if (j == 0 || S.ch[i] == S.ch[j - 1]){
			i++; j++;
			if (S.ch[i]!=S.ch[j-1])
			{
				p[i] = j;
			}
			else{
				p[i] = p[j-1];
			}
		}
		else
		{
			j = p[j - 1];
		}
	}
}

(2)KMP实现定子串位置函数

//KMP模式匹配算法
int Index_KMP(HString T,HString S,int pos,int *p){
	int i = pos, j = 0;
	while (i=T.length)
	{
		return i - T.length+1;
	}
	else
	{
		return 0;
	}
}





你可能感兴趣的:(C,数据结构)