数据结构之串学习笔记(一)

一.c语言中的串

    在很多高级语言中,都含有串这一数据类型,而c语言中并没有所谓’串‘’这一数据类型,在c语言中,串为一种特殊的线性表,其数据元素仅由字符构成。要有效实现字符串的处理,就要根据实际情况使用合适的存储结构。

   书上有这么一句话:数组可以看成线性表在“表中数据元素本身也是一个数据结构”这一含义下的拓展,如何理解这句话?线性表是具有相同数据类型的n个数据元素的有限序列,有唯一的表头和表尾元素,除表头外每个元素有唯一前驱,除表尾外每个元素有唯一后继。在一维数组中,与线性表类似,元素按顺序排列,每个元素数据类型相同,,而当数组为二维或多维时,,如int a[3][4],就可以看成一个包含三个元素的线性表,而每个元素又为一个包含四个整数的一维数组,更高维则是对这种关系的进一步嵌套和拓展。

二.串的存储实现

   数据的存储方式由以下四种:顺序存储,连接存储,索引存储,散列存储。下面我们来看串的存储方式。

(一)顺序存储

  用顺序存储的串称为顺序串,字符被依次存放在一片连续的空间中,可以这样描述:

#define maxsize 100
typedef struct{
char ch[maxsize];
int len;
}SeqList;

(二).链式存储

  串采用链式存储称为链串,描述方法如下:

typedef struct linknode{
char data;
struct linknode* next;
}linkstring;

  使用链式存储的优点在于插入和删除操作方便,但是由于指针域的存在,导致空间利用率低,即存储密度低,比如一个节点中字符占一个字节,而指针可能就占到四个字节,这样存储密度只有百分之二十。

(三).索引存储

 这里是全书第一次使用索引存储,索引存储顾名思义即建立一个索引表,方便对元素进行快速查找。下面介绍了三种索引表:

1.带长度的索引表

  书上的代码如下:

#define maxsize 1024
typedef struct{
char name[maxsize];
int length;
char *stadr;
}LenNode;

  这里书上讲的很简略,我们可以联系图书馆的例子来理解,比如一排书架中有很多书,我们如何快速找到一本书呢?首先我们要知道一本书的名字对吧,这就是char name[maxsize],接着我们存入它占的空间大小,即int length,最后我们再记录它的位置,即char* stadr,这样一本书的信息就被记录下来了,接着我们将这一节点作为单独的数据类型,再用前面线性表的知识建表即可。

2.带末指针的索引表

  同样代码如下:

#define maxsize 1024
typedef struct{
char name[maxsize];
char* stadr,*enadr;
}endnode;

 原理与上面类似,只是用一个尾指针代替了字符串长度,与带长度的索引表相比操作更加方便,但占用的空间也较大。

3.带特征位的索引表

  代码如下:

#define maxsize 1024
typedef struct{
char name[maxsize];
int tag;
union{
char *stadr;
char value[4];
}uval;
}tagnode;

  有些串的大小可能小于4个字节,这时我们不妨设置一个联合体变量uval,开辟一个四个字节大小的空间,当串的大小大于四个字节,就存储其首元素的地址,当小于四个字节,则直接将它储存再联合体变量内部,由于联合体成员共用一个变量,这样即节约了存储空间又提高了搜索效率,不过我们这时需设置一个标签tag,用来标识uval内部存储的是字符串还是指针,如用0表示存储的为字符串,1表示存储的为指针。

   书上简单介绍了动态内存分配,核心即是使得多个串共用一片内存空间,而无需每次新开辟一个最大空间,这里用了一个指针表示各个串的首地址,内容相对简单,相信大家都能看懂。

你可能感兴趣的:(数据结构,学习,笔记)