C语言数据结构之动态分配实现串
说明:堆分配存储实现串时,串并不是以'\0‘, 而是用数据项int length来表示的,所以和传统的c语言操作字符串有所不同。
头文件
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
|
#ifndef PILEHEAD_H_INCLUDED
#define PILEHEAD_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
char * ch ;
int len ;
}HString ;
int StrAssign( HString* pstr , char * pch ) ;
int StrLength( HString* pstr ) ;
int StrCompaer( HString* pstr1 , HString* pstr2 ) ;
int StrClear( HString* pstr ) ;
int StrConcat( HString* pstr , HString str1 , HString str2 ) ;
int StrSub( HString* sub , HString pstr , int pos , int length ) ;
int StrPrint( HString* pstr ) ;
#endif // PILEHEAD_H_INCLUDED
|
函数实现
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
|
#include "pilehead.h"
int StrAssign( HString* pstr , char * pch )
{
if ( !pstr->len )
{
free ( pstr->ch ) ;
}
int i ;
for ( i = 0 ; pch[i] != '\0' ; i++ )
{
;
}
if ( i == 0 )
{
pstr->ch = NULL ;
pstr->len = 0 ;
}
else
{
pstr->ch = ( char * ) malloc ( i * sizeof ( char ) ) ;
pstr->len = i ;
}
i = 0 ;
while ( i < pstr->len )
{
pstr->ch[i] = pch[i] ;
i++ ;
}
return 0 ;
}
int StrPrint( HString* pstr )
{
int i = 0 ;
while ( i < pstr->len )
{
printf ( "%c" , pstr->ch[i] ) ;
i++ ;
}
printf ( "\n" ) ;
return 0 ;
}
int StrLength( HString* pstr )
{
return pstr->len ;
}
int StrCompaer( HString* pstr1 , HString* pstr2 )
{
int i = 0 ;
int ret = 0 ;
while ( i < pstr1->len && i <pstr2->len )
{
ret = pstr1->ch[i] - pstr2->ch[i] ;
if ( ret < 0 )
{
return -1 ;
}
else if ( ret > 0 )
{
return 1 ;
}
else
{
i++ ;
}
}
int diff = pstr1->len - pstr2->len ;
if ( diff < 0 )
{
return -1 ;
}
else if ( diff == 0 )
{
return 0 ;
}
return 1 ;
}
int StrClear( HString* pstr )
{
if ( pstr->ch )
{
free ( pstr->ch ) ;
pstr->ch = NULL ;
}
pstr->len = 0 ;
return 0 ;
}
int StrConcat( HString* pstr , HString str1 , HString str2 )
{
StrClear( pstr ) ;
StrAssign( pstr , str1.ch ) ;
int len = str1.len ;
int len2 = 0 ;
while ( len2 < str2.len )
{
pstr->ch[len++] = str2.ch[len2++] ;
}
pstr->len = str1.len + str2.len ;
return 0 ;
}
int StrSub( HString* sub , HString pstr , int pos , int length )
{
if ( pos < 1 || pos > pstr.len || length < 1 || length > pstr.len - pos + 1 )
{
printf ( "ERROR!\n" ) ;
exit ( 1 ) ;
}
StrClear( sub ) ;
sub->ch = ( char * ) malloc ( length * sizeof ( char ) ) ;
sub->len = length ;
int i = 0 ;
while ( i < length )
{
sub->ch[i] = pstr.ch[pos - 1 + i] ;
i++ ;
}
return 0 ;
}
|
测试函数
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
|
#include "pilehead.h"
int main()
{
HString str ;
HString str1 ;
HString str2 ;
char * pch = "abcd" ;
StrAssign( &str , pch ) ;
StrAssign( &str1 , "abcd" ) ;
StrAssign( &str2 , "fhasdifhos" ) ;
StrPrint( &str ) ;
StrPrint( &str1 ) ;
/*StrClear( &str ) ;
StrPrint( &str ) ;
int i = StrCompaer( &str , &str1 ) ;
printf( "%d" , i ) ;*/
StrConcat( &str , str1 , str2 ) ;
StrPrint( &str ) ;
HString s ;
StrSub( &s ,str , 4 , 5 ) ;
StrPrint( &s ) ;
return 0;
}
|
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
原文链接:http://blog.csdn.net/llcomeon1_/article/details/7769169