堆串
字符串包括串名与串值两部分,而串值采用堆串存储方法存储,串名用符号表示存储
存储方法
将一个地址连续,容量很大的存储空间作为字符串的可用空间,执行程序是动态分配
串名符号表
所有串的存储映像构成一个符号表。借助此结构可以在串名与串值之间建立一个对应关系,称为串名的存储映像
插入
#include <stdio.h> #include <stdlib.h> typedef struct { char *str; //一块连续的存储空间 int len; }HString; void InitString(HString *s) { s->str='\0'; s->len=0; } void CreateString(HString *s,char a[]) { int i=0,len; if(s->str) free(s->str); //若果串中有元素,销毁 for(;a[i]!='\0';i++) {} len=i; if(!i) { s->str='\0'; s->len=0; } else { s->str=(char*)malloc(len*sizeof(char)); if(!s->str) exit(0); else for(i=0;i<len;i++) s->str[i]=a[i]; s->len=len; } } int StrEmpty(HString *S) { if (S->len==0) return 1; else return 0; } int StrLength(HString *s) { return s->len; } void StrInsert(HString *s,char b[],int pos) { int i,len; char *t; if(pos<0||pos>s->len||s->len==0) { printf("插入的位置不合理!\n"); exit(0); } for(i=0;b[i]!='\0';i++) {} len=i; t=(char *)malloc(s->len+len); if(t==NULL) { printf("没有足够的内存空间!\n"); exit(0); } i=0; for(i=0;i<pos;i++) t[i]=s->str[i]; for(i=0;i<pos+len;i++) t[i+pos]=b[i]; for(i=pos;i<s->len;i++) t[i+len]=s->str[i]; s->len+=len; free(s->str); s->str=t; } void Print(HString *s) { printf("新的字符串为:\n"); for(int i=0;i<s->len;i++) printf("%c",s->str[i]); printf("\n"); } int main() { int result,pos; HString s; char a[100],b[100]; InitString(&s); printf("请输入字符串:\n"); gets(a); CreateString(&s,a); result=StrEmpty(&s); if(result) printf("串为空!\n"); else printf("串不为空!\n"); result=StrLength(&s); printf("串的长度为:%d\n",result); printf("请输入要插入的字符串:\n"); gets(b); printf("请输入要插入的位置:\n"); scanf("%d",&pos); StrInsert(&s,b,pos); Print(&s); return 0; }
截取
#include <stdio.h> #include <stdlib.h> typedef struct { char *str; int len; }string; void InitString(string *s) { s->str='\0'; s->len=0; } void InsertString(string *s,char a[]) { int i,len; if(s->str) free(s->str); for(i=0;a[i]!='\0';i++) {} len=i; if(!i) { s->str='\0'; s->len=0; } else { s->str=(char *)malloc(len); if(s==NULL) { printf("内存不足!\n"); exit(0); } else { for(i=0;i<len;i++) s->str[i]=a[i]; s->len=len; } } } void SubString(string *s,int pos,int len) { int i; char *p; if(pos<0||pos+len>s->len||len<0) { printf("输入的位置不合法!\n"); exit(0); } if(s->str) free(s->str); p=(char *)malloc(len*sizeof(char)); if(!p) { printf("分配内存失败!\n"); exit(0); } else { for(i=0;i<len;i++) p[i]=s->str[i+pos-1]; free(s->str); s->str=p; s->len=len; } } int main() { char a[100]; int pos,len; string s; InitString(&s); printf("请输入字符串:\n"); gets(a); InsertString(&s,a); printf("请输入要截取的位置:\n"); scanf("%d",&pos); printf("请输入要截取的长度:\n"); scanf("%d",&len); SubString(&s,pos,len); printf("截取后新的字符串为:\n"); puts(s.str); return 0; }
链接
#include <stdio.h> #include <stdlib.h> typedef struct { char *str; int len; }string; void InitString(string *s) { s->str='\0'; s->len=0; } void InsertString(string *s,char a[]) { int i,len; if(s->str) free(s->str); for(i=0;a[i]!='\0';i++) {} len=i; if(!i) { s->str='\0'; s->len=0; } else { s->str=(char *)malloc(len*sizeof(char)); if(s->str==NULL) { printf("内存不足!\n"); exit(0); } else { for(i=0;i<len;i++) s->str[i]=a[i]; s->len=len; } } } void SubString(string *s,char a[]) { int i,len; char *p; for(i=0;a[i]!='\0';i++) {} len=i; p=(char *)malloc(s->len+len); if(!p) { printf("内存不足!\n"); exit(0); } else { for(i=s->len;i<s->len+len;i++) s->str[i]=a[i-s->len]; s->len+=len; } } int main() { char a[100],b[100]; string s; InitString(&s); printf("请输入字符串:\n"); gets(a); InsertString(&s,a); printf("请输入要链接的字符串:\n"); gets(b); SubString(&s,b); printf("连接后的新字符串为:\n"); puts(s.str); printf("\n"); return 0; }
删除
#include <stdio.h> #include <stdlib.h> typedef struct { char *str; int len; }HString; void InitString(HString *s) { s->str='\0'; s->len=0; } void InsertString(HString *s,char a[]) { int i,len; if(s->str) free(s->str); for(i=0;a[i]!='\0';i++) {} len=i; if(!i) { s->str='\0'; len=0; } s->str=(char *)malloc(len*sizeof(char)); if(s->str==NULL) { printf("内存不足!\n"); exit(0); } for(i=0;i<len;i++) s->str[i]=a[i]; s->len=len; } void DeleteString(HString *s,int pos,int len) { char *p; if(pos<0||len<0||pos+len-1>s->len) { printf("输入的位置不合法!\n"); exit(0); } p=(char *)malloc(s->len-len); if(!p) { printf("内存不足!\n"); exit(0); } else { for(int i=0;i<pos-1;i++) p[i]=s->str[i]; for(int i=pos-1;i<s->len-len;i++) p[i]=s->str[i+len] ; s->len-=len; free(s->str); s->str=p; } } int main() { char a[100],b[100]; HString s; int pos,len; InitString(&s); printf("请输入字符串:\n"); gets(a); InsertString(&s,a); printf("请输入要删除的起始位置:\n"); scanf("%d",&pos); printf("请输入要删除的长度:\n") ; scanf("%d",&len); DeleteString(&s,pos,len); printf("新的字符串为:\n"); puts(s.str); return 0; }
替换
#include <stdio.h> #include <stdlib.h> typedef struct { char *str; int len; }string; void InitString(string *s) { s->str='\0'; s->len=0; } void StrAssign(string *s,char a[]) { int i,len; for(i=0;a[i]!='\0';i++) {} len=i; if(s->str) free(s->str); if(!i) { s->str='\0'; s->len=0; } else { s->str=(char *)malloc(len*sizeof(char)); if(s->str==NULL) { printf("分配内存失败!\n"); exit(0); } else { for(i=0;i<len;i++) s->str[i]=a[i]; s->len=len; } } } int StrLength(string *s) { int len; len=s->len; return len; } bool StrEmpety(string *s) { if(s->len) return true; else return false; } int StrIndex(string *s,int pos,char b[]) { int start,j,i,len=0,k; for(k=0;b[k]!='\0';k++) {} len=k; if(len==0) { printf("为空串!\n"); exit(0); } start=pos; i=start; j=0; while(i<s->len&&j<len) { if(s->str[i]==b[j]) { i++; j++; } else { start++; i=start; j=0; } } if(j>=len) { printf("匹配成功!\n"); return start; } else { printf("匹配失败!\n"); return 0; } } int StrLength(char b[]) { int i=0; for(;b[i]!='\0';i++) {} return i; } void StrDelete(string *s,int i,int len) { char *p; int pos=i; if(i<0||len<0||i+len>s->len) { printf("输入的位置不合法!\n"); exit(0); } p=(char *)malloc(s->len-len); if(!p) { printf("分配内存失败!\n"); exit(0); } for(int j=0;j<pos-1;j++) p[j]=s->str[j]; for(int j=pos-1;j<s->len-len;j++) p[j]=s->str[j+len]; s->len-=len; free(s->str); s->str=p; } int StrInsert(string *s,int pos,char c[]) { int i=0,len=0; for(;c[i]!='\0';i++) {} len=i; if(pos<0||pos-1>s->len) { printf("插入的位置不合法!\n"); exit(0); } char *p; p=(char *)realloc(s->str,(s->len+len)*sizeof(char)); if(!p) { printf("内存分配失败!\n"); exit(0); } for(i=s->len-1;i>=pos-1;i--) s->str[i+len]=s->str[i]; for(i=0;i<len;i++) s->str[pos-1+i]=c[i]; s->len+=len; return 1; } void StrReplace(string *s,char b[],char c[]) { int i=0,flag; if(!StrEmpety(s)) { printf("字符串为空!\n"); exit(0); } i=StrIndex(s,i,b); while(i<s->len) { StrDelete(s,i,StrLength(b)); flag=StrInsert(s,i,c); if(!flag) return; i+=StrLength(c); } } int main() { string s; char a[100],b[100],c[100]; InitString(&s); printf("请输入字符串:\n"); gets(a); StrAssign(&s,a); printf("请输入要被替换的字符串:\n"); gets(b); printf("请输入要替换的字符串:\n"); gets(c); StrReplace(&s,b,c); printf("新的字符串为:\n"); puts(s.str); return 0; }