字符串的基本操作
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); }
相关文章推荐
- 《词法分析》写后感
- Java学习笔记(六)——方法
- 自定义导航栏的左右按钮
- Combination Sum III
- POJ 1789 Truck History 最小生成树 prim
- C++字符串(Unicode/TCHAR/WCHAR/ASCII/LPSTR/LPCSTR等转换)
- 动态规划-------最长公共子序列
- 图像滤波综合(方框、均值、高斯、中值、双边)
- 难题集锦
- linux----LAMP之编译安装apache
- Android ActionBar的基本用法
- 接口和抽象类的区别—Java
- Vickate_Swift2.0的方法总结 及 与C/OC的语法区别
- Android 生成含签名文件的apk安装包
- Neutron出现的floating IP 没有正常释放
- hdoj 1269 迷宫城堡 【强连通】&&【dfs】
- Android studio 一个项目中添加两个module遇到的bug
- HDOJ 4704 Sum(费马小定理+快速幂)
- TCP多线程简单聊天系统
- 两数求最大值