数据结构-串的堆分配存储

串的堆分配存储表示的特点是,仍以一组地址连续的存储单元存放串值字符序列,但它们的存储空间是在程序执行过程中动态分配的。使用动态分配函数malloc()和函数free()来管理存储空间的大小。

串的堆分配存储方法具有顺序存储的特点,又弥补了定长存储的大小限制,多以多被采用。

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <stdlib.h>
  4
  5 typedef int Status;
  6 #define OK 1
  7 #define ERROR 0
  8 #define OVERFLOW -2
  9
 10 typedef struct{
 11     char *ch;    //若是非空串,则按串长度分配存储区域,否则ch为NULL
 12     int length;    //串的长度
 13 }String;
 14
 15 /*生成一个其值等于等于串常量chars的串T*/
 16 Status StrAssign(String &T, char *chars){
 17     if(T.ch)
 18         free(T.ch);    //若串存储空间不为NULl 释放原有空间
 19     int i = strlen(chars);    //获取chars长度
 20     if(!i){
 21         T.ch = NULL;    //串常量chars长度为0时串为空串长度0存储区间指向NULL
 22         T.length = 0;
 23     }
 24     else{
 25         T.ch = (char *)malloc(i * sizeof(char));    //申请空间
 26         if(!T.ch)
 27             exit(OVERFLOW);
 28         for(int j = 0; j < i; j++)
 29             T.ch[j] = chars[j];        //写入chars串
 30         T.length = i;
 31     }
 32     return OK;
 33 }
 34
 35 /*由串S复制得到T*/
 36 Status StrCopy(String &T, String S){
 37     if(T.ch)
 38         free(T.ch);
 39     T.ch = (char*)malloc(S.length * sizeof(char));
 40     if(!T.ch)
 41         exit(OVERFLOW);
 42     for(int j = 0; j < S.length; j++)
 43         T.ch[j] = S.ch[j];
 44     T.length = S.length;
 45     return OK;
 46 }
 47
 48 /*如果串S为空串则返回true否则返回false*/
 49 bool StrEmpty(String S){
 50     if(S.length == 0)
 51         return true;
 52     else
 53         return false;
 54 }
 55
 56 /*若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0*/
 57 int StrCompare(String T, String S){
 58     for(int i = 0; i < S.length && i < T.length; i++)
 59         if(S.ch[i] != T.ch[i])
 60             return S.ch[i] - T.ch[i];
 61     return S.length - T.length;
 62 }
 63
 64 /*返回串的长度*/
 65 int StrLength(String S){
 66     return S.length;
 67 }
 68
 69 /*清空串*/
 70 Status ClearString(String &S){
 71     if(S.ch){
 72         free(S.ch);
 73         S.ch =  NULL;
 74     }
 75     S.length = 0;
 76     return OK;
 77 }
 78
 79 /*用T返回S1和S2两个串的连接串*/
 80 Status Concat(String &T, String S1, String S2){
 81     T.length = S1.length + S2.length;
 82     if(T.ch)
 83         free(T.ch);
 84     T.ch = (char*)malloc(T.length * sizeof(char));
 85     if(!T.ch)
 86         exit(OVERFLOW);
 87    for(int i=0; i < S1.length; i++)
 88      T.ch[i] = S1.ch[i];
 89    for(int i=0; i < S2.length;i++)
 90      T.ch[S1.length+i] = S2.ch[i];
 91     return OK;
 92 }
 93
 94 /*用Sub返回串S的第pos位置起的长度len的子串*/
 95 Status SubString(String &Sub, String S, int pos, int len){
 96     if(pos<1 || pos>S.length || len<0 || len>S.length-pos+1)
 97         return ERROR;
 98     if(Sub.ch)
 99         free(Sub.ch);
100     if(!len){
101         Sub.ch = NULL;
102         Sub.length = 0;
103     }
104     else{
105         Sub.ch = (char*)malloc(len*sizeof(char));
106         if(!Sub.ch)
107             exit(OVERFLOW);
108         for(int i = 0; i < len-1; i++)
109             Sub.ch[i] = S.ch[pos-1+i];
110         Sub.length = len;
111     }
112     return OK;
113 }
114
115
116 Status Index(String S, String T, int pos){
117     /*Index函数有两种写法,一种是调用串函数实现一个个字符匹配;另一种是模式串匹配法,详细写法与
118         定长表示法的写法基本一样,可以去参考另一篇定长表示串的函数
119     */
120    return ERROR;
121 }
122
123 /*在串S的第pos个字符之前插入串T*/
124 Status StrInsert(String S,int pos,String T)
125  {
126    if(pos<1 || pos>S.length+1)
127      return ERROR;
128    if(T.length){
129      S.ch = (char*)realloc(S.ch,(S.length+T.length)*sizeof(char));
130      if(!S.ch)
131        exit(OVERFLOW);
132      for(int i = S.length-1; i >= pos-1; --i)
133        S.ch[i+T.length] = S.ch[i];
134      for(int i = 0; i < T.length; i++)
135        S.ch[pos-1+i] = T.ch[i];
136      S.length += T.length;
137    }
138    return OK;
139  }
140
141 /* 从串S中删除第pos个字符起长度为len的子串 */
142  Status StrDelete(String S,int pos,int len)
143  {
144    if(S.length < pos+len-1)
145      exit(ERROR);
146    for(int i = pos-1; i <= S.length-len; i++)
147      S.ch[i] = S.ch[i+len];
148    S.length -= len;
149    S.ch = (char*)realloc(S.ch,S.length*sizeof(char));
150    return OK;
151  }
152  /*用V替换主串S中出现的所有与T相等的不重叠的子串 */
153  Status Replace(String &S,String T,String V)
154  {
155    int i=1;
156    if(StrEmpty(T))
157      return ERROR;
158    do{
159      i=Index(S,T,i);
160      if(i)
161      {
162        StrDelete(S,i,StrLength(T));
163        StrInsert(S,i,V);
164        i += StrLength(V);
165      }
166    }while(i);
167    return OK;
168  }
时间: 2024-12-31 03:30:30

数据结构-串的堆分配存储的相关文章

C语言实现数据结构串(堆分配存储表示法)

-------------------------------------------- 堆分配存储表示法 -------------------------------------------- 存储结构: 构建堆来存储字符串,本质上是顺序表 -------------------------------------------- 实现代码: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h>

串的堆分配存储表示与实现--自己写数据结构

本次实现的数据结构是关于串的表示与实现,首先讲串的堆分配存储表示与实现,后面的博客将贴出串的另外数据结构的表示和实现 heapstring.h文件存放数据结构体,如下 #ifndef _HEAPSRING_H_ #define _HEAPSRING_H_ typedef struct _HString { char *ch; int length; }HString,*pHString; pHString init_null_string(void); pHString init_heap_st

数据结构—串的堆分配

#include<stdio.h> #include<stdlib.h> typedef struct { char *ch; int length; }HString; void StrAssign(HString &T,char *chars); void StrLength(HString S); void StrCompare(HString S,HString T); void ClearString(HString &S); void Concat(HS

串的堆分配存储结构

串的堆分配存储,其具体实现方式是采用动态数组存储字符串. 通常,编程语言会将程序占有的内存空间分成多个不同的区域,程序包含的数据会被分们别类并存储到对应的区域.拿C语言来说,程序会将内存分为4个区域,分别为堆区.栈区.数据区和代码区.其中的堆分配 与其他区域不同,堆区的内存空间需要程序员手动使用malloc函数申请,并且在不用后要手动通过free函数将其释放 代码: #include <stdio.h>#include <stdlib.h>#include <string.h

堆分配存储表示的串其基本操作的实现

以一组地址连续的存储单元存放串值字符序列,但它们的存储空间是在程序执行过程中动态分配而得. 下面是基本操作的头文件 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define MYOVERFLOW -2 typedef int Status; //-------串的堆分配存储表示--------- typedef struct{ char *ch; //若是非空串,则按串长分配

堆分配存储的串的表示和实现

串的堆分配存储结构 struct HString { char * ch;//若是非空串,则按串长分配存储区:否则ch为NULL int length;//串长度 }; 堆分配存储的串的12个基本操作 #define DestroyString ClearString//DestroyString()和ClearString()作用相同 void InitString(HString &S){ S.length = 0; S.ch = NULL; } void ClearString(HStri

23、蛤蟆的数据结构笔记之二十三串的堆分配实现

23.蛤蟆的数据结构笔记之二十三串的堆分配实现 本篇名言:"人的价值是由自己决定的." 接下去是看下如何用C实现串. 欢迎转载,转载请标明出处: 1.  定义 定义结构体如下,一种字符数组,一个表示数组的长度.以一组地址连续的存储单元存放串值字符序列,但是他们的存储空间是在程序执行过程中动态分配而得. typedefstruct { charch[MAXLEN]; intlen; }SString; 2.  复制 将一个串内容复制到另一个结构体中区. SString StrCopy(S

【数据结构】串的堆分配表示与实现

采用堆分配存储表示的串被称为堆串,与顺序串相比,地址空间仍是连续,但空间是在程序执行时动态分配的. 程序中会使用到的realloc函数: //realloc : (void *)reelloc (void *ptr,unsigned newsize); //使用 : char *str; //   str = (char *)realloc(str,20); 代码实现如下: <span style="font-size:18px;">#pragma once #includ

javascript实现数据结构: 串的块链存储表示

和线性表的链式存储结构相类似,也可采用链式方式存储串值.由于串结构的特殊性--结构中的每个数据元素是一个字符,则用链表存储串值时,存在一个"结点大小"的问题,即每个结点可以存放一个字符,也可以存放多个字符. 下面是结点大小为4(即每个结点存放4个字符)的链表: head --> (a) --> (b) --> (c) --> ... --> (i) 当结点大小大于1时,由于串长不一定是结点大小的整倍数,则链表中的最后一个结点不一定全被串值占满,此时通常补上