【数据结构】学习笔记之串

目录

一、串概述

二、串的基本运算

三、串的存储结构

3.1 静态存储分配的顺序串

3.2 动态存储分配的顺序串

3.3 串的链式存储

四、串运算的实现

4.1 顺序串上的子串定位运算

4.2 链串上的子串定位运算


一、串概述

        串:是由零个或多个字符组成的有限序列;包含字符的个数称串的长度;
        空串:长度为零的串称空串;     空白串:由一个或多个空格组成的串称空白串;
        子串:串中任意个连续字符组成的子序列称该串的子串;    主串:包含子串的串称主串;
        子串的首字符在主串中首次出现的位置定义为子串在主串中的位置;
        空串是任意串的子串;  任意串是自身的子串;
        串常量在程序中只能引用但不能改变其值; 串变量取值可以改变;

二、串的基本运算


1) int strlen(char *s);求串长。
2) char *strcpy(char * to,char * from);串复制。
3) char *strcat(char * to,char * from);串联接。
4) int strcmp(char *s1,char *s2);串比较。
5) char *strchr(char *s,char c);字符定位。

三、串的存储结构


        串的顺序存储:串的顺序存储结构称顺序串。按存储分配不同分为:


3.1 静态存储分配的顺序串


        直接用定长的字符数组定义,以“\0”表示串值终结。

#define maxstrsize 256
typedef char seqstring[maxstrsize];
seqstring s;
不设终结符,用串长表示。
Typedef struct{
 Char ch[maxstrsize];
 Int length;
}seqstring;

        以上方式的缺点是:串值空间大小是静态的,难以适应插入、链接等操作。


3.2 动态存储分配的顺序串

简单定义:typedef char * string;
复杂定义:typedef struct{
   char *ch;
   int length;
  }hstring;


3.3 串的链式存储

        串的链式存储结构称链串。链串由头指针唯一确定。类型定义:

typedef struct node{
 char data;
 struct node *next;
}linkstrnode;
typedef linkstrnode *linkstring;
linkstring s;

        将结点数据域存放的字符个数定义为结点的大小。结点大小不为1的链串类型定义:

Int naivestrmatch(seqstring t,seqstring p)
{
 int i,j,k;
 int m=p.length;
 int n=t.length;
 for(i=0;i<=n-m;i++){
  j=0;k=i;
  while(j<m&&t.ch[k]==p.ch[j]){
   j++;k++;
  }
  if (j==m) return i;
 }
 return –1;
}


四、串运算的实现


4.1 顺序串上的子串定位运算


        1)子串定位运算又称串的模式匹配或串匹配。主串称目标串;子串称模式串。
        2)朴素的串匹配算法。时间复杂度为O(n^2)。比较的字符总次数为(n-m+1)m。

Int naivestrmatch(seqstring t,seqstring p)
{
 int i,j,k;
 int m=p.length;
 int n=t.length;
 for(i=0;i<=n-m;i++){
  j=0;k=i;
  while(j<m&&t.ch[k]==p.ch[j]){
   j++;k++;
  }
  if (j==m) return i;
 }
 return –1;
}


4.2 链串上的子串定位运算

        时间复杂度为O(n^2)。比较的字符总次数为(n-m+1)m。

Linkstrnode * lilnkstrmatch(linkstring T, linkstring P)
{
 linkstrnode *shift, *t, *p;
 shift=T;
 t=shift;p=P;
 while(t&&p){
  if(t->data==p->data){
t=t->next;
   p=p->next;
   }
  else{
   shift=shift->next;
   t=shift;
   p=P;
   }
 }
 if(p==NULL)
  return shift;
 else
  return NULL;
}

猜你喜欢

转载自blog.csdn.net/xiaoyingxixi1989/article/details/143098005