字符串的基本操作

来源:互联网 发布:吴达洙 知乎 编辑:程序博客网 时间:2024/05/21 19:28

顺序表实现:

#include<stdio.h>#include<stdlib.h>#include<string.h>#define maxn 111typedef struct{    char str[maxn];    int len;}seqstr;void strinsert(seqstr *s,int i,seqstr t) //功能:在第i个字符后插入一段字符串{    int k;    if(i<1||i>s->len||t.len+s->len>maxn-1)    {        printf("Cannot insert!\n");        return ;    }    for(k=s->len-1;k>=i-1;k--)         s->str[k+t.len]=s->str[k];    for(k=0;k<t.len;k++)         s->str[i-1+k]=t.str[k];    s->len+=t.len;    s->str[s->len]='\0';}void strndele(seqstr *s,int i,int len) //删除从第i个字符开始长度为len的子串{    int k;    if(i<0||i>s->len||i+len-1>s->len)    {        printf("Cannot delete!\n");        return;    }    for(k=s->len-1;k>=i+len-1;k--)       s->str[k-len]=s->str[k];    s->len-=len;    s->str[s->len]='\0';}seqstr* strconcat(seqstr s,seqstr t) //将两串合并{    int i,cnt=0;    if(s.len+t.len>maxn-1)    {        printf("Cannot concat!\n");        return;    }    seqstr *d=(seqstr *)malloc(sizeof(seqstr));    int slen=strlen(s.str);    int tlen=strlen(t.str);    for(i=0;i<slen;i++)        d->str[cnt++]=s.str[i];    for(i=0;i<tlen;i++)        d->str[cnt++]=t.str[i];    d->len=cnt;    d->str[d->len]='\0';    return d;}seqstr* substring(seqstr s,int i,int len) //返回第i个字符开始长度为len的子串{    int k,cnt=0;    if(i<1||i+len-1>s.len||i>s.len)    {        printf("Cannot substring\n");        return ;    }    seqstr *t=(seqstr *)malloc(sizeof(seqstr));    for(k=i-1;k<len+i-1;k++)        t->str[cnt++]=s.str[k];    t->len=cnt;    t->str[t->len]='\0';    return t;}int main(){    seqstr s,t;    seqstr *d;    int id,len;    scanf("%s%s",&s.str,&t.str);    s.len=strlen(s.str);    t.len=strlen(t.str);    /*printf("输入要插入的位置:");      scanf("%d",&id);      strinsert(&s,id,t);*/    scanf("%d%d",&id,&len);    /*strndele(&s,id,len);    printf("%s\n",s.str);*/    //d=strconcat(s,t);    d=substring(s,id,len);    printf("%s\n",d->str);    return 0;}

链表实现:


#include<stdio.h>#include<stdlib.h>typedef struct linkstrnode{    char data;    struct linkstrnode *next;}node;typedef node* linkstring;void create(linkstring *s) //二级指针,没有返回值{    char x;    node *q,*p=NULL;    *s=NULL;    while((x=getchar())!='\n') //输入字符串一回车结束    {        q=(node *)malloc(sizeof(node));        q->data=x;        if(*s==NULL) *s=q,p=q; //原链表为空时        else p->next=q,p=p->next;    }    if(p!=NULL)  p->next=NULL; //排除没有输入字符的情况}void display(node *head) //打印字符串链表{    node *p=head;    if(!head)    {        printf("链表是空的\n");        return ;    }    while(p)    {        printf("%c",p->data);        p=p->next;    }    printf("\n");}void strinsert(linkstring *s,node *t,int i) //从字符串第i个位置插入{    int k=1;    node *p=*s,*tail=t;    while(p&&k<i-1) p=p->next,k++; //找到i-1个节点    if(!p||i-1==k) printf("error!\n"); //没有这个节点的情况    else    {       while(tail&&tail->next!=NULL) tail=tail->next;  //找到待插入串的尾指针       if(tail)       {          if(p==*s&&i-1!=1) tail->next=*s,*s=t; //在第一个字符插入的情况          else          {            tail->next=p->next; //普通插入操作            p->next=t;          }       }    }}void strdele(linkstring *s,int i,int len)//删除第i个字符开始长度为len的字符串{    int k=1;    node *pre=NULL,*p=*s,*tail,*q;    while(p&&k!=i) pre=p,p=p->next,k++; //找到第i个字符和他的前驱    if(!p) printf("error!\n");    else    {        k=1;        tail=p;        while(tail&&k!=len) tail=tail->next,k++; //找到删除字符串的为指针        if(tail)        {           if(!pre)  q=*s,*s=tail->next; //若从头开始删除           else  q=p,pre->next=tail->next; //中间某一段删除        }        tail->next=NULL;        while(!tail) p=tail,tail=tail->next,free(p);    }}void strconcat(linkstring *s,linkstring t)//字符串拼接{    node *p=*s,*tail;    if(!p)    {       *s=t;       return ;    }    while(p->next) p=p->next;    p->next=t;}node *substring(node *s,int i,int len) //字符串s中截取i个字符开始,长度为len的字符串{    node *p=s,*q,*t,*tail;    int k=1;    while(p&&k!=i) p=p->next,k++;    if(!p)    {        printf("error!\n");        return NULL;    }    t=(node *)malloc(sizeof(node));    t->data=p->data;    t->next=NULL;    p=p->next;    tail=t;    k=1;    while(p&&k<len)    {        q=(node *)malloc(sizeof(node));        q->data=p->data;        tail->next=q;        tail=tail->next;        p=p->next;        k++;    }    tail->next=NULL;    if(k<len)    {        tail=t;        while(t) tail=t,t=t->next,free(tail);        return NULL;    }    else return t;}int main(){    node *s,*t,*d;    int id,len;    create(&s);   // create(&t);  //display(s);  //scanf("%d",&id);  //strinsert(&s,t,id);    scanf("%d%d",&id,&len);  //strdele(&s,id,len); // strconcat(&s,t);    d=substring(s,id,len);    display(d);}


0 0