串(string)的顺序方式实现----线性结构

昨天把 串(string) 数据结构的基本知识和堆的实现方式 为大家分享了,今天再来为大家分享一下串(string)的 顺序实现方式

如果小伙伴们对串的概念存在疑惑,请看上篇文章的介绍。

串(string)的顺序实现代码如下:

字符串的定义

#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(Node)
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef struct Node{		//线性表顺序表实现串的存储 
	char c[MAXSIZE];
	int len;
}*String;


所有方法的声明

int strAssign(String S, char *chars);				//初始化串操作 
int strInsert(String S, int pos, String P);			//串的插入操作 
int strDelete(String S, int pos, int len);			// 串的删除操作 
int strCompare(String S, String P);					//串的比较操作 
int strCopy(String S, String P);					//串的复制操作 
int strEmply(String S);			//判断空串的操作 
int strLength(String S);		//求串的长度操作 
int strClear(String S);			//清空串的内容 
int strCat(String S, String P);						//串的连接操作 
int strIndex(String S, int pos, String P);			//索引字串在主串的位置操作 
int subString(String Sub, String S, int pos, int len);		//获取字串的操作 
int strReplace(String S, String T, String V);				//字串的替换操作 
int strDestroy(String S);		//销毁串 
void printStr(String S);		//打印串 

初始化字符串操作

//初始化串操作,生成一个值等于 chars 的串 S 
int strAssign(String S, char *chars)
{
	int i = 0;
	S->len = 0;
	char *c = chars;
	while(*c != '\0' && S->len < MAXSIZE)
	{
		S->c[i] = *c;
		S->len++;
		i++;
		c++;
	}
	return OK;
}


插入子串

//顺序串的插入函数, 将字符串 t 插入下标为 pos 前的 S 串中 
int strInsert(String S, int pos, String P)
{
	if(pos < 0 || pos > S->len) return ERROR;
	if(S->len + P->len <= MAXSIZE)		//此条件成立说明插入后的串不会超出串最大长度 
	{
		for(int i = S->len + P->len - 1; i >= P->len + pos; i--)
		{
			S->c[i] = S->c[i-P->len];
		}		//pos 后的串后移, 为插入的串空出位置 
		for(int i = 0; i < P->len; i++)
		{
			S->c[i+pos] = P->c[i];
		}		//新串进行插入 
		S->len = S->len + P->len;	//长度变化 
	}
	else if(pos + P->len <= MAXSIZE)
	{						//此条件成立说明插入后的串会超出最大长度, 只能舍弃 pos 后挪的某些部分 
		for(int i = MAXSIZE - 1; i >= P->len + pos - 1; i--)
		{		//pos 后的串后移, 为插入的串空出位置 , 过程中可能丢失部分数据 
			S->c[i] = S->c[i-P->len];
		}
		for(int i = 0; i < P->len; i++)
		{		
			S->c[i+pos] = P->c[i];		//新的串进行插入 
		}
		S->len = MAXSIZE;	//串的长度改变为最大长度 
	}
	else		//此条件说明从 pos 位置插入的新串超出串的总长度 
	{
		for(int i = 0; i < MAXSIZE - pos; i++)
		{
			S->c[i+pos] = P->c[i];		//新的串进行插入 
		}
		S->len = MAXSIZE;	//串的长度变为最大长度 
	}
	return OK;
}

删除子串

//在串 s 中删除从下标 pos 起的 len 个字符 
int strDelete(String S, int pos, int len)
{
	if(pos < 0 || pos > (S->len - len)) return ERROR;	//pos 或 len 不合理都会导致删除失败 
	for(int i = pos + len; i < S->len; i++)
	{
		S->c[i-len] = S->c[i]; 			//进行删除 
	}
	S->len = S->len - len;		//串的长度改变 
	return OK;
}

索引子串

//串的简单模式匹配 Brute-Force(布鲁特-福斯)算法 
//最坏时间复杂度较高, 为 O(S->len * P->len) 
int strIndex(String S, int pos, String P)
{
	int start = pos, i = start, j = 0;
	if(P->len == 0) return ERROR;	//若串 P 的长度为空串, 则无法匹配 
	while(i < S->len && j < P->len)
	{
		if(S->c[i] == P->c[j])	//若匹配相等, i 和 j 累加 
		{
			i++;
			j++;
		}
		else	//否则从主串的下一个位置继续开始匹配 
		{
			start++;
			i = start;
			j = 0;
		}
	}
	if(j >= P->len) return start;
	else return -1;
}

截取子串

//用 Sub 返回串 S 的第 pos 个字符起长度为 len 的字串 
int subString(String Sub, String S, int pos, int len)
{
	if(pos < 0 || pos >= S->len) return ERROR;
	if(pos + len > MAXSIZE)
	{
		len = MAXSIZE - pos;	//若长度超限的话,仅能提取存在范围的串 
	}
	Sub->len = len;
	for(int i = pos; i < pos + len; i++)
	{
		Sub->c[i-pos] = S->c[i];
	}		//复制串 
	return OK;
}


替换子串

//串 S、T 和 V 存在且 T 是非空串 ,用 串 V 代替 S 的字串 T 
int strReplace(String S, String T, String V)
{
	if(T->len == 0) return ERROR;
	int start = 0, i = start, j = 0;
	while(start < S->len)
	{
		if(S->c[i] == T->c[j])
		{
			i++;
			j++;
		}
		else
		{
			start++;
			i = start;
			j = 0;
		}			//进行 S 串的查找,找到 T 执行以下 
		if(j >= T->len)
		{
			strDelete(S, start, T->len);	//删除字符串 T 
			strInsert(S, start, V);		//插入字符串 V 
			start = start + V->len;		//查询光标后挪 
			j = 0;
		}
	}
	return OK;
}

字符串比较

//字符串比较函数, S > P 返回 >0 , S = P, 返回 =0, S < P, 返回 <0 
int strCompare(String S, String P)
{
	for(int i = 0; i < S->len && i < P->len; i++)
	{		//两个串进行比较 
		if(S->c[i] != P->c[i]) return S->c[i] - P->c[i];
	}
	return S->len - P->len;		
}

字符串拷贝

//字符串拷贝, 将 P 字符串的内容拷贝至 S 串 
int strCopy(String S, String P)
{ 
	S->len = P->len;
	for(int i = 0; i < S->len; i++) S->c[i] = P->c[i];
	return OK;	
}

字符串的连接

//串的连接, 将串 P 连接至 串 S 
int strCat(String S, String P)
{
	if(S->len + P->len > MAXSIZE)	 
	{			//	若连接后的串超出字符串的最大长度
		for(int i = 0; i < MAXSIZE - S->len; i++)
		{
			S->c[i+S->len] = P->c[i];
		}
		S->len = MAXSIZE;
	}
	else
	{		//	若连接后的串未超出字符串的最大长度
		for(int i = 0; i < P->len; i++)
		{
			S->c[i+S->len] = P->c[i];
		}
		S->len = S->len + P->len;
	}
	return OK;
}



获取串的长度,判空、打印、清空、销毁串

//获取串的长度 
int strLength(String S)
{
	return S->len;
}

//判断串是否为空 
int strEmply(String S)
{
	if(S->len <= 0) return TRUE;
	else return FALSE;
}

void printStr(String S)		//输出串 S 
{
	for(int i = 0; i < S->len; i++)
	printf("%c", S->c[i]);
	printf("\n");
}


//将串 S 置为空串 
int strClear(String S)
{
	for(int i = 0; i < S->len; i++)
	S->c[i] = '\0';
	S->len = 0;
	return OK;
}

//销毁串 S; 
int strDestroy(String S)
{
	free(S);
	return OK;
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gaolw1102

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值