数据结构--串的堆存储
来源:互联网 发布:微软程序员工资级别 编辑:程序博客网 时间:2024/05/19 03:29
以一组地址连续的存储单元存放串值字符序列,这些存储空间是在程序执行过程中动态分配的。在C语言中,存在一个称之为“堆”的自由存储区,并利用malloc()和realloc()来管理。
优点:堆分配存储结构的串既有顺序存储结构的特点,处理方便,操作中对串长又没有任何限制,更加的灵活。
存储结构为:
typedef struct{ char *ch; int length;}HString;堆存储串的基本操作
//串的堆分配存储#include<stdio.h>#include<stdlib.h>#include<string.h>#include<malloc.h>#define OK 1#define ERROR 0#define OVERFLOW -1typedef int Status;typedef struct{ char *ch; int length;}HString;Status StrAssign(HString &S,char *chars){ if(S.ch) free(S.ch); int len=strlen(chars); if(!len) { S.ch=NULL; S.length=0; } else { S.ch=(char *)malloc(len*sizeof(char)); if(!S.ch) exit(OVERFLOW); for(int i=0;i<len;i++) S.ch[i]=chars[i]; S.length=len; } return OK;}Status InitStr(HString &S){ S.ch=NULL; S.length=0; return OK;}Status ClearStr(HString &S){ if (S.ch) { free(S.ch); S.ch=NULL; } S.length=0; return OK;}Status StrCopy(HString &T,HString S){ if(T.ch) free(T.ch); T.ch=(char *)malloc(S.length*sizeof(char)); if(!T.ch) exit(OVERFLOW); for(int i=0;i<S.length;i++) { T.ch[i]=S.ch[i]; } T.length=S.length; return OK;}int StrLength(HString S){ return S.length;}Status StrEmpty(HString S){ return S.length==0?true:false;}int StrCompare(HString S,HString T){ for(int i=0;i<S.length&&i<T.length;i++) if(S.ch[i]!=T.ch[i]) return S.ch[i]-T.ch[i]; return S.length-T.length;}Status SubString(HString &Sub,HString S,int pos,int len){ if(pos<1||pos>S.length||len<0||len>S.length-pos+1) return ERROR; if(Sub.ch) free(Sub.ch); if(!len) { Sub.ch=NULL; Sub.length=0; } else { Sub.ch=(char *)malloc(len*sizeof(char)); if(!Sub.ch) exit(OVERFLOW); for(int i=0;i<len;i++) Sub.ch[i]=S.ch[pos+i-1]; Sub.length=len; } return OK;}Status Concat(HString &T,HString S1,HString S2){ int i; if(T.ch) free(T.ch); T.length=S1.length+S2.length; T.ch=(char *)malloc(sizeof(char)); if(!T.ch) exit(OVERFLOW); for(i=0;i<S1.length;i++) T.ch[i]=S1.ch[i]; for(i=0;i<S2.length;i++) T.ch[S1.length+i]=S2.ch[i]; return OK;}int Index(HString S,HString T,int pos){ if(pos<1||pos>S.length) return ERROR; int i=pos-1,j=0; while (i<S.length&&j<T.length) { if(S.ch[i]==T.ch[j]) { ++i; ++j; } else { i=i-j+1; j=0; } } if(j>=T.length) return i-T.length+1; else return 0;}Status StrInsert(HString &S,int pos,HString T){ if(pos<1||pos>S.length+1) return ERROR; if (T.length) { S.ch=(char *)realloc(S.ch,(S.length+T.length)*sizeof(char)); if(!S.ch) exit(OVERFLOW); for(int i=S.length-1;i>=pos-1;i--) S.ch[i+T.length]=S.ch[i]; for(int i=0;i<T.length;i++) S.ch[pos-1+i]=T.ch[i]; S.length=S.length+T.length; } return OK;}Status StrDelete(HString &S,int pos,int len){ if(pos<1||pos>S.length||len<0||len>S.length-pos+1) return ERROR; for(int i=pos-1+len;i<S.length;i++) S.ch[i-len]=S.ch[i]; S.length=S.length-len; S.ch=(char *)realloc(S.ch,S.length*sizeof(char)); return OK;}Status Replace(HString &S,HString T,HString V){ int i=1; do { i=Index(S,T,i); if (i) { StrDelete(S,i,StrLength(T)); StrInsert(S,i,V); i+=StrLength(V); } }while(i); return OK;}Status StrPrint(HString S){ for (int i=0;i<S.length;i++) { printf("%c",S.ch[i]); } printf("\n");}
- 数据结构--串的堆存储
- 数据结构——串的堆分配存储
- 看数据结构写代码(17) 串的堆式存储
- 数据结构--串--堆分配存储表示
- 数据结构 串的堆分配
- 4-2-串的堆存储结构-串-第4章-《数据结构》课本源码-严蔚敏吴伟民版
- 串的堆分配存储表示与实现--自己写数据结构
- 学习笔记------数据结构(C语言版)串的堆分配存储表示
- 算法与数据结构-数组/链表/堆/栈/队列的存储
- 串的堆分配存储
- 串的堆分配存储
- 串的堆分配存储
- 【数据结构】堆的应用
- 数据结构堆的实现
- 数据结构-堆的实现
- 数据结构,堆的学习
- 【数据结构】堆的建立
- 串的堆分配存储的连接
- c++模板
- 修改MySQL中root密码。
- HDU 3001
- 枚举操作
- TeamViewer密码存储
- 数据结构--串的堆存储
- Connect to Host Network - 虚拟网路装置(virtual network)
- Linux文件定位读写—lseek、pread、pwrite
- Java跳出当前for循环
- 能同时包含用户在不同的强需求领域所需的功能的产品可能不好使个好主意
- 设置Eclipse显示代码行数
- HDOJ 1005 Number Sequence
- VNC连接ubuntu10.04出现白屏问题解决
- FLASH位宽为8、16、32时,CPU与外设之间地址线的连接方法