链串的基本运算
赋值运算
{
int i=0;
LinkString *q,*tc;
s=(LinkString *)malloc(sizeof(LinkString)); /*建立头结点*/
s->next=NULL;
tc=s; /*tc指向s串的尾结点*/
while (t[i]!='\0')
{
q=(LinkString *)malloc(sizeof(LinkString));
q->data=t[i];
tc->next=q;tc=q;
i++;
}
tc->next=NULL; /*终端结点的next置NULL*/
}
复制运算
void StrCopy(LinkString *&s,LinkString *t) /*t=>s*/
{
LinkString *p=t->next,*q,*tc;
s=(LinkString *)malloc(sizeof(LinkString)); /*建立头结点*/
s->next=NULL;
tc=s; /*tc指向s串的尾结点*/
while (p!=NULL) /*复制t的所有结点*/
{
q=(LinkString *)malloc(sizeof(LinkString));
q->data=p->data;
tc->next=q;tc=q;
p=p->next;
}
tc->next=NULL; /*终端结点的next置NULL*/
}
求串长运算
int StrLength(LinkString *s)
{
int n=0;
LinkString *p=s->next;
while (p!=NULL) /*扫描串s的所有结点*/
{
n++;p=p->next;
}
return(n);
}
串连接运算
LinkString *Concat(LinkString *s,LinkString *t)
{
str=(LinkString *)malloc(sizeof(LinkString)); /*建立头结点*/
str->next=NULL;
tc=str; /*tc总是指向新链表的尾结点*/
while (p!=NULL) /*将s串复制给str*/
{
q=(LinkString *)malloc(sizeof(LinkString));
q->data=p->data;
tc->next=q;tc=q;
}
p=t->next;
while (p!=NULL) /*将t串复制给str*/
{
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; /*tc总是指向新链表的尾结点*/
while (k<i && p!=NULL)
{
p=p->next;k++;
}
if (p!=NULL)
{
k=1;
while (k<=j && p!=NULL) /*复制j个结点*/
{
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) /*循环扫描s的每个结点*/
{
q=t->next; /*子串总是从第一个字符开始比较*/
if (p->data==q->data)/*判定两串当前字符相等*/
{ /*若首字符相同,则判定s其后字符是否与t的依次相同*/
while (p1!=NULL && q1!=NULL && p1->data==q1->data)
{
p1=p1->next;
}
if (q1==NULL) /*若都相同,则返回相同的子串的起始位置*/
return(i);
}
p=p->next;i++;
}
return(-1); /*若不是子串,返回-1*/
}
子串删除运算
int DelStr(LinkString *&s,int i,int j)
{
int k;
LinkString *q=s->next,*p,*t;
for (k=1;k<i;k++) /*在s中找到第i-1个结点,由p指向它,q指向下一个结点*/
{
if (q==NULL) /*位置参数i错误*/
return(0);
p=q;
q=q->next;
}
for (k=1;k<=j;k++) /*删除*p之后的j个结点,并由q指向下一个结点*/
{
if (q==NULL) /*长度参数j错误*/
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)); /*删除串s1*/
InsStr(s,i+1,s2); /*插入串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");