链串
数据声明
typedef struct snode
{
char data;
struct snode *next;
} LinkStrNode;
生成串
void StrAssign(LinkStrNode *&s, char cstr[])
{
int i;
LinkStrNode *r, *p;
s = (LinkStrNode *)malloc(sizeof(LinkStrNode));
r = s;
for (i = 0; cstr[i] != '\0'; i++)
{
p = (LinkStrNode *)malloc(sizeof(LinkStrNode));
p->data = cstr[i];
r->next = p;
r = p;
}
r->next = NULL;
}
销毁串
void DestroyStr(LinkStrNode *&s)
{
LinkStrNode *pre = s, *p = s->next;
while (p != NULL)
{
free(pre);
pre = p;
p = pre->next;
}
free(pre);
}
串的复制
void StrCopy(LinkStrNode *&s, LinkStrNode *t)
{
// p用于遍历t
// q用于存结点
// r用于尾插
LinkStrNode *p = t->next, *q, *r;
s = (LinkStrNode *)malloc(sizeof(LinkStrNode));
r = s;
while (p != NULL)
{
q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data = p->data;
r->next = q;
r = q;
p = p->next;
}
r->next = NULL;
}
串相等
bool StrEqual(LinkStrNode *s, LinkStrNode *t)
{
LinkStrNode *p = s->next, *q = t->next;
while (p != NULL && q != NULL && p->data == q->data)
{
p = p->next;
q = q->next;
}
if (p == NULL && q == NULL)
return true;
else
return false;
}
求串长
int StrLength(LinkStrNode *s)
{
int i = 0;
LinkStrNode *p = s->next;
while (p != NULL)
{
i++;
p = p->next;
}
return i;
}
串连接
LinkStrNode *Concat(LinkStrNode *s, LinkStrNode *t)
{
// p用于遍历s与t
// q用于存结点
// r用于尾插
LinkStrNode *str, *p = s->next, *q, *r;
str = (LinkStrNode *)malloc(sizeof(LinkStrNode));
r = str;
while (p != NULL)
{
q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data = p->data;
r->next = q;
r = q;
p = p->next;
}
p = t->next;
while (p != NULL)
{
q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data = p->data;
r->next = q;
r = q;
p = p->next;
}
r->next = NULL;
return str;
}
求子串
LinkStrNode *SubStr(LinkStrNode *s, int i, int j)
{
int k;
LinkStrNode *str, *p = s->next, *q, *r;
str = (LinkStrNode *)malloc(sizeof(LinkStrNode));
str->next = NULL;
r = str;
if (i <= 0 || i > StrLength(s) || j < 0 || i + j - 1 > StrLength(s))
return str;
for (k = 1; k < i; k++)
p = p->next;
for (k = 1; k <= j; k++)
{
q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data = p->data;
r->next = q;
r = q;
p = p->next;
}
r->next = NULL;
return str;
}
插入子串
LinkStrNode *InsStr(LinkStrNode *s, int i, int j, LinkStrNode *t)
{
int k;
LinkStrNode *str, *p = s->next, *p1 = t->next, *q, *r;
str = (LinkStrNode *)malloc(sizeof(LinkStrNode));
str->next = NULL;
r = str;
if (i <= 0 || i > StrLength(s) + 1)
return str;
for (k = 1; k < i; k++)
{
q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data = p->data;
r->next = q;
r = q;
p = p->next;
}
while (p1 != NULL)
{
q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data = p1->data;
r->next = q;
r = q;
p1 = p1->next;
}
while (p != NULL)
{
q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data = p->data;
r->next = q;
r = q;
p = p->next;
}
r->next = NULL;
return str;
}
LinkStrNod
删除子串
LinkStrNode *DelStr(LinkStrNode *s, int i, int j)
{
int k;
LinkStrNode *str, *p = s->next, *q, *r;
str = (LinkStrNode *)malloc(sizeof(LinkStrNode));
str->next = NULL;
r = str;
if (i <= 0 || i > StrLength(s) || j < 0 || i + j - 1 > StrLength(s))
return str;
for (k = 1; k < i; k++)
{
q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data = p->data;
r->next = q;
r = q;
p = p->next;
}
for (k = 0; k < j; k++)
p = p->next;
while (p != NULL)
{
q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data = p->data;
r->next = q;
r = q;
p = p->next;
}
r->next = NULL;
return str;
}
替换子串
LinkStrNode *RepStr(LinkStrNode *s, int i, int j, LinkStrNode *t)
{
int k;
LinkStrNode *str, *p = s->next, *p1 = t->next, *q, *r;
str = (LinkStrNode *)malloc(sizeof(LinkStrNode));
str->next = NULL;
r = str;
if (i <= 0 || i > StrLength(s) || j < 0 || i + j - 1 > StrLength(s))
return str;
for (k = 0; k < i - 1; k++)
{
q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data = p->data;
r->next = q;
r = q;
p = p->next;
}
for (k = 0; k < j; k++)
p = p->next;
while (p1 != NULL)
{
q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data = p1->data;
r->next = q;
r = q;
p1 = p1->next;
}
while (p != NULL)
{
q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data = p->data;
r->next = q;
r = q;
p = p->next;
}
r->next = NULL;
return str;
}
输出串
void DispStr(LinkStrNode *s)
{
LinkStrNode *p = s->next;
while (p != NULL)
{
cout << p->data;
p = p->next;
}
cout << endl;
}