您的位置:首页 > 其它

字符串的基本操作

2015-10-22 21:31 344 查看
顺序表实现:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxn 111
typedef 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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: