字符串的基本操作
来源:互联网 发布:吴达洙 知乎 编辑:程序博客网 时间: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
- 字符串的基本操作
- 字符串的基本操作
- 字符串的基本操作
- 字符串的基本操作
- 字符串的基本操作
- 基本的字符串操作
- 字符串的基本操作
- 字符串的基本操作
- 字符串的基本操作
- 字符串的基本操作
- 字符串的基本操作
- 字符串的基本操作
- 字符串的一些基本操作
- CString字符串的基本操作
- 数据结构:字符串的基本操作
- 字符串的一些基本操作
- 字符串的一些基本操作
- Matlab字符串的基本操作
- ASP获取数据库表名、库名、字段名的方法
- hdu1297 Children’s Queue (动态规划,n个人排成一列的方案数+高精加)
- Combination Sum III
- 开源网络框架Volley(3)
- 自定义导航栏的左右按钮
- 字符串的基本操作
- ViewPager的实现:动态添加RadioButton
- 【leetcode】Validate Binary Search Tree 题解三种思路
- 彻底解密C++宽字符:1、从char到wchar_t
- Eclipse快捷键大全
- 动态规划之0-1背包问题
- RSA算法原理
- java 建造者模式详解
- 开源框架Volley源码分析