链串的基本操作

#include<bits/stdc++.h>

typedef struct snode

{

 char data;

 struct snode *next;

}LinkStrNode;

//创建串

void StrAssign(LinkStrNode *&s,char cstr[])

{

 int i;

 LinkStrNode *r,*p;

 s=(LinkStrNode *)malloc(sizeof(LinkStrNode));

 r=s;

 for(i=0;cstr[i]!='\0';i++)

 {

  p=(LinkStrNode *)malloc(sizeof(LinkStrNode));

  p->data=cstr[i];

  r->next=p;

  r=p;

 }

 r->next=NULL;

}

//销毁串 

void DestoryStr(LinkStrNode *&s)

{

 LinkStrNode *pre=s,*p=s->next;

 while(p!=NULL)

 {

  free(pre);

  pre=p;

  p=p->next;

 }

 free(pre);

//串的复制 

void StrCopy(LinkStrNode *&s,LinkStrNode *t)//将t的字符串复制给s 

{

 LinkStrNode *p=t->next,*q,*r;

 s=(LinkStrNode *)malloc(sizeof(LinkStrNode));

 r=s;

 while(p!=NULL)

 {

  q=(LinkStrNode *)malloc(sizeof(LinkStrNode));

  q->data=p->data;

  r->next=q;

  r=q;

  p=p->next;

 }

 r->next=NULL;

}

//判断字符串是否相等 

bool StrEqual(LinkStrNode *s,LinkStrNode *t)

{

 LinkStrNode *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;

 }

//求字符串的长度

int StrLength(LinkStrNode *s)

{

 int i=0;

 LinkStrNode *p=s->next;

 while(p!=NULL)

 {

  i++;

  p=p->next;

 }

 return i;

//串的连接

LinkStrNode *Concat(LinkStrNode *s,LinkStrNode *t)

{

 LinkStrNode *str, *p=s->next,*q,*r;

 str=(LinkStrNode *)malloc(sizeof(LinkStrNode));

 r=str;

 while(p!=NULL)

 {

  q=(LinkStrNode *)malloc(sizeof(LinkStrNode));

  q->data=p->data;

  r->next=q;

  r=q;

  p=p->next;

 }

 p=t->next;

 while(p!=NULL)

 {

  q=(LinkStrNode *)malloc(sizeof(LinkStrNode));

  q->data=p->data;

  r->next=q;

  r=q;

  p=p->next;

 }

 r->next=NULL;

 return str;

//求子串

LinkStrNode *SubStr(LinkStrNode *s,int i,int j)

{

 int k;

 LinkStrNode *str,*p=s->next,*q,*r;

 str=(LinkStrNode *)malloc(sizeof(LinkStrNode));

    str->next=NULL;

 r=str;

 if(i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))

 {

  return str;//返回空串 

 }

 for(k=1;k<i;k++)

 {

  p=p->next;

 }

 for(k=1;k<=j;k++)

 {

  q=(LinkStrNode *)malloc(sizeof(LinkStrNode));

  q->data=p->data;

  r->next=q;

  r=q;

  p=p->next;

 }

 r->next=NULL;

 return str;

//子串的插入

LinkStrNode *InStr(LinkStrNode *s,int i,LinkStrNode *t)

{

 int k;

 LinkStrNode *str,*p=s->next,*p1=t->next,*q,*r;

 str=(LinkStrNode *)malloc(sizeof(LinkStrNode));

 str->next=NULL;

 r=str;

 if(i<=0 || i>StrLength(s)+1)

 {

  return str;

 }

 for(k=1;k<i;k++)

 {

  q=(LinkStrNode *)malloc(sizeof(LinkStrNode));

  q->data=p->data;

  r->next=q;

  r=q;

  p=p->next;

 }

 while(p1!=NULL)

 {

  q=(LinkStrNode *)malloc(sizeof(LinkStrNode));

  q->data=p1->data;

  r->next=q;

  r=q;

  p1=p1->next;

 }

 while(p!=NULL)

 {

  q=(LinkStrNode *)malloc(sizeof(LinkStrNode));

  q->data=p->data;

  r->next=q;

  r=q;

  p=p->next;

 }

 r->next=NULL;

 return str;

//子串的删除

LinkStrNode *DelStr(LinkStrNode *s,int i,int j)

{

 int k;

 LinkStrNode *str,*p=s->next,*q,*r;

 str=(LinkStrNode *)malloc(sizeof(LinkStrNode));

 str->next=NULL;

 r=str;

 if(i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))

 {

  return str;//返回空串 

 }

 for(k=1;k<i;k++)

 {

  q=(LinkStrNode *)malloc(sizeof(LinkStrNode));

  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=(LinkStrNode *)malloc(sizeof(LinkStrNode));

  q->data=p->data;

  r->next=q;

  r=q;

  p=p->next;

 }

 r->next=NULL;

 return str;

//子串的替换 

LinkStrNode *RepStr(LinkStrNode *s,int i,int j,LinkStrNode *t)

{

 int k;

 LinkStrNode *str,*p=s->next,*p1=t->next,*q,*r;

 str=(LinkStrNode *)malloc(sizeof(LinkStrNode));

 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=(LinkStrNode *)malloc(sizeof(LinkStrNode));

  q->data=p->data;

  q->next=NULL;

  r->next=q;

  r=q;

  p=p->next;

 }

 for(k=0;k<j;k++)

 {

  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;

}

//串的打印

void DispStr(LinkStrNode *s)

{

 LinkStrNode *p=s->next;

 while(p!=NULL)

 {

  printf("%c",p->data);

  p=p->next;

 }

 printf("\n");

}

int main()
{
    LinkStrNode *s,*ss,*sss;
    LinkStrNode *str;
    int m;
    char a[]="abcdefj" ;
    char b[]="eee" ;
    StrAssign(s,a);
    StrAssign(ss,b);
    printf("打印两个字符串\n");
    DispStr(s);
    DispStr(ss);
    printf("串的复制\n");
    StrCopy(sss,s);
    DispStr(s);
    printf("串的销毁\n");
    DestoryStr(sss);
    printf("判断字符串是否相等\n");
    m=StrEqual(s,ss);
    if(m==1)
    {
        printf("两个字符串相等\n");
    }
    else
    {
        printf("两个字符串不相等\n"); 
    }
    printf("求串的长度\n");
    printf("%d\n",StrLength(s));
    printf("%d\n",StrLength(ss));
    printf("串的连接\n");
    str=Concat(s,ss);
    DispStr(str);
    printf("求子串\n");
    str=SubStr(s,2,5);
    DispStr(str);
    printf("子串的插入\n");
    str=InStr(s,5,ss);
    DispStr(str);
    printf("子串的删除\n");
    str=DelStr(s,2,5);
    DispStr(str);
    printf("子串的替换\n");
    str=RepStr(s,1,3,ss);
    DispStr(str);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/2302_77099705/article/details/130445965