串---堆串
阿新 • • 發佈:2018-09-25
rem sign ins start 空間 bsp lse struct 位置
堆串
字符串包括串名與串值兩部分,而串值采用堆串存儲方法存儲,串名用符號表示存儲
存儲方法
將一個地址連續,容量很大的存儲空間作為字符串的可用空間,執行程序是動態分配
串名符號表
所有串的存儲映像構成一個符號表。借助此結構可以在串名與串值之間建立一個對應關系,稱為串名的存儲映像
插入
#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; }
串---堆串