1.串:是由零个或多个字符组成的有限序列;包含字符的个数称串的长度;
2.空串:长度为零的串称空串;
空白串:由一个或多个空格组成的串称空白串;
子串:串中任意个连续字符组成的子序列称该串的子串;
主串:包含子串的串称主串;
子串的首字符在主串中首次出现的位置定义为子串在主串中的位置;
3.空串是任意串的子串;
任意串是自身的子串;
串常量在程序中只能引用但不能改变其值;
串变量取值可以改变;
4.串的基本运算
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);字符定位。
5.串的存储结构:
(1)串的顺序存储:串的顺序存储结构称顺序串。
按存储分配不同分为:
1) 静态存储分配的顺序串:
直接用定长的字符数组定义,以“/0”表示串值终结。
#define maxstrsize 256
typedef char seqstring[maxstrsize];
seqstring s;
不设终结符,用串长表示。
Typedef struct{
Charch[maxstrsize];
Intlength;
}seqstring;
以上方式的缺点是:串值空间大小是静态的,难以适应插入、链接等操作。
2) 动态存储分配的顺序串:
//简单定义:
typedef char * string;
//复杂定义:
typedef struct{
char *ch;
int length;
}hstring;
(2)串的链式存储:串的链式存储结构称链串。链串由头指针唯一确定。
类型定义:
typedef struct node{
chardata;
struct node *next;
}linkstrnode;
typedef linkstrnode *linkstring;
linkstring s;
将结点数据域存放的字符个数定义为结点的大小。结点大小不为1的链串类型定义:
#define nodesize 80
typedef struct node{
chardata[nodesize];
struct node * next;
}linkstrnode;
6.串运算的实现
(1)顺序串上的子串定位运算。
1)子串定位运算又称串的模式匹配或串匹配。主串称目标串;子串称模式串。
2)朴素的串匹配算法。时间复杂度为O(n^2)。比较的字符总次数为(n-m+1)m。
int naivestrmatch(seqstring t, seqstring p)
{
inti, j, k;
intm = p.length;
intn = 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;
}
(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;
}
7.多维数组:一般用顺序存储的方式表示数组。
8.常用方式有:
1)行优先顺序,将数组元素按行向量排列;
2)列优先顺序,将数组元素按列向量排列。
9.计算地址的函数:LOC(Aij)=LOC(Ac1c2)+((i-c1)*(d2-c2+1)+j-c2)*d
10.矩阵的压缩存储:为多个非零元素分配一个存储空间;对零元素不分配存储空间。
(1)对称矩阵:在一个n阶的方阵A中,元素满足Aij=Aji 0<=i,j<=n-1;称为对称矩阵。
元素的总数为:n(n+1)/2;
设:I=i或j中大的一个数;J=i或j中小的一个数;
则:k=I*(I+1)/2+J;
地址计算:LOC(Aij)=LOC(sa[k])=LOC(sa[0])+k*d= LOC(sa[0])+ (I*(I+1)/2+J )*d
(2)三角矩阵:以主对角线划分,三角矩阵有上三角和下三角;上三角的主对角线下元素均为常数c;下三角的主对角线上元素均为常数c。
元素总数为:(n(n+1)/2)+1;
以行优先顺序存放的Aij与SA[k]的关系:
上三角阵:k=i*(2n-i+1)/2+j-i;
下三角阵:k=i*(i+1)/2+j;
(3)对角矩阵:所有的非零元素集中在以主对角线为中心的带状区域,相邻两侧元素均为零。|i-j|>(k-1)/2
以行优先顺序存放的Aij与SA[k]的关系:k=2i+j;
11.稀疏矩阵:当矩阵A中有非零元素S个,且S远小于元素总数时,称为稀疏矩阵。
对其压缩的方法有顺序存储和链式存储。
(1)三元组表:将表示稀疏矩阵的非零元素的三元组(行号、列号、值)按行或列优先的顺序排列得到的一个结点均是三元组的线性表,将该表的线性存储结构称为三元组表。其类型定义:
#define maxsize 10000
typedef int datatype;
typedef struct{
inti, j;
datatype v;
}trituplenode;
typedef struct{
trituplenode data[maxsize];
intm, n, t;
}tritupletable;
(2)带行表的三元组表:在按行优先存储的三元组表中加入一个行表记录每行的非零元素在三元组表中的起始位置。类型定义:
#define maxrow 100
typedef struct{
tritulpenode data[maxsize];
introwtab[maxrow];
intm, n, t;
}rtritulpetable;
12.广义表:是线性表的推广,广义表是n个元素的有限序列,元素可以是原子或一个广义表,记为LS。
13.若元素是广义表称它为LS的子表。若广义表非空,则第一个元素称表头,其余元素称表尾。
14.表的深度是指表展开后所含括号的层数。
15.把与树对应的广义表称为纯表,它限制了表中成分的共享和递归;
16.允许结点共享的表称为再入表;
17.允许递归的表称为递归表;
18.相互关系:线性表∈纯表∈再入表∈递归表;
19.广义表的特殊运算:
1)取表头head(LS);
2)取表尾tail(LS);