前言: 本系列是笔者暑假自学数据结构的笔记整理而来,共126页,3w+字。现在正式开学上课,补充老师所讲内容,并且仔细勘误,根据老师的教学进度分章节发布在上。 教材使用的是王红梅等所著的数据结构——从概念到C++实现(第三版)。 暑假自学时期主要参考的网课: 青岛大学-王卓 武汉大学-李春葆
目录
串定义与概念基本运算串的模式匹配
数组定义与概念稀疏矩阵基本运算
十字链表广义表
串
定义与概念
基本运算
类似的,串可分为两类—顺序串和链串。而串的顺序存储又有两种方法:1.每个单元(例如4字节)只存一个字符,称为非紧缩格式,其存储密度小。2.每个单元存放多个字符,称为紧缩格式,其存储密度大。我们一般讨论前者。
#define MAXSIZE 100
typedef struct
{
char data
[MAXSIZE
];
int length
;
}SqString
;
顺序串中实现串的基本运算与顺序表的基本运算类似,详细算法见教材。 Eg: 实现Strcmp(s1, s2):
int Strcmo(SqString s
, SqString t
)
{
int i
, len
;
len
= s
.length
<= t
.length
?s
.length
:t
.length
;
for (i
= 0; i
< len
; i
++)
{
return (s
.data
[i
]>t
.data
[i
]) && (s
.data
[i
] != t
.data
[i
])?1:-1;
}
if (s
.length
== t
.length
)
{
return 0;
}
else
{
return s
.length
> t
.length
?1:-1;
}
}
链串的组织形式与一般的链表类似。 链串中的一个节点可以存储多个字符。通常将链串中每个节点所存储的字符个数称为节 点大小,链串不一定只能采用单链表,要依据情况而定。如果需要从某个节点出发前后查找,可以采用双链表,如果需要快速查找尾结点,可以采用循环双链表。 我们一般只考虑节点大小为1的链串,定义如下:
typedef struct snode
{
char data
;
struct snode
*next
;
}LiString
;
同样的,链串中实现串的基本运算与单链表的基本运算类似,详细算法见教材。
串的模式匹配
这部分内容请参看我的另一篇文章: 【数据结构】串模式匹配及KMP算法详解——看不懂来砍我
一些习题 1.str=”Software”,其子串个数? 解:如果原串没有重复元素,那么子串共n(n+1)/2+1
数组
定义与概念
优先存储压缩 一个习题: 若将n阶上三角矩阵A按列优先顺序存储压缩存放在一维数组B[1…n(n+1)/2]中,A中第一个非零元素a11 存放于B数组的b1中,则应存放到bk中的非零元素aij的下标i、j与k的对应关系是? 解:1~j-1列的元素个数是:j(j-1)/2,第j列aij之前的元素个数:i-1,故k= j(j-1)/2+ i-1 +1 = j(j-1)/2+i。
稀疏矩阵
一个阶数较大的矩阵中的非零元素个数s相对于矩阵元素的总个数t十分小,即s<<t时,称该矩阵为稀疏矩阵。 稀疏矩阵的压缩存储办法是只存储非零元素,稀疏矩阵中的每一个非零元素需由一个三元组 唯一确定,稀疏矩阵中的左右非零元素构成三元组线性表。
基本运算
#define MAXSIZE 100
#define ElemType int
typedef struct
{
int r
;
int c
;
ElemType d
;
}TupNode
;
typedef struct
{
int rows
;
int cols
;
int nums
;
TupNode data
[MAXSIZE
];
}TsMatrix
;
void CreateMat(TsMatrix
&t
, ElemType A
[M
][N
])
{
int i
, j
;
t
.rows
= M
;
t
.cols
= N
;
t
.nums
= 0;
for (i
= 0; i
< M
; i
++)
{
for (j
= 0; j
< N
; j
++)
{
if (A
[i
][j
] != 0)
{
t
.data
[t
.nums
].r
= i
;
t
.data
[t
.nums
].c
= j
;
t
.data
[t
.nums
].d
= A
[i
][j
];
t
.nums
++;
}
}
}
}
bool
Value(TsMatrix
&t
, ElemType x
, int i
, int j
)
{
int k
= 0, k1
;
if (i
>= t
.rows
|| j
>= t
.cols
)
{
return false
;
}
while (k
< t
.nums
&& i
> t
.data
[k
].r
)
{
k
++;
}
while (k
< t
.nums
&& i
== t
.data
[k
].r
&& j
> t
.data
[k
].c
)
{
k
++;
}
if (t
.data
[k
].r
== i
&& t
.data
[k
].c
== j
)
{
t
.data
[k
].d
= x
;
}
else
{
for (k1
= t
.nums
- 1; k1
>= k
; k1
--)
{
t
.data
[k1
+ 1].r
= t
.data
[k1
].r
;
t
.data
[k1
+ 1].c
= t
.data
[k1
].c
;
t
.data
[k1
+ 1].d
= t
.data
[k1
].d
;
}
t
.data
[k
].r
= i
;
t
.data
[k
].c
= j
;
t
.data
[k
].d
= x
;
t
.nums
++;
}
return true
;
}
bool
Assign(TsMatrix t
, ElemType
&x
, int i
, int j
)
{
int k
= 0;
if (i
>= t
.rows
|| j
>= t
.cols
)
{
return false
;
}
while (k
< t
.nums
&& i
> t
.data
[k
].r
)
{
k
++;
}
while (k
< t
.nums
&& i
== t
.data
[k
].r
&& j
> t
.data
[k
].c
)
{
k
++;
}
if (t
.data
[k
].r
== i
&& t
.data
[k
].c
== j
)
{
x
= t
.data
[k
].d
;
}
else
{
x
= 0;
}
return true
;
}
void DispMat(TsMatrix t
)
{
if (t
.nums
<= 0)
{
return;
}
cout
<< "\t" << t
.rows
<< "\t" << t
.cols
<< "\t" << t
.nums
;
cout
<< "-------------------------------------------";
for (int i
= 0; i
< t
.nums
; i
++)
{
cout
<< "\t" << t
.data
[i
].r
<< "\t" << t
.data
[i
].c
<< "\t" << t
.data
[i
].d
;
}
}
void TranTat(TsMatrix t
, TsMatrix
&tb
)
{
int p
, q
= 0, v
;
tb
.rows
= t
.cols
;
tb
.cols
= t
.rows
;
tb
.nums
= t
.nums
;
if (t
.nums
!= 0)
{
for (v
= 0; v
< t
.cols
; v
++)
{
for (p
= 0; p
< t
.nums
; p
++)
{
if (t
.data
[p
].c
== v
)
{
tb
.data
[q
].r
= t
.data
[p
].c
;
tb
.data
[q
].c
= t
.data
[p
].r
;
tb
.data
[q
].d
= t
.data
[p
].d
;
q
++;
}
}
}
}
}
十字链表
特殊矩阵压缩存储后仍具有随机存取特性,但一个稀疏矩阵采用压缩后,和直接采用二维数组存储相比会失去随机存取特性。
广义表
以上 如果此篇博客对您有帮助欢迎点赞与转发 有疑问请留言或私信 2020/10/3