串的模版(String)
#include<stdio.h>
#include<stdlib.h>
typedef struct snode
{
char data;
struct snode *next;
}LiString;
/*---将一个字符串数组复制给串---*/
void StrAssign(LiString *&s,char cstr[])
{
int i;
LiString *r,*p;
s=(LiString *)malloc(sizeof(LiString));
r=s;
for(i=0;cstr[i]!='\0';i++)
{
p=(LiString *)malloc(sizeof(LiString));
p->data=cstr[i];
r->next=p;
r=p;
}
r->next=NULL;
}
/*---将串t赋值给串s---*/
void StrCopy(LiString *&s,LiString *t)
{
LiString *p=t->next,*q,*r;
s=(LiString *)malloc(sizeof(LiString));
r=s;
while(p!=NULL)
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;
r->next=q;
r=q;
p=p->next;
}
r->next=NULL;
}
/*---判断两个串是否相等,真true假false---*/
bool StrEqual(LiString *s,LiString *t)
{
LiString *p=s->next,*q=t->next;
while(p!=NULL&&q!=NULL&&p->data==q->data)
{
q=q->next;
p=p->next;
}
if(p==NULL&&q==NULL)
{
return true;
}
else
{
return false;
}
}
/*---求串长---*/
int StrLength(LiString *s)
{
int i=0;
LiString *p=s->next;
while(p!=NULL)
{
i++;
p=p->next;
}
return i;
}
/*---连接两个串(串t接在串s后边)---*/
LiString *ConCat(LiString *s,LiString *t)
{
LiString *str,*p=s->next,*q,*r;
str=(LiString *)malloc(sizeof(LiString));
r=str;
while(p!=NULL)
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;
r->next=q;
r=q;
p=p->next;
}
p=t->next;
while(p!=NULL)
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;
r->next=q;
r=q;
p=p->next;
}
r->next=NULL;
return str;
}
/*---取子串
(在串s中从第i个开始的,连续的j个字符),
参数不正确则返回空串---*/
LiString *SubStr(LiString *s,int i,int j)
{
int k;
LiString *str,*p=s->next,*q,*r;
str=(LiString *)malloc(sizeof(LiString));
str->next=NULL;
r=str;
if(i<0||i>StrLength(s)||j<0||i+j-1>StrLength(s))//参数不正确
{
return str;
}
for(k=0;k<=j;k++)
{
p=p->next;
}
for(k=1;k<=j;k++)
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;
r->next=q;
r=q;
p=p->next;
}
r->next=NULL;
return str;
}
/*---将串s2插在串s1的第i个位置
(s2的第一个字符为s1的第i个字符)
参数不正确返回空串---*/
LiString *InsStr(LiString *s,int i,LiString *t)
{
int k;
LiString *str,*p=s->next,*p1=t->next,*q,*r;
str=(LiString *)malloc(sizeof(LiString));
str->next=NULL;
r=str;
if(i<=0||i>StrLength(s)+1)//参数不正确
{
return str;
}
for(k=1;k<i;k++)
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;
r->next=q;
r=q;
p=p->next;
}
while(p1!=NULL)
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p1->data;
r->next=q;
r=q;
p1=p1->next;
}
while(p!=NULL)
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;
r->next=q;
r=q;
p=p->next;
}
r->next=NULL;
return str;
}
/*---从串s中删去第i个字符开始长度为j的子串,并返回新串
参数不正确返回空串---*/
LiString *DelStr(LiString *s,int i,int j)
{
int k;
LiString *str,*p=s->next,*q,*r;
str=(LiString *)malloc(sizeof(LiString));
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=(LiString *)malloc(sizeof(LiString));
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=(LiString *)malloc(sizeof(LiString));
q->data=p->data;
r->next=q;
r=q;
p=p->next;
}
r->next=NULL;
return str;
}
/*---在串s中,将第i个字符开始的j个子串用串t代替
并返回新串,参数不正确返回空串---*/
LiString * RepStr(LiString *s,int i,int j,LiString *t)
{
int k;
LiString *str,*p=s->next,*p1=t->next,*q,*r;
str=(LiString *)malloc(sizeof(LiString));
str->next=NULL;
r=str;
if(i<=0||i>StrLength(s)+1)//参数不正确
{
return str;
}
for(k=0;k<i-1;k++)
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;
r->next=q;
r=q;
p1=p1->next;
}
for(k=0;k<j;k++)
{
p=p->next;
}
while(p1!=NULL)
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p1->data;
q->next=NULL;
r->next=q;
r=q;
p=p->next;
}
while(p!=NULL)
{
q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;
q->next=NULL;
r->next=q;
r=q;
p=p->next;
}
r->next=NULL;
return str;
}
/*---输出串s所有的元素---*/
void DispStr(LiString *s)
{
LiString *p=s->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\n");
}
int main()
{
return 0;
}