链串的基本运算如下:
(1)建立串s和串s1。
(2)输出串s。
(3)串s的长度。
(4)在串s的第9个字符位置插入串s1而产生串s2。
(5)输出串s2。
(6)删除串s第2个字符开始的5个字符而产生串s2。
(7)输出串s2。
(8)将串s第2个字符开始的5个字符替换成串s1而产生串s2。
(9)输出串s2。
(10)提取串s的第2个字符开始的10个字符而产生串s3。
(11)输出串s3。
(12)将串s1和串s2连接起来而产生串s4。
(13)输出串s4。
头文件+函数
#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>
typedef struct snode
{
char data;
struct snode *next;
}LinkStrNode;
static void StrAssign(LinkStrNode *&s, char cstr[])
{
int index;
LinkStrNode *p, *r;
s = (LinkStrNode *)malloc(sizeof(LinkStrNode));
r = s;
for(index = 0; cstr[index] != '\0'; index++)
{
p = (LinkStrNode *)malloc(sizeof(LinkStrNode));
p->data = cstr[index];
r->next = p;
r = p;
}
r->next = NULL;
}
static void DestroyStr(LinkStrNode *&s)
{
LinkStrNode *pre = s;
LinkStrNode *p = s->next;
while(p != NULL)
{
free(pre);
pre = p;
p = p->next;
}
free(pre);
}
static void StrCopy(LinkStrNode *&s, LinkStrNode *t)
{
LinkStrNode *p = t->next;
LinkStrNode *q;
LinkStrNode *r;
s = (LinkStrNode *)malloc(sizeof(LinkStrNode));
s->next = NULL;
r = s;
while(p != NULL)
{
q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data = p->data;
q->next = NULL;
r->next = q;
r = q;
p = p->next;
}
r->next = NULL;
}
static bool StrEqual(LinkStrNode *s, LinkStrNode *t)
{
LinkStrNode *p = s->next;
LinkStrNode *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;
}
static int StrLength(LinkStrNode *s)
{
int len = 0;
LinkStrNode *p = s->next;
while(p != NULL)
{
len++;
p = p->next;
}
return len;
}
static LinkStrNode * Concat(LinkStrNode *s, LinkStrNode *t)
{
LinkStrNode *str;
LinkStrNode *p = s->next;
LinkStrNode *q;
LinkStrNode *r;
str = (LinkStrNode *)malloc(sizeof(LinkStrNode));
str->next = NULL;
r = str;
while(p != NULL)
{
q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data = p->data;
q->next = NULL;
r->next = q;
r = q;
p = p->next;
}
p = t->next;
while(p != NULL)
{
q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data = p->data;
q->next = NULL;
r->next = q;
r = q;
p = p->next;
}
r->next = NULL;
return str;
}
static LinkStrNode * SubStr(LinkStrNode *s, int pos, int len)
{
int index;
LinkStrNode *str;
LinkStrNode *p = s->next;
LinkStrNode *q;
LinkStrNode *r;
str = (LinkStrNode *)malloc(sizeof(LinkStrNode));
str->next = NULL;
r = str;
if((pos <= 0) || (pos >StrLength(s)) || (len < 0) || (pos + len - 1 >StrLength(s)))
return str;
for(index = 0; index < pos - 1; index++)
p = p->next;
for(index = 1; index <= len; index++)
{
q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data = p->data;
q->next = NULL;
r->next = q;
r = q;
p = p->next;
}
r->next = NULL;
return str;
}
static LinkStrNode * InsStr(LinkStrNode *s, int pos, LinkStrNode *t)
{
int index;
LinkStrNode *str;
LinkStrNode *p = s->next;
LinkStrNode *p1 = t->next;
LinkStrNode *q;
LinkStrNode *r;
str = (LinkStrNode *)malloc(sizeof(LinkStrNode));
str->next = NULL;
r = str;
if(pos <= 0 || pos >StrLength(s) + 1)
return str;
for(index = 1; index < pos; index++)
{
q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data = p->data;
q->next = NULL;
r->next = q;
r = q;
p = p->next;
}
while(p1 != NULL)
{
q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data = p1->data;
q->next = NULL;
r->next = q;
r = q;
p1 = p1->next;
}
while(p != NULL)
{
q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data = p->data;
q->next = NULL;
r->next = q;
r = q;
p = p->next;
}
r->next = NULL;
return str;
}
static LinkStrNode * DelStr(LinkStrNode *s, int pos, int len)
{
int index;
LinkStrNode *str;
LinkStrNode *p = s->next;
LinkStrNode *q;
LinkStrNode *r;
str = (LinkStrNode *)malloc(sizeof(LinkStrNode));
str->next = NULL;
r = str;
if((pos <= 0) || (pos > StrLength(s)) || (len < 0) || (pos + len - 1 >StrLength(s)))
return str;
for(index = 0; index < pos - 1; index++)
{
q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data = p->data;
q->next = NULL;
r->next = q;
r = q;
p = p->next;
}
for(index = 0; index < len; index++)
p = p->next;
while(p != NULL)
{
q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data = p->data;
q->next = NULL;
r->next = q;
r = q;
p = p->next;
}
r->next = NULL;
return str;
}
static LinkStrNode * RepStr(LinkStrNode *s, int pos, int len, LinkStrNode *t)
{
int index;
LinkStrNode *str;
LinkStrNode *p = s->next;
LinkStrNode *p1 = t->next;
LinkStrNode *q;
LinkStrNode *r;
str = (LinkStrNode *)malloc(sizeof(LinkStrNode));
str->next = NULL;
r = str;
if((pos <= 0) || (pos >StrLength(s)) || (len < 0) || (pos + len - 1 >StrLength(s)))
return str;
for(index = 0; index < pos - 1; index++)
{
q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data = p->data;
q->next = NULL;
r->next = q;
r = q;
p = p->next;
}
for(index = 0; index < len; index++)
p = p->next;
while(p1 != NULL)
{
q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data = p1->data;
q->next = NULL;
r->next = q;
r = q;
p1= p1->next;
}
while(p != NULL)
{
q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data = p->data;
q->next = NULL;
r->next = q;
r = q;
p = p->next;
}
r->next = NULL;
return str;
}
static void DispStr(LinkStrNode *s)
{
LinkStrNode *p = s->next;
while(p != NULL)
{
printf("%c", p->data);
p = p->next;
}
printf("\n");
}
主函数
int main(int argc, char *argv[])
{
LinkStrNode *s, *s1, *s2, *s3, *s4;
printf("链串的基本运算如下:\n");
printf("(1)建立串s和串s1\n");
StrAssign(s, "abcdefghefghijklmn");
StrAssign(s1, "xyz");
printf("(2)输出串s:");
DispStr(s);
printf("(3)串s的长度:%d\n", StrLength(s));
printf("(4)在串s的第9个字符位置插入串s1而产生串s2\n");
s2 = InsStr(s, 9, s1);
printf("(5)输出串s2:");
DispStr(s2);
printf("(6)删除串s第2个字符开始的5个字符而产生串s2\n");
s2 = DelStr(s, 2, 5);
printf("(7)输出串s2:");
DispStr(s2);
printf("(8)将串s第2个字符开始的5个字符替换成串s1而产生串s2\n");
s2 = RepStr(s, 2, 5, s1);
printf("(9)输出串s2:");
DispStr(s2);
printf("(10)提取串s的第2个字符开始的10个字符而产生串s3\n");
s3 =SubStr(s, 2, 10);
printf("(11)输出串s3:");
DispStr(s3);
printf("(12)将串s1和串s2连接起来而产生串s4\n");
s4 = Concat(s1,s2);
printf("(13)输出串s4:");
DispStr(s4);
DestroyStr(s);
DestroyStr(s1);
DestroyStr(s2);
DestroyStr(s3);
DestroyStr(s4);
return 0;
}
运行结果: