串的动态存储结构
一 串的动态存储结构分为两种。一种是链式存储结构,另一种是被称为堆结构的存储方式
1链式存储结构
如果说每个节点只存储一个字符串的话,就会耗费大量的空间,因为一个节点中还有一个指针。于是在每个节点中存放若干个字符,形成字符块,再把这些块连在一起,这样的链式结构也被称为块链结构,这样会比较节省存储空间,但是操作不
链式存储结构的描述,以一个节点一个字符为例
typedef struct node
{
char data;
struct node* next;
}snode,*stlink;
链式存储结构的基本操作如下
(1) 前插操作
slink Sinsert(stlink s, int i, slink t) //将串t插到串s的i节点之前
{
if (i < 0)
{
return NULL;
}
if (t = NULL)
{
return s;
}
if (s = NULL)
{
return t;
}
stlink p, q;
p = s;
int j;
for (j = 0; j < i; j++)
{
p = p->next;
}
q = p->next;
p->next = t;
while (p->next)
{
p = p->next;
}
p->next = q;
return s;
}
(2)删除操作
stlink Sinsert(stlink s, int i,int len) //从i节点起,删除len长度的字符串
{
if (i < 0)
{
return NULL;
}
stlink p;
stlink q;
stlink r;
int j;
p = s;
for (j = 0; j < i; j++) //找到节点的前一个节点
{
p = p->next;
}
q = p;
for (j = 0; j < len; j++) //找到要删除的节点指针
{
p = p->next;
}
if (i == 0) //如果从头删除的话,S的指向就要改变
{
r = q;
s->next = q->next;
}
else
{
r = q->next;
q->next = p->next;
}
while (r!=p) //循环释放内存
{
q = r;
r = r->next;
free(r);
}
return s;
}
3 判断串大小的操作
int Compare(stlink s, stlink t)
{
int d = 0;
stlink p, q;
p = s;
q = t;
while (p&&q)
{
p = p->next;
q = q->next;
d = p->data - q->data;
if (d != 0)
{
break;
}
}
if (p == NULL&q != NULL) //q是Q的前缀
{
return -1;
}
else if (p != NULL&&q == NULL) //q是p的前缀
{
return 1;
}
else
{
return d;
}
}