一、堆串概念。
与定长顺序穿的存储结构类似,都是用一组地址连续的存储单元存储串的字符序列,不同的是堆串的存储空间是动态分配的,只要存储空间分配成功,就不会担心串在插入或者连接时候出现截断的情况。
malloc(),free(),realloc() 这三个函数用来对动态存储进行操作。
二、基本操作。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
#include<stdio.h> #include<stdlib.h> #include<string.h> #define false 0 #define true 1 typedef struct { char *ch; //字符数组,若是非空则指向起始地址,若为空则NULL int len; //长度 }HString; //初始化 int HInit(HString *s){ s->ch=NULL; s->len=0; } //串赋值 int HStrAssign(HString *s, const char *chars){ int i=0; while (chars[i]!= '\0' ){ //确定串长 i++; } s->len=i; if (s->ch!=NULL){ free (s); } else { s->ch=( char *) malloc ((s->len+1)* sizeof ( char )); //0号单元不用 if (s==NULL){ printf ( "空间申请失败!" ); return false ; } for ( i=1;i<=s->len;i++){ //依次赋值 s->ch[i]=chars[i-1]; } } } //串遍历 int HSbianli(HString *s){ if (s->len==0){ printf ( "串空!" ); return false ; } else { int i; for (i=1;i<=s->len;i++){ printf ( "%c" ,s->ch[i]); } return true ; } } //串插入 int HStrInsert(HString *s, int pos, const HString t){ if (pos<1||pos>s->len){ printf ( "位置不合法!" ); return false ; } char *temp; temp=( char *) malloc ((s->len+t.len+1) * sizeof ( char )); int i; for (i=1;i<pos;i++){ //将s串pos之前(不含pos)的字符赋给temp temp[i]=s->ch[i]; } for (i=pos;i<pos+t.len;i++){ //将t串的元素赋给s temp[i]=t.ch[i-pos+1]; } for (i=0;i<=s->len-pos;i++){ temp[pos+t.len+i]=s->ch[i+pos]; } free (s->ch); s->ch=temp; s->len=s->len+t.len; return true ; } //串删除 int HStrDelete(HString *s, int pos, int len){ if (s->len==0){ printf ( "串空!" ); return false ; } else if (len>=s->len){ printf ( "非法位置!" ); return false ; } else { for ( int i=pos;i<s->len-pos;i++){ //跨度为len的依次赋值 s->ch[i]=s->ch[i+len]; } s->len=s->len-len; return true ; } } //串连接 int HStrCon(HString *s, const HString t){ s->ch=( char *) realloc (s->ch,(s->len+t.len+1) * sizeof ( char )); if (s==NULL){ printf ( "空间申请失败!" ); return false ; } if (s->len==0){ printf ( "串空!" ); return false ; } else { for ( int i=1;i<=t.len;i++){ s->ch[i+s->len]=t.ch[i]; } s->len=s->len+t.len; return true ; } } //求字串 int HStrchild(HString *s, int pos, int len){ if (s->len==0){ printf ( "串空!" ); return false ; } else { for ( int i=0;i<len;i++){ printf ( "%c" ,s->ch[i+pos]); } return true ; } } int main(){ HString s; HString s1; HInit(&s); HInit(&s1); char a[]={ "aaaaa" }; char b[]={ "bbb" }; HStrAssign(&s,a); HStrAssign(&s1,b); printf ( "-----将aaaaa赋值给s,bbb赋值给s1-----\n" ); printf ( "此时串s为:" ); HSbianli(&s); printf ( "\n此时串s1为:" ); HSbianli(&s1); printf ( "\n将s1连接到s为:" ); HStrCon(&s,s1); HSbianli(&s); printf ( "\n将串s1插入到s串的第二个位置:" ); HStrInsert(&s,2,s1); HSbianli(&s); printf ( "\n再将插入的s1串删除:" ); HStrDelete(&s,2,3); HSbianli(&s); printf ( "\ns1在第二个元素长度为2的子串为:" ); HStrchild(&s,2,2); } |
三、运行:
代码可运行。
总结
到此这篇关于C语言的堆串操作详解的文章就介绍到这了,更多相关C语言堆串内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/m0_61395860/article/details/122902129