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

————————————————————————————————————————————

  • 堆分配存储表示法

————————————————————————————————————————————

存储结构:

构建堆来存储字符串,本质上是顺序表

————————————————————————————————————————————

实现代码:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 #define OK 1
  5 #define ERROR 0
  6 #define TRUE 1
  7 #define FALSE 0
  8 #define OVERFLOW -2
  9 #define STR_INIT_SIZE 100
 10 #define STRINCREMENT 10
 11 typedef int Status;
 12 typedef struct
 13 {
 14     char *ch; //空串时指向NULL,非空串时按串长分配存储区
 15     int length;
 16 } HString;
 17 Status InitString(HString *T) //初始化字符串
 18 {
 19     //指针指向NULL,长度为0即可
 20     //p.s.申请内存空间的过程在赋值中完成
 21     T->ch = NULL;
 22     T->length = 0;
 23     return OK;
 24 }
 25 Status StrAssign(HString *T, char *p) //字符串赋值
 26 {
 27     //1.判断T是否已有内容,有则释放
 28     //2.判断赋值的内容是否为空,为空则不赋值
 29     //3.根据长度向内存申请空间,遍历赋值给T,长度等于字符串长度
 30     //p.s.在这里赋值不赋\0,在打印时通过长度来判断字符串结尾
 31     int i, len = strlen(p);
 32     if (T->ch)
 33         free(T->ch);
 34     if (!len)
 35     {
 36         T->ch = NULL;
 37         T->length = 0;
 38         return ERROR;
 39     }
 40     else
 41     {
 42         T->ch = (char *)malloc(len * sizeof(char));
 43         if(!T->ch)
 44             exit(OVERFLOW);
 45         for (i = 0; i < len; ++i)
 46             T->ch[i] = p[i];
 47         T->length = len;
 48         return OK;
 49     }
 50 }
 51 Status StrPrint(HString T) //打印字符串
 52 {
 53     //通过长度判断打印的字符数
 54     int i;
 55     for (i = 0; i < T.length; ++i)
 56         printf("%c", T.ch[i]);
 57     printf("\n");
 58 }
 59 Status StrLength(HString T) //字符串长度
 60 {
 61     return T.length;
 62 }
 63 Status StrEmpty(HString T) //字符串判空
 64 {
 65     if (T.length == 0)
 66         return TRUE;
 67     else
 68         return FALSE;
 69 }
 70 Status Concat(HString *T, HString S1, HString S2) //字符串联接
 71 {
 72     //1.申请长度为S1和S2之和的字符串空间
 73     //2.先将S1的元素逐个赋值到T中
 74     //3.再将S2的元素逐个赋值到T中
 75     int i;
 76     if (T->ch)
 77         free(T->ch);
 78     T->ch = (char *)malloc((S1.length + S2.length) * sizeof(char));
 79     if (!T->ch)
 80         exit(OVERFLOW);
 81     for (i = 0; i < S1.length; ++i)
 82         T->ch[i] = S1.ch[i];
 83     for (i = 0; i < S2.length; ++i)
 84         T->ch[i + S1.length] = S2.ch[i];
 85     T->length = S1.length + S2.length;
 86     return OK;
 87 }
 88 Status StrDelete(HString *T, int pos, int len) //删除字符串中某个位置固定长度的子串
 89 {
 90     //pos是字符串中的位置,删除包括pos的len长度
 91     int i;
 92     if (pos >= T->length)
 93         return ERROR;
 94     else if(pos + len > T->length)
 95         len = T->length - pos + 1;
 96     for (i = pos - 1; i < T->length - len; ++i)
 97         T->ch[i] = T->ch[i + len];
 98     T->length -= len;
 99     T->ch = (char *)realloc(T->ch, T->length * sizeof(char));
100     if (!T->ch)
101         exit(OVERFLOW);
102     return OK;
103 }
104 Status StrInsert(HString *S, int pos, HString T)
105 {
106     //pos是字符串中的位置,插入时原来的元素(包括pos位)后移
107     int i, len;
108     --pos;
109     len = StrLength(T);
110     S->ch = (char *)realloc(S->ch, (S->length + len) * sizeof(char));
111     if (pos > S->length)
112         pos = S->length;
113     for (i = S->length - 1; i > pos - 1; --i)
114         S->ch[i + len] = S->ch[i];
115     for (i = 0; i < len; ++i)
116         S->ch[i + pos] = T.ch[i];
117     S->length += len;
118     if (!S->ch)
119         exit(OVERFLOW);
120     return OK;
121 }
122 Status Index(HString S, HString T, int pos) //在字符串S中索引位置pos之后的子串t
123 {
124     //同定长顺序存储表示法
125     //p.s.传入的pos是字符串的位置,从1开始
126     //p.s.初始状态下T为非空串
127     if (StrEmpty(T))
128         return ERROR;
129     int i = pos - 1, j = 0;
130     while(i < S.length && j < T.length)
131     {
132         if (S.ch[i] == T.ch[j])
133         {
134             ++i;
135             ++j;
136         }
137         else
138         {
139             i = i - j + 1;
140             j = 0;
141         }
142     }
143     if (j >= T.length)
144         return i - j + 1;
145     else
146         return 0;
147 }
148 Status Replace(HString *T, HString S1, HString S2) //将字符串T中等于S1的子串替换成为S2
149 {
150     //循环索引子串S1在字符串T中的位置(每次的位置从上一次位置后开始查找)
151     //从查找到的位置-1开始替换
152     //p.s.初始状态下S1为非空串
153     int pos = 0;
154     if (StrEmpty(S1))
155         return ERROR;
156     //当pos存在时循环,当全部索引完毕后pos为0
157     //将索引到的该位置对应的子串删除后再插入新的子串
158     do
159     {
160         pos = Index(*T, S1, pos);
161         if (pos)
162         {
163             StrDelete(T, pos, StrLength(S1));
164             StrInsert(T, pos, S2);
165         }
166     }
167     while(pos);
168     return OK;
169 }
170 Status SubString(HString *Sub, HString S, int pos, int len)
171 {
172     int i;
173     if (pos < 1 || len > S.length || len < 0 || len > S.length - pos + 1)
174         exit(OVERFLOW);
175     if (Sub->ch)
176         free(Sub->ch);
177     //如果查询的长度为0,则子串置空
178     if (len == 0)
179     {
180         Sub->ch = NULL;
181         Sub->length = 0;
182     }
183     else
184     {
185         Sub->ch = (char *)malloc(len * sizeof(char));
186         for (i = 0; i < len; ++i)
187             Sub->ch[i] = S.ch[pos + i - 1];
188         Sub->length = len;
189     }
190     return OK;
191 }
192 int main()
193 {
194     int pos;
195     HString t, s, r;
196     char *p = "Hello,String!", *q = "Bye,Bye!";
197     printf("String *p: %s\n", p);
198     InitString(&t);
199     StrAssign(&t, p);
200     printf("StrAssign... OK.\nString t : ");
201     StrPrint(t);
202     printf("------------------------------\n");
203     printf("StrLength... OK.\nString Length : %d\n", StrLength(t));
204     printf("StrEmpty... OK.\n");
205     if (StrEmpty(t))
206         printf("String is Empty.\n");
207     else
208         printf("String is not Empty.\n");
209     printf("------------------------------\n");
210     InitString(&s);
211     StrAssign(&s, q);
212     printf("String s : ");
213     StrPrint(s);
214     printf("------------------------------\n");
215     InitString(&r);
216     Concat(&r, t, s);
217     printf("Concat... OK.\n");
218     printf("String r : ");
219     StrPrint(r);
220     printf("------------------------------\n");
221     printf("StrDelete... OK.\n");
222     StrDelete(&r, 14, 4);
223     printf("String r : ");
224     StrPrint(r);
225     printf("------------------------------\n");
226     printf("StrInsert... OK.\n");
227     StrAssign(&t, "Bye,Bye,Bye!");
228     StrInsert(&r, 14, t);
229     printf("String r : ");
230     StrPrint(r);
231     printf("------------------------------\n");
232     StrAssign(&t, "ye");
233     printf("Index... ");
234     StrPrint(t);
235     pos = 1;
236     while(pos)
237     {
238         pos = Index(r, t, pos + 1);
239         if (!pos)
240             break;
241         printf("Position : %d\n", pos);
242     }
243     printf("------------------------------\n");
244     StrAssign(&t, "ye");
245     StrAssign(&s, "oo");
246     Replace(&r, t, s);
247     printf("Replace ye -> ooo ... OK.\n");
248     printf("String r : ");
249     StrPrint(r);
250     printf("------------------------------\n");
251     SubString(&t, r, 7, 4);
252     printf("SubString... OK.\n");
253     printf("String SubString : ");
254     StrPrint(t);
255     printf("------------------------------\n");
256     return OK;
257 }
时间: 2024-10-26 19:37:38

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

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

本次实现的数据结构是关于串的表示与实现,首先讲串的堆分配存储表示与实现,后面的博客将贴出串的另外数据结构的表示和实现 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

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

串的堆分配存储表示的特点是,仍以一组地址连续的存储单元存放串值字符序列,但它们的存储空间是在程序执行过程中动态分配的.使用动态分配函数malloc()和函数free()来管理存储空间的大小. 串的堆分配存储方法具有顺序存储的特点,又弥补了定长存储的大小限制,多以多被采用. 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 5 typedef int Status; 6 #define O

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

以一组地址连续的存储单元存放串值字符序列,但它们的存储空间是在程序执行过程中动态分配而得. 下面是基本操作的头文件 #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; //若是非空串,则按串长分配

串的堆分配存储结构

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

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

串的堆分配存储结构 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

C语言实现数据结构串(定长顺序存储表示法)

-------------------------------------------- 定长顺序存储表示法 -------------------------------------------- 存储结构: 使用字符串数组作为存储,定义字符串数组长度为MAXSTRLEN+1(0位置用来存放字符串长度) -------------------------------------------- 操作方法: 字符串赋值 通过将控制台输入的字符串赋值给串S1(从1开始存储),如果字符串长度超过限制,

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

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

串的动态存储分配

串:由零个或者多个字符组成的有限序列.零个字符的串称为空串,和空格串[一个或多个空格诸城的串]有区别,请注意比较.在串的抽象数据类型中,有五个操作组成最小操作子集,分别是串赋值StrAssign,串比较StrCompare,求串长StrLength ,串联接Concat,求子串SubString.现以串的动态存储结构为例,将5个基本操作实现如下: 具体介绍详见注释. 1 /** 2 在串的抽象数据类型的13中操作中:串赋值StrAssign,串比较StrCompare,求串长StrLength

《串---堆存储结构》

//堆分配存储表示 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; typedef struct { char *c