[数据结构]程杰字符串的基本操作代码

【数据结构】字符串顺序存储结构 #include #define MAXSTRLEN 255 //用户可在255以内定义最大串长 typedef unsigned char SString[MAXSTRLEN + 1]; //0号单元存放串的长度 //求字符串长度,把长度保存在S[0]中 void StrLength(SString S){ int m; for(m=1;S[m] !='\0';m++ 阅读详情

#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "time.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

#define MAXSIZE 40 /* 存储空间初始分配量 */

typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int ElemType; /* ElemType类型根据实际情况而定,这里假设为int */

typedef char String[MAXSIZE + 1]; /*  0号单元存放串的长度 */

/* 生成一个其值等于chars的串T */
Status StrAssign(String T, char *chars) {
	int i;
	if (strlen(chars) > MAXSIZE)
		return ERROR;
	else {
		T[0] = strlen(chars);
		for (i = 1; i <= T[0]; i++)
			T[i] = *(chars + i - 1);
		return OK;
	}
}

/* 由串S复制得串T */
Status StrCopy(String T, String S) {
	int i;
	for (i = 0; i <= S[0]; i++)
		T[i] = S[i];
	return OK;
}

/* 若S为空串,则返回TRUE,否则返回FALSE */
Status StrEmpty(String S) {
	if (S[0] == 0)
		return TRUE;
	else
		return FALSE;
}

/*  初始条件: 串S和T存在 */
/*  操作结果: 若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0 */
int StrCompare(String S, String T) {
	int i;
	for (i = 1; i <= S[0] && i <= T[0]; ++i)
		if (S[i] != T[i])
			return S[i] - T[i];
	return S[0] - T[0];
}

/* 返回串的元素个数 */
int StrLength(String S) {
	return S[0];
}

/* 初始条件:串S存在。操作结果:将S清为空串 */
Status ClearString(String S) {
	S[0] = 0;/*  令串长为零 */
	return OK;
}

/* 用T返回S1和S2联接而成的新串。若未截断,则返回TRUE,否则FALSE */
Status Concat(String T, String S1, String S2) {
	int i;
	if (S1[0] + S2[0] <= MAXSIZE) { /*  未截断 */
		for (i = 1; i <= S1[0]; i++)
			T[i] = S1[i];
		for (i = 1; i <= S2[0]; i++)
			T[S1[0] + i] = S2[i];
		T[0] = S1[0] + S2[0];
		return TRUE;
	} else { /*  截断S2 */
		for (i = 1; i <= S1[0]; i++)
			T[i] = S1[i];
		for (i = 1; i <= MAXSIZE - S1[0]; i++)
			T[S1[0] + i] = S2[i];
		T[0] = MAXSIZE;
		return FALSE;
	}
}

/* 用Sub返回串S的第pos个字符起长度为len的子串。 */
Status SubString(String Sub, String S, int pos, int len) {
	int i;
	if (pos < 1 || pos > S[0] || len < 0 || len > S[0] - pos + 1)
		return ERROR;
	for (i = 1; i <= len; i++)
		Sub[i] = S[pos + i - 1];
	Sub[0] = len;
	return OK;
}

/* 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0。 */
/* 其中,T非空,1≤pos≤StrLength(S)。 */
/* 蛮力法*/
int Index(String S, String T, int pos) {
	int i = pos; /* i用于主串S中当前位置下标值,若pos不为1,则从pos位置开始匹配 */
	int j = 1; /* j用于子串T中当前位置下标值 */
	while (i <= S[0] && j <= T[0]) /* 若i小于S的长度并且j小于T的长度时,循环继续 */
	{
		if (S[i] == T[j]) /* 两字母相等则继续 */
		{
			++i;
			++j;
		} else /* 指针后退重新开始匹配 */
		{
			i = i - j + 2; /* i退回到上次匹配首位的下一位 */
			j = 1; /* j退回到子串T的首位 */
		}
	}
	if (j > T[0])
		return i - T[0];
	else
		return 0;
}

/*  T为非空串。若主串S中第pos个字符之后存在与T相等的子串, */
/*  则返回第一个这样的子串在S中的位置,否则返回0 */
int Index2(String S, String T, int pos) {
	int n, m, i;
	String sub;
	if (pos > 0) {
		n = StrLength(S); /* 得到主串S的长度 */
		m = StrLength(T); /* 得到子串T的长度 */
		i = pos;
		while (i <= n - m + 1) {     /* 循环条件 */
			SubString(sub, S, i, m); /* 取主串中第i个位置长度与T相等的子串给sub */
			if (StrCompare(sub, T) != 0) /* 如果两串不相等 */
				++i;
			else
				/* 如果两串相等 */
				return i; /* 则返回i值 */
		}
	}
	return 0; /* 若无子串与T相等,返回0 */
}

/*  初始条件: 串S和T存在,1≤pos≤StrLength(S)+1 */
/*  操作结果: 在串S的第pos个字符之前插入串T。完全插入返回TRUE,部分插入返回FALSE */
Status StrInsert(String S, int pos, String T) {
	int i;
	if (pos < 1 || pos > S[0] + 1)
		return ERROR;
	if (S[0] + T[0] <= MAXSIZE) { /*  完全插入 */
		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 { /*  部分插入 */
		for (i = MAXSIZE; i <= pos; i--)
			S[i] = S[i - T[0]];
		for (i = pos; i < pos + T[0]; i++)
			S[i] = T[i - pos + 1];
		S[0] = MAXSIZE;
		return FALSE;
	}
}

/*  初始条件: 串S存在,1≤pos≤StrLength(S)-len+1 */
/*  操作结果: 从串S中删除第pos个字符起长度为len的子串 */
Status StrDelete(String S, int pos, int 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;
}

/*  初始条件: 串S,T和V存在,T是非空串(此函数与串的存储结构无关) */
/*  操作结果: 用V替换主串S中出现的所有与T相等的不重叠的子串 */
Status Replace(String S, String T, String V) {
	int i = 1; /*  从串S的第一个字符起查找串T */
	if (StrEmpty(T)) /*  T是空串 */
		return ERROR;
	do {
		i = Index(S, T, i); /*  结果i为从上一个i之后找到的子串T的位置 */
		if (i) /*  串S中存在串T */
		{
			StrDelete(S, i, StrLength(T)); /*  删除该串T */
			StrInsert(S, i, V); /*  在原串T的位置插入串V */
			i += StrLength(V); /*  在插入的串V后面继续查找串T */
		}
	} while (i);
	return OK;
}

/*  输出字符串T */
void StrPrint(String T) {
	int i;
	for (i = 1; i <= T[0]; i++)
		printf("%c", T[i]);
	printf("\n");
}

int main() {

	int i, j;
	Status k;
	char s;
	String t, s1, s2;
	printf("请输入串s1: ");

	k = StrAssign(s1, "abcd");
	if (!k) {
		printf("串长超过MAXSIZE(=%d)\n", MAXSIZE);
		exit(0);
	}
	printf("串长为%d 串空否?%d(1:是 0:否)\n", StrLength(s1), StrEmpty(s1));
	StrCopy(s2, s1);
	printf("拷贝s1生成的串为: ");
	StrPrint(s2);
	printf("请输入串s2: ");

	k = StrAssign(s2, "efghijk");
	if (!k) {
		printf("串长超过MAXSIZE(%d)\n", MAXSIZE);
		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的子串,请输入子串的起始位置,子串长度: ");

	i = 2;
	j = 3;
	printf("%d,%d \n", i, j);

	k = SubString(s2, t, i, j);
	if (k) {
		printf("子串s2为: ");
		StrPrint(s2);
	}
	printf("从串t的第pos个字符起,删除len个字符,请输入pos,len: ");

	i = 4;
	j = 2;
	printf("%d,%d \n", 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);

	return 0;
}

数据结构与算法经典教材盘点(7本精选) 本文精选了7本数据结构与算法经典教材,包括《数据结构教程》(PASCAL版)、《数据结构与算法分析》(C++版)等,详细解析了每本书的特色与适用场景。这些教材不仅涵盖了排序等核心算法,还通过生活案例和可视化教学帮助读者深入理解。无论是零基础学习者还是准备技术面试的开发者,都能找到适合自己的学习资源。 阅读详情

相关推荐

英飞凌功率MOSFET SPICE 瞬态仿真不收敛问题解决(基于TINA)

英飞凌功率MOSFET SPICE仿真容易出现不收敛问题,这个对于IGBT和SIC的管子应该是一样的,在瞬态仿真分析中,出现如下图所示的报错,Convergence problem。spice是为线性电路设计的,例如运算放大器、线性电源等,不是专门仿真开关电路的。在瞬态仿真时,仿真器是要不断迭代求解的,开关快速的跳变,容易在迭代式出现不收敛的问题。,由于时间步长减少,会消耗更多的计算机内存,如果运行多次内存消耗过大,会报“Out of memory”.解决方法是:报错工程,重启软件,内存重新计算。

miaoxiaokeji的博客 2294

Numpy中的inf数据类型

inf数据类型

z030601的博客 1267

【Telephony】Telephony总纲!Phone进程流程(AOSP)

整个Framework层的Telephony框架运行在一个叫做Phone(com.android.phone)的进程中。 Phone进程启动的过程中,会初始化非常多的分支功能,SIM卡流程初始化就是其中之一,所以我觉得有必要写一下Phone进程的框架

weixin_44513784的博客 1975

数据结构常用算法

1.3 最大子列和问题 //分治法 int Max3( int A, int B, int C ) { /* 返回3个整数中的最大值 */ return A > B ? A > C ? A : C : B > C ? B : C; } int DivideAndConquer( int List[], int left, int right ) { /* 分治法求Li...

weixin_43752912的博客 258

python blp模型 估计_随机系数Logit模型及Stata实现

欢迎投稿(荐稿)计量经济圈,计量相关都行邮箱:econometrics666@sina.cn作者:北京交通大学经济管理学院博士生,王琦珀。欢迎你加入计量经济圈社群,一起探讨前沿计量理论和实证方法。一、随机系数Logit模型1.背景实证产业组织(Empirical Industrial Organization,EIO)是目前产业组织理论的前沿,其中又以Ariel Pakes为带头人,其近期工作论文...

weixin_42298927的博客 2641

GB28181协议心跳机制:从标准解读到代码实现的保活策略

本文深入解析GB28181协议中的心跳机制,从标准解读到代码实现,详细介绍了保活策略的核心价值和底层逻辑。通过实战案例和技术要点,帮助开发者优化心跳间隔、超时次数等参数配置,提升安防监控系统的可靠性和性能。文章还提供了代码实现的防坑指南和特殊场景处理建议,适用于各类网络环境下的设备在线状态管理。

weixin_29611239的博客 105

INF的意思

INF表示最大的int值 int  4个字节,32位,首位是符号位 #define INF  0x7fffffff      宏定义,在程序中把0x7f7f7f7f用INF代替,这样方便修改 0x代表十六进制

crystaljy的博客 7342

Electron vue3 - 使用SerialPort与串口交互教程,计算机串行端口(COM口、USB转串口等)进行通信连接读取或写入Arduino、单片机、PLC、扫码枪、打印机、老式调制解调器!

实战Electron使用SerialPort与串口交互详细全过程,Electron-vue3与串口交互示例,Electron vue使用serialport实现串口交互通讯,Electron-vue使用serialport连接本地串口,electron-vue 台称串口对接 SerialPort,electron串口调试工具,electron+vue+serialport实现串口通信,串口通信serialport使用和调试,electron-vue使用serialport串口通信及踩过的坑(已解决!)ele

🏆 前端领域优质创作者 4640

对结构体进行排序,根据结构体中某一数据进行排序后对其对应的整个结构体变量进行排序

#include<stdio.h> #include<stdlib.h> #include<string.h> #define M 2 struct ST{ char name[10]; int num; int age; char addr[5]; int s[3]; float ave; }stu[M],temp; void s...

sunchanglan151的博客 4133

yolov26改进 | 融合改进篇 | 华为VanillaNet配合HSFPN助力yolov26有效涨点(教你如何融合创新点)

本文介绍华为VanillaNet主干与HSFPN融合改进的YOLOv26。VanillaNet采用极简卷积结构,减少复杂分支与冗余操作,兼顾特征提取效率;HSFPN原本面向白细胞多尺度检测,通过特征选择模块筛除无效响应,再利用特征融合模块整合不同层级信息,增强大小目标表达。两者分别优化Backbone与Neck,结构互补,可进一步搭配改进损失函数和检测头开展消融实验与论文创新。已有多位读者反馈在各自数据集上取得涨点。文中提供完整代码、配置文件、模块注册及Codex修改思路,方便复现。

Snu77的博客 445

152:vue+leaflet 判断一个点是否在一个电子围栏内

本文介绍了一个基于Vue+Leaflet的示例,演示如何判断点是否在电子围栏内。作者大剑师兰特(优快云知名博主)展示了使用polygon.getBounds().contains(latlng)方法检测点与多边形边界的关系。代码仅需80行,通过点击地图触发判断逻辑,结果显示提示信息。该技术可广泛应用于地理围栏、位置服务等场景,需要安装turf依赖。文章提供了完整源码和配置说明,适合GIS开发者学习参考。

大剑师兰特的GIS世界 756

[数据结构]程杰模式串匹配、KMP算法及其改进(代码)

#include "string.h" #include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 1

ilikeprograming的专栏 1117

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

程杰《大话数据结构》5-1 串(C语言源码+运行结果)

#include "string.h" #include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAX

春卷同学的博客 487

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

数据结构的开端

写在前面   学习每个新知识的时候我们不妨可以先勾勒出大体的框架,再去填充每个部分。这是我在课堂或者生活中所学习到的,绘画,建筑,开发项目,写书。这都是先勾勒框架,接着逐步填充。这段话是写给自己的,我希望我自己能够对无论什么一定要有知识脉络,再去逐步开展学习,切忌一头扎进书堆。以下是我初步的一个框架。   还有一点就是,我们要有抽象能力,听过知乎大佬说过,我们学习计算机没有抽象能力,很容易走进“歧途”。抽象的绘画会使我们难以理解,学习日常生活中学会抽象是很重要的。我们人与生俱来就有抽象能力,你可能不相信ba

吃醋不爱蘸饺子的胡诌乱造 503

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

程杰《大话数据结构》5-2 模式匹配(C语言源码+运行结果)

#include "string.h" #include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXS

春卷同学的博客 283

数据结构和算法:什么是数据结构,什么是算法

文章标题前言 前言   这几天在复习数据结构的

undefinedUser_1的博客 4870

Leetcode学习:字符串与字符串匹配

字符串(String):简称为串,是由零个或多个字符组成的有限序列。

m0_47199013的博客 386

代码随想录算法训练营DAY9|C++字符串Part.2|LeetCode:28.实现strStr()、459.重复的子字符串|KMP算法

关于KMP算法的理论基础,这里最推荐的是《大话数据结构》–程杰的讲解。其实按照题目的说法,如果这个字符串可以由重复子串构成,那么它前半部分和后半部分肯定是想定的(不过不一定非得从中间劈开的相等)方法或其他可能查找字符串中某个子串或字符位置的方法时,如果查找失败(即未找到指定的子串或字符),方法会返回。状态:典型的字符串匹配的问题,最主要的难点就是我们如何拿到模式串即字符串的子串呢?那么如果这是个重复的字符串,那么我们从后面再重复加一遍,变成。会被转换成无符号类型,结果是这个类型能表示的最大值。

糖炒栗子 1131

程杰《大话数据结构》8-4 B树(C语言源码+运行结果)

#include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 100 /* 存储空间初始分配量 */...

春卷同学的博客 316

程杰《大话数据结构》6-2 二叉树的链式结构实现(C语言源码+运行结果)

#include "string.h" #include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAX

春卷同学的博客 265

Java数据结构第一讲-排序算法

常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据结构,例如跳表之于redis、B+树之于mysql、倒排索引之于ES,熟悉了底层数据结构,对框架有了更深层次的理解,在后续程序设计过程中就更能得心应手。掌握常见数据结构和算法的重要性显而易见,本文主要讲解了几种常见的数据结构及基础的排序和查找算法,最后对高频算法笔试面试题做了总结。本文会持续补充,希望对大家日

Jet_qi的博客 1614

【数据结构与算法】—算法复杂度

本文介绍了数据结构与算法复杂度的基本概念,重点讨论了时间复杂度和空间复杂度的定义及其计算方法。时间复杂度通过函数式T(N)衡量算法的运行快慢,而空间复杂度则衡量算法运行所需的额外空间。文章通过具体代码示例,展示了如何计算和优化时间复杂度和空间复杂度,并介绍了大O渐进表示法在实际中的应用。最后,通过一道力扣题目的分析,展示了如何通过优化算法来减少时间复杂度和空间复杂度,强调了学习、思考和练习在算法优化中的重要性。

qq_2778465975的博客 1267

Qiuner赠书活动:算法图解、C++ Primer Plus、大话数据结构、Java项目全程开发实录、算法导论、深度学习、第一视角带你构建大模型GPT

人年轻时常觉空虚,总想找点什么填满自己。买书,是我曾经的一种方式。但买得多,看得少。最近想着,这些书放着也是放着,不如抽几本送给粉丝,包邮寄出。

Java、Python、AI、前沿技术等领域的技术总结和经验分享。 7777

python中类的详解_3.4、Python中的类详解(0601)

《大话数据结构》的作者程杰在博客园也有博客,网址是:http://cj723.cnblogs.com/面向对象编程(OOP)1、程序 = 指令 + 数据代码可以选择以指令为核心或以数据为核心进行编写2、两种范型以指令为核心:围绕“正在发生什么”进行编写面向过程编程:程序具有一系列线性步骤;主题思想是代码作用于数据以数据为核心:围绕“将影响谁”进行编写面向对像编程(OOP):围绕数据及为数据严格定义...

weixin_39579468的博客 310

7.数据结构中的树【由浅入深-数据结构】

本文介绍c语言实现数据结构中的树的相关内容。

插花弄玉的博客 1141
上一篇: [数据结构]程杰队列的链式存储结构及实现代码
下一篇: [数据结构]程杰模式串匹配、KMP算法及其改进(代码)
ilikeprograming
博客等级 码龄14年 46粉丝 18原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值