链串

链串的组织形式与一般的链表类似。主要的区别在于,链串中的一个节点可以存储多个字符。通常将链串中每个节点所存储的字符个数称为节点大小

链串节点大小的选择与顺序串的格式选择类似。节点大小越大,则存储密度越大。但存储密度越大,一些操作(如插入、删除、替换等)有所不便,且可能引起大量字符移动,因此它适合于在串基本保持静态使用方式时采用。节点大小越小(如节点大小为1时),运算处理越方便,但存储密度下降。为简便起见,这里规定链串节点大小均为1

链串上实现串基本运算的算法:   

(1)StrAssign(s,cstr)

将一个字符串常量cstr赋给串s,即生成一个其值等于cstr的串s。以下采用尾插法建立链串s。

void StrAssign(LiString *&s,char cstr[])
{  int i;LiString *r,*p;
   s=(LiString *)malloc(sizeof(LiString));
   r=s; //r始终指向尾节点
   for (i=0;cstr[i]!='\0';i++) 
   {  p=(LiString *)malloc(sizeof(LiString));
p->data=cstr[i];
r->next=p;r=p;
   }
   r->next=NULL;

}

(2)StrCopy(s,t)

将串t复制给串s。以下采用尾插法建立复制后的链串s。

void StrCopy(LiString *&s,LiString *t)
{  LiString *p=t->next,*q,*r;
   s=(LiString *)malloc(sizeof(LiString));
   r=s; //r始终指向尾节点
   while (p!=NULL) //将t的所有节点复制到s
   {  q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;
r->next=q;r=q;
p=p->next;
   }
   r->next=NULL;

}

(3)StrEqual(s,t)

判串相等:若两个串s与t相等则返回真;否则返回假。

bool StrEqual(LiString *s,LiString *t)
{  LiString *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;

}

(4)StrLength(s)

求串长:返回串s中字符个数。

int StrLength(LiString *s)
{  int i=0;
   LiString *p=s->next;
   while (p!=NULL) 
   {  i++;
p=p->next;
   }
   return i;

}

(5)Concat(s,t)

串连接:返回由两个串s和t连接在一起形成的新串。以下采用尾插法建立链串str并返回其地址。

LiString *Concat(LiString *s,LiString *t)
{  LiString *str,*p=s->next,*q,*r;
   str=(LiString *)malloc(sizeof(LiString));
   r=str;
   while (p!=NULL) //将s的所有节点复制到str
   {  q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;
r->next=q;r=q;
p=p->next;
   }

   p=t->next;

   for (k=1;k<=j;k++) //将s的第i个节点开始的j个节点复制到str
   { q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;
r->next=q;r=q;
p=p->next;
   }
   r->next=NULL;
   return str;

}

(7)InsStr(s1,i,s2)

将串s2插入到串s1的第i(1≤i≤StrLength(s)+1)个字符位置,即将s2的第1个字符作为s1的第i个字符,s2的第2个字符作为s1的第i+1个字符,等等,并返回产生的新串, 参数不正确时返回一个空串。以下采用尾插法建立链串str并返回其地址。

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; //r指向新建链表的尾节点

   if (i<=0 || i>StrLength(s)+1) return str; //参数不正确时返回空串

    for (k=1;k<i;k++) //将s的前i个节点复制到str
    {  q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;
r->next=q;r=q;
p=p->next;
    }
    while (p1!=NULL) //将t的所有节点复制到str
    {  q=(LiString *)malloc(sizeof(LiString));
q->data=p1->data;
r->next=q;r=q;
p1=p1->next;
    }
    while (p!=NULL) //将*p及其后的节点复制到str
    {  q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;
r->next=q;r=q;
p=p->next;
    }
    r->next=NULL;
    return str;

}

(8)DelStr(s,i,j)

从串s中删去从第i(1≤i≤StrLength(s))个字符开始的长度为j的子串,并返回产生的新串, 参数不正确时返回一个空串。以下采用尾插法建立链串str并返回其地址。

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; //r指向新建链表的尾节点
   if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))

return str; //参数不正确时返回空串

   for (k=0;k<i-1;k++) //将s的前i-1个节点复制到str
   {  q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;
r->next=q;r=q;
p=p->next;
   }
   for (k=0;k<j;k++) //让p沿next跳j个节点
p=p->next;
   while (p!=NULL) //将*p及其后的节点复制到str
   {  q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;
r->next=q;r=q;
p=p->next;
   }
   r->next=NULL;
   return str;

}

(9)RepStr(s,i,j,t) 

在串s中,将第i(1≤i≤StrLength(s))个字符开始的j个字符构成的子串用串t替换,并返回产生的新串,参数不正确时返回一个空串。以下采用尾插法建立链串str并返回其地址。

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; //r指向新建链表的尾节点
   if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))

  return str; //参数不正确时返回空串

   for (k=0;k<i-1;k++)  //将s的前i-1个节点复制到str
   {  q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;q->next=NULL;
r->next=q;r=q;
p=p->next;
   }
   for (k=0;k<j;k++) //让p沿next跳j个节点
p=p->next;
   while (p1!=NULL) //将t的所有节点复制到str
   {  q=(LiString *)malloc(sizeof(LiString));
q->data=p1->data;q->next=NULL;
r->next=q;r=q;
p1=p1->next;
   }
   while (p!=NULL) //将*p及其后的节点复制到str
   {  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;

}

(10)DispStr(s)

输出串s的所有元素值。

void DispStr(LiString *s)
{  LiString *p=s->next;
   while (p!=NULL)
   {  printf("%c",p->data);
p=p->next;
   }
   printf("\n");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值