数据结构---串
一、串结构的定义
字符串
1 2 | char *str = "abcdef" ; char str[7] = "abcdef" |
空字符串
char *str = " "; char str[7] = " "
空串
1 2 | char *str; str[0] = '\0' ; |
二、串结构之顺序存储实现
1、串头文件定义
#ifndef __SSTRING_H__ #define __SSTRING_H__ #include "stdio.h" #include "String.h" #define MAXSTRLEN 20 #define u_char unsigned char typedef u_char SString[MAXSTRLEN+1]; void InitString(SString S); void StrAssign(SString S, const char str[]); void StrCopy(SString Destination, SString Source); bool StrEmpty(SString S); int StrCompare(SString S, SString T); int StrLength(SString S); void StrConcat(SString T, SString s1, SString s2); void SubString(SString S, SString sub, int pos, int len); void StrInsert(SString S, int pos, SString T); void StrDelete(SString S, int pos, int len); void StrClear(SString S); void PrintString(SString S); ////////////////////////////////////////////////////// //void StrIndex(SString S, SString T, int pos); //void StrReplace(SString S, SString T, SString V); #endif
2、串c文件定义
#include "SString.h" void InitString(SString S) { S[0] = '\0'; } void StrAssign(SString S, const char str[]) { int len = strlen(str); for (int i = 0; i < len; i++) S[i] = str[i]; S[len] = '\0'; } void StrCopy(SString Destination, SString Source) { int len = StrLength(Source); for (int i = 0; i < len; i++) { Destination[i] = Source[i]; } Destination[len] = '\0'; } bool StrEmpty(SString S) { return S[0] == '\0'; } int StrCompare(SString S, SString T) { int result = 0; while (*S != '\0' || *T != '\0') { result = *S - *T; if (result != 0) break; S++; T++; } if (result > 0) return 1; else if (result < 0) return -1; else return 0; } int StrLength(SString S) { int len = 0; while (*S != '\0') { len++; S++; } return len; } void StrConcat(SString T, SString s1, SString s2) { int s1_len = StrLength(s1); int s2_len = StrLength(s2); if (s1_len + s2_len <= MAXSTRLEN) { int i = 0, j = 0; for (i = 0; i < s1_len; i++) T[i] = s1[i]; for (j = 0; j < s2_len; j++) T[j + i] = s2[j]; T[s1_len + s2_len] = '\0'; } else { int i = 0, j = 0; for (i=0; i < s1_len; i++) T[i] = s1[i]; for (j = 0; j < MAXSTRLEN-s1_len; j++) T[j + i] = s2[j]; T[MAXSTRLEN] = '\0'; } } void SubString(SString S, SString sub, int pos, int len) { int S_len = StrLength(S); if (pos < 0 || pos >= S_len || len < 0 || len > S_len) { printf("长度或者位置不对"); return; } for (int i = 0; i < len; i++) { sub[i] = S[pos+i]; } sub[len] = '\0'; } void StrInsert(SString S, int pos, SString T) { int s_len = StrLength(S); int t_len = StrLength(T); if (s_len + t_len <= MAXSTRLEN) { for (int i = s_len - 1; i >= pos; i--) S[t_len + i] = S[i]; for (int j = 0; j < t_len; j++) S[pos + j] = T[j]; S[s_len + t_len] = '\0'; } else { t_len = MAXSTRLEN - s_len; for (int i = s_len - 1; i >= pos; i--) S[t_len + i] = S[i]; for (int j = 0; j < t_len; j++) S[pos + j] = T[j]; S[s_len + t_len] = '\0'; } } void StrDelete(SString S, int pos, int len) { int s_len = StrLength(S); for (int i = 0; i < s_len-pos-len; i++) { S[i+pos] = S[pos + i + len]; } S[s_len-len] = '\0'; } void StrClear(SString S) { S[0] = '\0'; } void PrintString(SString S) { /*for (int i = 0; i < MAXSTRLEN; i++) { if (S[i] != '\0') printf("%c", S[i]); else break; }*/ printf("%s\n", S); }
3、串测试Main文件定义
#include "SString.h" void main() { /*SString S; SString T; InitString(S); InitString(T); const char *str = "xbcdef"; StrAssign(S, str); StrCopy(T, S); PrintString(T); StrAssign(T, "abcdex"); int res = StrCompare(S, T); printf("res=%d", res); SString Y; InitString(Y); StrAssign(S, "abcdex"); StrAssign(T, "abcdex"); StrConcat(Y, S, T); PrintString(S); PrintString(T); PrintString(Y); SString S1, SubStr; StrAssign(S1, "abcdex"); InitString(SubStr); SubString(S1, SubStr, 5, 2); PrintString(SubStr);*/ SString S; SString T; InitString(S); InitString(T); StrAssign(S, "abcefgh"); StrAssign(T, "xyzuv"); StrInsert(S,1,T); PrintString(S); StrDelete(S, 2,3); PrintString(S); }
二、串结构之堆存储实现
1、串头文件定义
#ifndef __HSTRING_H__ #define __HSTRING_H__ #include "stdio.h" #include "malloc.h" #include "assert.h" #include "string.h" typedef struct HString { char *ch; int length; }HString; void InitString(HString *S); void StrAssign(HString* S, const char str[]); void StrCopy(HString* Destination, HString* Source); bool StrEmpty(HString* S); int StrCompare(HString* S, HString* T); int StrLength(HString* S); void StrConcat(HString* T, HString* s1, HString* s2); void SubString(HString* S, HString* sub, int pos, int len); void StrInsert(HString* S, int pos, HString* T); void StrDelete(HString* S, int pos, int len); void StrClear(HString* S); void PrintString(HString* S); ////////////////////////////////////////////////////// //void StrIndex(HString* S, HString* T, int pos); //void StrReplace(HString* S, HString* T, HString* V); #endif
2、串c文件定义
#include "HString.h" void InitString(HString *S) { S->ch = NULL; S->length = 0; } void StrAssign(HString* S, const char str[]) { int len = strlen(str); if (S->ch != NULL) free(S->ch); S->ch = (char *)malloc(sizeof(char) * len); assert(S->ch != NULL); for (int i = 0; i < len; i++) { S->ch[i] = str[i]; } S->length = len; } void StrCopy(HString* Destination, HString* Source) { int len = StrLength(Source); if (Destination->ch != NULL) free(Destination->ch); Destination->ch = (char *)malloc(sizeof(char) * len); assert(Destination->ch != NULL); for (int i = 0; i < len; i++) { Destination->ch[i] = Source->ch[i]; } Destination->length = len; } bool StrEmpty(HString* S) { return S->length == 0; } int StrCompare(HString* S, HString* T) { if (S->length == 0 && T->length == 0) return 0; int i = 0; while (i < S->length && i < T->length) { if ((S->ch[i] - T->ch[i]) > 0) return 1; else if ((S->ch[i] - T->ch[i]) < 0) return -1; else i++; } if (i == S->length && i == T->length) return 0; else if (i == T->length) return 1; else return -1; } int StrLength(HString* S) { return S->length; } void StrConcat(HString* T, HString* s1, HString* s2) { if (T->ch != NULL) free(T->ch); int s1_len = StrLength(s1); int s2_len = StrLength(s2); T->ch = (char *)malloc(sizeof(char) * (s1_len + s2_len)); assert(T->ch != NULL); int i; for (i = 0; i < s1_len; i++) T->ch[i] = s1->ch[i]; for (int j = 0; j < s2_len; j++) T->ch[i + j] = s2->ch[j]; T->length = s1_len + s2_len; } void SubString(HString* S, HString* sub, int pos, int len) { if (pos < 0 || pos >= S->length || len<0 || len>S->length - pos) return; if (sub->ch != NULL) free(sub->ch); sub->ch = (char *)malloc(sizeof(char)*len); assert(sub->ch != NULL); for (int i = 0; i < len; i++) { sub->ch[i] = S->ch[pos + i]; } sub->length = len; } void StrInsert(HString* S, int pos, HString* T) { if (T->length == 0) return; if (pos<0 || pos > S->length) return; char *ch = (char*)realloc(S->ch, sizeof(char)*(S->length+T->length)); assert(ch != NULL); S->ch = ch; int i; for (i = S->length - 1; i >= pos; i--) { S->ch[i + T->length] = S->ch[i]; } for (i = 0; i < T->length; i++) { S->ch[pos + i] = T->ch[i]; } S->length = S->length + T->length; } void StrDelete(HString* S, int pos, int len) { if (pos < 0 || pos >= S->length) return; if (len <= 0 || len > S->length) return; for (int i = 0; i < len; i++) { S->ch[pos + i] = S->ch[pos+len + i]; } S->length = S->length - T->length; } void StrClear(HString* S) { S->length = 0; if (S->ch != NULL) free(S->ch); S->ch = NULL; } void PrintString(HString* S) { for (int i = 0; i < S->length; i++) { printf("%c", S->ch[i]); } printf("\n"); }
3、串测试Main文件定义
#include "HString.h" void main() { HString S; HString sub; InitString(&S); InitString(&sub); StrAssign(&S, "abcdefg"); SubString(&S, &sub, 2, 3); PrintString(&sub); PrintString(&S); HString T; InitString(&T); StrAssign(&T, "xyz"); StrInsert(&S, 7, &T); PrintString(&S); /*StrCopy(&T, &S); PrintString(&T); StrAssign(&T, "abcd"); int res = StrCompare(&S, &T); printf("res=%d\n", res); HString X; InitString(&X); StrConcat(&X, &S, &T); PrintString(&X);*/ }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!