数据结构之串的存储结构

本节学习脉络

  • 串的存储结构
  • 串的模式匹配算法

1.串的存储结构

数据结构之串的存储结构_第1张图片

  • 串的定长顺序存储表示

数据结构之串的存储结构_第2张图片

//定长顺序存储表示结构体定义如下:
typedef struct
{
     
   char str[maxsize+1];
   int length;
 }str;
 //maxsize为已经定义的常量,表示串的最大长度,str数组长度定义为maxsize+1是因为多出一个‘\0’作为结束标记
  • 串的变长分配存储表示

    即动态分配存储表示,特点是在程序执行过程中根据需要动态分配。这种存储方式在使用时需要用函数malloc()来分配一个长度为length,类型为char型的连续存储空间,分配的空间可以用函数free()释放掉。用函数malloc()分配存储空间如果成功,则返回一个指向起始地址的指针,作为串的基地址,这个地址由ch指针指向,如果分配失败,则返回NULL。

//其结构体定义如下:
typedef struct
{
     
  char *ch;  //指向动态分配存储区首地址的字符指针
  int length;//串长度
}str;
  • 串的链式存储表示

数据结构之串的存储结构_第3张图片

  • 基于顺序存储的一些常用基本操作

数据结构之串的存储结构_第4张图片

数据结构之串的存储结构_第5张图片
数据结构之串的存储结构_第6张图片

数据结构之串的存储结构_第7张图片
数据结构之串的存储结构_第8张图片

2.串的模式匹配算法

数据结构之串的存储结构_第9张图片

数据结构之串的存储结构_第10张图片

数据结构之串的存储结构_第11张图片
数据结构之串的存储结构_第12张图片
数据结构之串的存储结构_第13张图片
数据结构之串的存储结构_第14张图片
数据结构之串的存储结构_第15张图片
附上代码

//第一种方法
#include  
 
//pos是从1开始的一个下标
int index_force(char * s, char * t)
{
     
 
   int i=0;
    int j=0;
    while(s[i]!='\0' && t[j]!='\0') {
     	//主串或者模式串遍历完成
        if(s[i]==t[j]) {
     				//如果主串和模式串对应位置的值相等,则比较后面的字符
            ++i;
            ++j;
        }
        else {
     							//如果不相等,则模式串需要回朔到第一个字符,而主串则从下一个字符开始
            i=i-j+1;
            j=0;
        }
    }
    if(t[j]=='\0') {
     					//如果循环是由于模式串遍历完了而结束的,说明找到了对应子串的位置
        return i-j+1;
    }
    else  {
     								//否则,主串不包含模式串
        return 0;
    }
}
int main (void){
     						//用于测试的主函数 
	char *p="abcdefgh";					//主串 
	char *q="fg";						//模式串 
	int index;
	index=index_force(p,q);
	printf("%d\n",index);				//输出结果 
}

//第二种方法
#include 
#include 

int  index (char S[],char T[]){
     
     int  i=1,j=1;//下标从1开始
     int  lenS,lenT; 
     lenS=strlen(S)-1;//主串S实际长度
     lenT=strlen(T)-1;//子串T实际长度

     while ( i<=lenS && j<=lenT ){
     //i
        if ( S[i] == T [j] ){
     //若两字符相等,则匹配下一位
                ++i;
                ++j;
        }
        else //S[i] != T[j] 两字符不相等
        {
     
                i=i-(j-1)+1; //主串回到上次匹配的下一位
                j=1; //子串从头开始匹配
                //注: j-1 是这次循环中 主串较起始位置移动的字符数量 i-(j-1) 即这次循环的主串字符初始的位置 i-(j-1)+1 即下一次循环开始i的位置
        }
     }
    if ( j>lenT )  return i-lenT; //若j超出子串的下标 匹配成功
    else return 0; //否则 匹配失败
}
int main()
{
     
    char S[]=" Mynameisbruceforce";//主串
    char T[]=" bruce";//子串
    int pos; //位置
    pos = index(S,T);
    printf("%d",pos);
    return 0;

}

这节的内容就整理完毕,之后会更新KMP算法(串的最后一讲哦!)2020.9.21.

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