链串的基本运算
链串的定义
#include <stdio.h>
#include <malloc.h>
typedef struct node
{
char data;
struct node *next;
} LinkString;
赋值运算
void Assign(LinkString *&s,char t[])
{
int i=0;
LinkString *q,*tc;
s=(LinkString *)malloc(sizeof(LinkString));
s->next=NULL;
tc=s;
while (t[i]!='\0')
{
q=(LinkString *)malloc(sizeof(LinkString));
q->data=t[i];
tc->next=q;tc=q;
i++;
}
tc->next=NULL;
}
复制运算
void StrCopy(LinkString *&s,LinkString *t)
{
LinkString *p=t->next,*q,*tc;
s=(LinkString *)malloc(sizeof(LinkString));
s->next=NULL;
tc=s;
while (p!=NULL)
{
q=(LinkString *)malloc(sizeof(LinkString));
q->data=p->data;
tc->next=q;tc=q;
p=p->next;
}
tc->next=NULL;
}
求串长运算
int StrLength(LinkString *s)
{
int n=0;
LinkString *p=s->next;
while (p!=NULL)
{
n++;p=p->next;
}
return(n);
}
判断串相等运算
int StrEqual(LinkString *s,LinkString *t)
{
LinkString *p=s->next,*q=t->next;
while (p!=NULL && q!=NULL)
{
if (p->data!=q->data)
return(0);
p=p->next;q=q->next;
}
if (p!=NULL || q!=NULL)
return(0);
return(1);
}
串连接运算
LinkString *Concat(LinkString *s,LinkString *t)
{
LinkString *p=s->next,*q,*tc,*str;
str=(LinkString *)malloc(sizeof(LinkString));
str->next=NULL;
tc=str;
while (p!=NULL)
{
q=(LinkString *)malloc(sizeof(LinkString));
q->data=p->data;
tc->next=q;tc=q;
p=p->next;
}
p=t->next;
while (p!=NULL)
{
q=(LinkString *)malloc(sizeof(LinkString));
q->data=p->data;
tc->next=q;tc=q;
p=p->next;
}
tc->next=NULL;
return(str);
}
求子串运算
LinkString *SubStr(LinkString *s,int i,int j)
{
int k=1;
LinkString *p=s->next,*q,*tc,*str;
str=(LinkString *)malloc(sizeof(LinkString));
str->next=NULL;
tc=str;
while (k<i && p!=NULL)
{
p=p->next;k++;
}
if (p!=NULL)
{
k=1;
while (k<=j && p!=NULL)
{
q=(LinkString *)malloc(sizeof(LinkString));
q->data=p->data;
tc->next=q;tc=q;
p=p->next;
k++;
}
tc->next=NULL;
}
return(str);
}
查找子串位置运算
int Index(LinkString *s,LinkString *t)
{
LinkString *p=s->next,*p1,*q,*q1;
int i=0;
while (p!=NULL)
{
q=t->next;
if (p->data==q->data)
{
p1=p->next;q1=q->next;
while (p1!=NULL && q1!=NULL && p1->data==q1->data)
{
p1=p1->next;
q1=q1->next;
}
if (q1==NULL)
return(i);
}
p=p->next;i++;
}
return(-1);
}
子串插入运算
int InsStr(LinkString *&s,int i,LinkString *t)
{
int k;
LinkString *q=s->next,*p,*str;
StrCopy(str,t);
p=str;str=str->next;
free(p);
for (k=1;k<i;k++)
{
if (q==NULL)
return(0);
p=q;
q=q->next;
}
p->next=str;
while (str->next!=NULL)
str=str->next;
str->next=q;
return(1);
}
子串删除运算
int DelStr(LinkString *&s,int i,int j)
{
int k;
LinkString *q=s->next,*p,*t;
for (k=1;k<i;k++)
{
if (q==NULL)
return(0);
p=q;
q=q->next;
}
for (k=1;k<=j;k++)
{
if (q==NULL)
return(0);
t=q;
q=q->next;
free(t);
}
p->next=q;
return(1);
}
子串替换运算
LinkString *RepStrAll(LinkString *s,LinkString *s1,LinkString *s2)
{
int i;
i=Index(s,s1);
while (i>=0)
{
DelStr(s,i+1,StrLength(s1));
InsStr(s,i+1,s2);
i=Index(s,s1);
}
return(s);
}
输出串运算
void DispStr(LinkString *s)
{
LinkString *p=s->next;
while (p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\n");
}
main
void main()
{
LinkString *s1,*s2,*s3,*s4,*s5,*s6,*s7;
Assign(s1,"abcd");
printf("s1:");DispStr(s1);
printf("s1的长度:%d\n",StrLength(s1));
printf("s1=>s2\n");
StrCopy(s2,s1);
printf("s2:");DispStr(s2);
printf("s1和s2%s\n",(StrEqual(s1,s2)==1?"相同":"不相同"));
Assign(s3,"12345678");
printf("s3:");DispStr(s3);
printf("s1和s3连接=>s4\n");
s4=Concat(s1,s3);
printf("s4:");DispStr(s4);
printf("s3[2..5]=>s5\n");
s5=SubStr(s3,2,4);
printf("s5:");DispStr(s5);
Assign(s6,"567");
printf("s6:");DispStr(s6);
printf("s6在s3中位置:%d\n",Index(s3,s6));
printf("从s3中删除s3[3..6]字符\n");
DelStr(s3,3,4);
printf("s3:");DispStr(s3);
printf("从s4中将s6替换成s1=>s7\n");
s7=RepStrAll(s4,s6,s1);
printf("s7:");DispStr(s7);
}