学习目标:
总复习数据结构:串、数组
为备考划重点自用,不喜勿喷。
一、串的定义和实现
1.串中字符的个数称为串的长度。n=0时的串成为空串(用表示)。
2.串中任意个连续的字符组成的子序列称为该串的子串,包含子串的串成为主串。
3.子串在主串中的位置以子串的第一个字符在主串中的位置来表示。
4.串的定长顺序存储表示:
typedef struct
{
char ch[maxsize];
int length;//串的实际长度
}sstring;
5.串的块链存储表示:
typedef struct Lstring
{
char ch[maxsize];
struct Lstring *next;
}Lstring;
类似于线性表的链式存储结构,每个结点既可存放一个字符,也可存放多个字符,每个结点称为块。最后一个结点占不满时通常用“#”补上。
6.串的基本操作:
1.int StringAssign(string *S, char chs[])
//生成一个其值等于字符串常量chs的串S
2.void StringCopy(string *S1, string *S2)
//将串S2复制到串S1
3.int LengthString(string *S)
//求串S的长度
4.int StringCompare(string *S1, string *S2)
//比较串S1和串S2 ,若S1=S2返回0;若S1>S2,返回1;若S1 < S2,返回-1
5.int ConcatString(string *S, string *S1, string *S2)
//用S返回由S1和S2连接而成的新串
6.int SubString(string *Sub, string *S, int pos, int len)
//用Sub返回串S的第pos个字符起长度为len的子串
7.int StrInsert(string *S1, int pos, string *S2)
//在串S1的第pos个字符之前插入串S2
8.int StrDelete(string *S, int pos, int len)
//从串S中删除第pos个字符起长度为len的子串
9.int Index(string *S, string *T,int pos)
//返回子串T在主串S中第pos个字符之后的位置,若不存在,返回0
二、串的模式匹配
1.简单的模式匹配算法
定长顺序存储结构
int index(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;
j=1;
}
}
if(j>t.length)
return i-t.length;
else
return 0;
}
三、数组
四、习题
1.在文本编辑程序中,查找某一特定单词在文本中出现的位置,可以利用串的()运算
【解答】模式匹配
2.设有两个串p和q,其中q是p的子串,求q在p中首次出现的位置的算法称为( )。
A.求子串 B.联接 C.匹配 D.求串长
【解答】C
3.数组通常只有两种运算:()和(),这决定了数组通常采用()结构来实现存储。
【解答】存取,修改,顺序存储
【分析】数组是一个具有固定格式和数量的数据集合,在数组上一般不能做插入、删除元素的操作。除了初始化和销毁之外,在数组中通常只有存取和修改两种操作
4.将数组称为随机存取结构是因为( )
A 数组元素是随机的
B 对数组任一元素的存取时间是相等的
C 随时可以对数组进行访问
D 数组的存储结构是不定
【解答】B
5.下面( )不属于特殊矩阵。
A对角矩阵 B三角矩阵 C稀疏矩阵 D对称矩阵
【解答】C
6.假设以行序优先将一个n阶的3对角矩阵压缩存储到一维数组Q中,则数组Q的大小至少为()
【解答】 3n-2
【分析】第1行和第n行是2个非零元素,其余每行的非零元素都要是3个,则需存储的元素个数为3n-2。
思考:假设以行序优先将一个n阶的5对角矩阵压缩存储到一维数组Q中,则数组Q的大小至少为?(5n-6)
7.二维数组A的每个元素是由6个字符组成的串,行下标的范围从0~8,列下标的范围是从0~9,则存放A至少需要( )个字节,A的第8列和第5行共占( )个字节,若A按行优先方式存储,元素A[8][5]的起始地址与当A按列优先方式存储时的()元素的起始地址一致。
A90 B 180 C 240 D540 E 108 F114 G54
H A[8][5] I A[3][10] J A[5][8] K A[4][9]
【解答】D,E,K
【分析】数组A为9行10列,共有90个元素,所以,存放A至少需要90×6=540个存储单元;第8列和第5行共有18个元素(注意行列有一个交叉元素),所以,共占108个字节;元素A[8][5]按行优先存储的起始地址为d+8×10+5=d+85,设元素A[i][j]按列优先存储的起始地址与之相同,则d+j×9+i=d+85,解此方程,得i=4,j=9。
8.设二维数组A的维数界偶定义为[1‥8,0‥10],起始地址为LOC,每个元素占2L个存储单元,以行序为主序存储方式下,某数据元素的地址为LOC+50L,则在列序为主序存储方式下,该元素的存储地址为( )。A.LOC+28L B.LOC+36L C.LOC+50L D.LOC+52L
【解答】D
【分析】若行下标从1开始,列下标从0开始。
按行序为主:
LOC[aij]=LOC[a00]+[(i-1)´n+j]´2L,
i=1,..8; j=0,1, …,10。
由题意知道:(i-1)´11+j=25,因此 i=3, j=3。
按列序为主,LOC[aij]=LOC[a11]+[j´m+(i-1)]´2L,Loc[a33]=LOC+(3´8+2) ´ 2L
9.串是一种特殊的线性表,其特殊性体现在()。
A.可以顺序存储
B.数据元素是一个字符
C.可以链接存储
D.数据元素可以是多个字符
【解答】B