C语言数据结构——串的定长顺序存储结构
来源:互联网 发布:淘宝买家掉包犯法 编辑:程序博客网 时间:2024/06/05 18:16
#include<string.h> #include<ctype.h> #include<malloc.h> /* malloc()等 */ #include<limits.h> /* INT_MAX等 */ #include<stdio.h> /* EOF(=^Z或F6),NULL */ #include<stdlib.h> /* atoi() */ #include<io.h> /* eof() */ #include<math.h> /* floor(),ceil(),abs() */ #include<process.h> /* exit() */ /* 函数结果状态代码 */ #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 /* #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 */ typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */ typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */ #define MAXSTRLEN 255 //用户可以在255以内定义最大串长 typedef unsigned char SString[MAXSTRLEN + 1]; //0号单元存放串的长度 Status StrAssign(SString T, char *chars); //生成一个其值等于chars的串T Status StrCopy(SString T, SString S); //由串S赋值得到串T Boolean StrEmpty(SString S); //容S为空串则返回TRUE,否则返回FALSE int StrCompare(SString S, SString T); //若S>T,返回>0;若S=T,返回=0;若S<T,返回<0 int StrLength(SString S); //返回S的元素个数,成为串的长度 Status ClearString(SString S); // 将S清为空串 Status Concat(SString T, SString S1, SString S2); //用T返回由S1和S2l链接成的新串 Status SubString(SString Sub, SString S, int pos, int len); //用sub返回串S中第pos个字符起,长度为len的子串 int Index(SString S, SString T, int pos); // 若主串S中含有与串T相同的子串 ,则返回它在主串中第pos个字符之后,第一次出现的位置 Status Replace(SString S, SString T, SString V); // 用v替换S中出现的所有与T相等的不重叠的子串 Status StrInsert(SString S, int pos, SString T); //在串S的第pos个字符之前插入串T Status StrDelete(SString S, int pos, int len); //删除串S中第pos个字符起长度为len的子串 Status DestoryString(SString S); //串S被销毁 void StrPrint(SString T); //打印串T Status StrAssign(SString T, char *chars) { //初始条件:chars是字符串常量 //操作结果:生成一个其值等于chars的串T int len; len = strlen(chars); if (len > MAXSTRLEN) return ERROR; T[0] = len; for (int i = 1; i <= T[0]; i++) T[i] = *(chars + i - 1); return OK; } Status StrCopy(SString T, SString S) { //初始条件:串S存在 //操作结果:由串S赋值得到串T for (int i = 0; i <= S[0]; i++) T[i] = S[i]; return OK; } Boolean StrEmpty(SString S) { //初始条件:串S存在 //操作结果:若S为空串,则返回TRUE, 否则返回FALSE if (S[0] == 0) return TRUE; else return FALSE; } int StrCompare(SString S, SString T) { //初始条件:串S和T存在 //操作结果:若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0 for (int i = 1; i <= (S[0] > T[0] ? T[0] : S[0]); i++) { if (S[i] != T[i]) return S[i] - T[i]; } return S[0] - T[0]; } int StrLength(SString S) { //初始条件:串S存在 //操作结果:返回S的元素的个数,成为串的长度 return S[0]; } Status ClearString(SString S) { //初始条件:串S存在 //操作结果:将S清为空串 S[0] = 0; return OK; } Status Concat(SString T, SString S1, SString S2) { //初始条件:串S1和S2存在 //操作结果:用T返回由S1和S2连接而成的新串,如若未截断,则返回TRUE,否则,返回FALSE //S1[0] + S2[0] <= MAXSTRLEN if (S1[0] + S2[0] <= MAXSTRLEN) { T[0] = S1[0] + S2[0]; for (int i = 1; i <= S1[0]; i++) T[i] = S1[i]; for (int i = 1; i <= T[0]; i++) T[S1[0] + i] = S2[i]; return TRUE; } //S1[0] < MAXSTRLEN && S1 else { T[0] = MAXSTRLEN; for (int i = 1; i <= S1[0]; i++) T[i] = S1[0]; for (int i = 1; i <= MAXSTRLEN - S1[0]; i++) T[S1[0] + i] = S2[i]; return FALSE; } } Status SubString(SString Sub, SString S, int pos, int len) { //初始条件:串S存在,1<=pos<=StrLength(S)且0<=len<=StrLength(S)-pos+1 //操作结果:用Sub返回串中的pos个字符起长度为len的子串 if (pos<1 || pos >S[0] || len<0 || len>S[0] - pos + 1) return ERROR; Sub[0] = len; for (int i = 1; i <= len; i++) Sub[i] = S[pos + i - 1]; return OK; } int Index(SString S, SString T, int pos) { //初始条件:串S和T存在,T是非空串, 1<=pos <=S[0] //操作结果:若主串S中存在和串T值相同的子串,则返回它在主串S中第pos个字符之后第一次出现的位置;否则函数值为0 SString sub_temp; if (pos < 1 || pos >S[0]) return 0; for (int i = pos; i <= S[0] - T[0] + 1; i++) { SubString(sub_temp, S, i, T[0]); if (StrCompare(sub_temp, T) == 0) return i; } return 0; } Status Replace(SString S, SString T, SString V) { //初始条件:串S、T和V存在,T是非空串 //操作结果:用V替换主串S中出现的所有的与T相等的不重叠的子串 int i = 1; //从S的第一个字符起查找串T Status k; if (StrEmpty(V)) return ERROR; do { i = Index(S, T, i); //结构 if (i) { StrDelete(S, i, T[0]); k = StrInsert(S, i, V); //不能完全插入 if (!k) return ERROR; i += V[0]; } } while (i); return OK; } Status StrInsert(SString S, int pos, SString T) { //初始条件:串S和T都存在,1<=pos<=S[0]+1 //操作结果:在串S的第pos个字符之前插入T int i; if (pos<1 || pos>S[0] + 1) return ERROR; if (S[0] + T[0] <= MAXSTRLEN) //完全插入 { for (i = S[0]; i >= pos; i--) //移动数据 S[i + T[0]] = S[i]; for (i = pos; i<pos + T[0]; i++) //复制数据 S[i] = T[i - pos + 1]; S[0] = S[0] + T[0]; return TRUE; } else //部分插入,S被截断 { for (i = MAXSTRLEN; i >= pos; i--) S[i] = S[i - T[0]]; for (i = pos; i<pos + T[0] && i<MAXSTRLEN; i++) S[i] = T[i - pos + 1]; S[0] = MAXSTRLEN; return FALSE; } } Status StrDelete(SString S, int pos, int len) { // 初始条件: 串S存在,1≤pos≤StrLength(S)-len+1 // 操作结果: 从串S中删除第pos个字符起长度为len的子串 int i; if (pos<1 || pos>S[0] - len + 1 || len<0) return ERROR; for (i = pos + len; i <= S[0]; i++) //移动数据 S[i - len] = S[i]; S[0] -= len; return OK; } Status DestoryString(SString S) { //定长数组,无法销毁 return OK; } void StrPrint(SString T) { //输出字符串T。另加 for (int i = 1; i <= T[0]; i++) printf("%c", T[i]); printf("\n"); } int main() { int i, j; Status k; char s, c[MAXSTRLEN + 1]; SString t, s1, s2; printf("请输入串s1: "); //gets(c, _countof(c)); gets(c); k = StrAssign(s1, c); if (!k) { printf("串长超过MAXSTRLEN(=%d)\n", MAXSTRLEN); exit(0); } printf("串长为%d 串空否?%d(1:是 0:否)\n", StrLength(s1), StrEmpty(s1)); StrCopy(s2, s1); printf("拷贝s1生成的串为: "); StrPrint(s2); printf("请输入串s2: "); gets(c); k = StrAssign(s2, c); if (!k) { printf("串长超过MAXSTRLEN(%d)\n", MAXSTRLEN); exit(0); } i = StrCompare(s1, s2); if (i < 0) s = '<'; else if (i == 0) s = '='; else s = '>'; printf("串s1%c串s2\n", s); k = Concat(t, s1, s2); printf("串s1联接串s2得到的串t为: "); StrPrint(t); if (k == FALSE) printf("串t有截断\n"); ClearString(s1); printf("清为空串后,串s1为: "); StrPrint(s1); printf("串长为%d 串空否?%d(1:是 0:否)\n", StrLength(s1), StrEmpty(s1)); printf("求串t的子串,请输入子串的起始位置,子串长度: "); scanf("%d,%d", &i, &j); k = SubString(s2, t, i, j); if (k) { printf("子串s2为: "); StrPrint(s2); } printf("从串t的第pos个字符起,删除len个字符,请输入pos,len: "); scanf("%d,%d", &i, &j); StrDelete(t, i, j); printf("删除后的串t为: "); StrPrint(t); i = StrLength(s2) / 2; StrInsert(s2, i, t); printf("在串s2的第%d个字符之前插入串t后,串s2为:\n", i); StrPrint(s2); i = Index(s2, t, 1); printf("s2的第%d个字母起和t第一次匹配\n", i); SubString(t, s2, 1, 1); printf("串t为:"); StrPrint(t); Concat(s1, t, t); printf("串s1为:"); StrPrint(s1); Replace(s2, t, s1); printf("用串s1取代串s2中和串t相同的不重叠的串后,串s2为: "); StrPrint(s2); system("pause"); }
0 0
- C语言数据结构——串的定长顺序存储结构
- C语言数据结构——串的定长顺序存储结构
- (C语言)串定长顺序存储实现(数据结构十二)
- 数据结构(C语言)读书笔记10:串的定长顺序存储表示
- 数据结构c语言实现定长顺序串
- 串的定长顺序存储及其应用 C语言
- 串的定长顺序存储C语言实现
- 数据结构 串的定长顺序存储
- 串的定长顺序存储结构
- 串的定长顺序存储结构
- 学习笔记------数据结构(C语言版)串的定长顺序存储表示
- C语言数据结构——桟、桟的顺序存储结构表示
- C语言数据结构——数组顺序存储结构的实现和表示
- C语言数据结构——二叉树的顺序存储结构
- 串采用定长顺序存储结构的基本操作
- 串采用定长顺序存储结构的基本操作
- 串的定长顺序存储
- 数据结构--串--定长顺序存储表示
- [LeetCode]540. Single Element in a Sorted Array
- Python基础入门
- 定位人工智能时代的“拍照机器人”,美图M8为何能撂倒Angelababy等明星
- opencv MSER(最大极值稳定区域)
- Jmeter代理录制新方法 —— 通过Jmeter本身访问并下载全部资源
- C语言数据结构——串的定长顺序存储结构
- 如何获取摄像头的控制指令数据,进行模拟发送控制
- SpringMVC常用注解详解
- Oracle数据库性能监控常用Sql
- 根据中序遍历顺序构建完全二叉搜索树-04-树6 Complete Binary Search Tree (30分)
- weka文本聚类(2)--分词和停用词处理
- webpack打包vue文件时报错`Unexpected token:`
- java根据字段来对集合进行去重
- Java实现--模拟斗地主的洗牌和发牌