当前位置:编程学习 > C/C++ >>

串的堆式存储结构

在C和C++语言中 ,提供一个称之为“堆”的共享空间,可以在程序运行过程中,系统利用函数malloc( )和free( )动态地申请或释放一块连续空间。
由于在C和C++语言中可以用指针对数组进行访问和操作,在串的存储和操作上也可以充分利用上述特性。
串的堆式存储结构类似于线性表的顺序存储结构,以一组地址连续的存储单元存放串值字符序列,其存储空间是在程序执行过程中动态分配的,而不是静态分配的。
串的堆式存储结构定义

Typedef struct  {  char *ch;   //指针域,指向存放串值的存储空间基址    int length;  // 整型域:存放串长  }HString;
说明:在这种存储结构下,由于串仍然是以数组存储的字符序列表示,因此此类串的操作是先为新生成的串分配一个存储空间,然后进行“字符序列的复制”。例如,如串插入操作StrInsert(S,pos ,T)(将串T插入到串S的第pos字符之前)的算法是,为串S重新分配大小等于串S和串T长度之和的存储空间,然后进行将S和T串值复制到新分配存储空间中。
串的一系列实现 www.zzzyk.com


/*
  串的堆式存储表示
 */ 
#include<stdio.h> 
#include<stdlib.h> 
#define OVERFLOW   -2//堆溢出 
#define OK          1//函数执行成功 
#define ERROR      -1//函数执行失败 
typedef int datatype; 
typedef struct{ 
    char*  ch;//指针域,指向存放串值的存储空间基址 
    int len;// 整型域:存放串长 
}HString; 
//初始化一个空串 
datatype InitHString(HString* s) 

    s->ch=(char*)malloc(sizeof(char)); 
    if(NULL==s->ch) return OVERFLOW; 
    s->ch=NULL; 
    s->len=0; 
    return OK; 

//为串赋值 
datatype assigment_string(HString* s, const char* str) 

    if(s->ch) free(s->ch); 
    int  length=0,i; 
    while(str[length]!='\0') 
        length++; 
    s->ch=(char*)malloc(length*sizeof(char)); 
    if(!s->ch) return OVERFLOW; 
    for(i=0;i<length;i++) 
        *(s->ch+i)=*(str+i); 
    s->len=length; 
    *(s->ch+s->len)='\0'; 
    return OK; 

//打印 
void PrintString(const HString* s) 

    int i=0; 
    while(*(s->ch+i)!='\0') 
    { 
        printf("%c",*(s->ch+i)); 
        i++; 
    } 
    printf("\n"); 

//求串的长度 
datatype GetLength(const HString* s) 

    int len=0; 
    while(*(s->ch+len)!='\0') 
        len++; 
    return len; 

//查找某个字符的位置,返回位序 
datatype HSLocal(const HString* s,char c) 

    int i; 
    for(i=0;i<s->len;i++) 
    { 
        if(c==*(s->ch+i)) 
            return i+1; 
    } 
    return -1; 

//串的连接 
datatype HSCat(HString* s,const HString* t) 

    int i=0; 
    char*  temp=(char*)malloc((s->len+t->len)*sizeof(char)); 
    if(!temp) return  OVERFLOW; 
    for(i=0;i<s->len;i++) 
        *(temp+i)=*(s->ch+i); 
    free(s->ch);//释放防止内存泄漏 
    for(i=0;i<t->len;i++) 
        *(temp+i+s->len)=*(t->ch+i); 
    s->len+=t->len; 
    s->ch=temp;//使s->ch重新指向temp 
    *(s->ch+s->len)='\0';       
    return OK; 

datatype HSCopy(HString* to, const   HString* from) 

    //如果目标串不为空则清空    
[cpp] view plaincopy
        if(to->ch) 
    { 
        free(to->ch); 
        to->ch=NULL; 
        to->len=0; 
    } 
    int i=0; 
    to->len=from->len; 
    to->ch=(char*)malloc(from->len*sizeof(char)); 
    if(!to->ch) return OVERFLOW; 
    for(i=0;i<from->len;i++) 
        *(to->ch+i)=*(from->ch+i); 
    *( to->ch+to->len)='\0'; 
    return OK; 
 

//在串s的pos位置处插入串t 
datatype HSInsert(HString* s,const HString *t,int pos) 

    if(pos<0 || pos>s->len) 
        return ERROR; 
    else{ 
        s->ch=(char*)realloc(s->ch,(s->len+t->len)*sizeof(char)); 
        int i,j=1; 
        //后移 
        for(i=s->len+t->len-1;i>=pos+t->len;i--) 
        { 
            *(s->ch+i)=*(s->ch+(s->len-j)); 
            j++;    
        } 
        //insert   
        for(i=0;i<t->len;i++) 
            *(s->ch+i+pos)=*(t->ch+i); 
    } 
    s->len+=t->len; 
    *(s->ch+s->len)='\0'; 
    return OK; 

//在串s的index位置删除长度为x个字符 
datatype HSdel(HString* s,int index,int x) 

    // index value invalid 
    if(index<0 || index>s->len) return ERROR; 
    //  if x+index> s->len 
    if((index+x)>=s->len) 
        s->len=index;      
    else 
    { 

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,