字符串链式实现

1.头文件HString.h

#pragma once

#include<iostream.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>

#define SIZE 255
typedef struct HString
{
	char *ch;
	int length;
}HString;

void Show();   //菜单显示
void InitHString(HString *T);//初始化
void StrAssign(HString *T, char *str);//初始化字符串
void PrintString(HString *T); //显示字符串
int Length(HString *S);  //求字符串长度
bool StrEmpty(HString *S);//判空
bool STrFull(HString *S);//判满
void StrCopy(HString *T, HString *S);//复制字符串
void DestroyString(HString *S);  //摧毁字符串
int StrDelete(HString *T, int pos, int len);  //按位置和长度删除字符串
void Replace(HString *T, HString *P, HString *V,int pos);//按位置替换字符串
int Index(HString *T, int pos, HString *P);//按位置匹配字符串
void StrInsert(HString *D, int pos, HString *T);//按位置插入字符串
int SubString(HString *D,HString *S, int pos, int len);//按位置获取字符串
void ClearString(HString *S);   //清理字符串
int StrCompare(HString *T, HString *S);//比较字符串
void StringConcat(HString *T, HString *s1,HString *s2);//链接字符串

2.功能模块HString.cpp

#include"HString.h"

void Show()
{
	cout<<"*********************************************"<<endl;
	cout<<"*[1]:  初始化字符串        [2]:拷贝字符串   *"<<endl;
	cout<<"*[3]:  比较字符串          [4]:求字符串长度 *"<<endl;
	cout<<"*[5]:  显示字符串          [6]:清理字符串   *"<<endl;
	cout<<"*[7]:  链接字符串          [8]:按位置得子串 *"<<endl;
	cout<<"*[9]:  匹配字符串          [10]:替换字符串  *"<<endl;
	cout<<"*[11]: 插入字符串          [12]:按位删除    *"<<endl;
	cout<<"*[13]: 摧毁字符串          [0]:结束程序     *"<<endl;
	cout<<"*********************************************"<<endl;
	cout<<"请选择:";
}
int StrDelete(HString *T, int pos, int len)
{
	if((pos+len)>T->length)
		return -1;
	char *ret=T->ch;
	int i=0;
	while(i<len)//abcdefg
	{
		ret[pos+i]=ret[i+pos+len];
		i++;
	}
	return 1;
}
void StrInsert(HString *D, int pos, HString *T)
{
	if(pos<0)
		return;
	char *ret=D->ch;
	for(int i=D->length;i>pos;i--)
	{
		ret[i+T->length]=ret[i];
	}
	while(pos--)
	{
		ret++;
	}

	while(*T->ch!='\0')
	{
		*ret++=*T->ch++;
	}
}

void Replace(HString *T, HString *P, HString *V,int pos)//按位置替换字符串,用V字符串去替换
{
	int wei=Index(T,pos,P);
	if(wei==-1)
	{
		cout<<"没有找到合适的替换位置"<<endl;
		return;
	}
	char *ret=T->ch;
	while(*V->ch!='\0')
	{
		*ret++=*V->ch++;
	}
}

int Index(HString *T, int pos, HString *P)//按位置匹配,P是子串T是父串
{
	if(pos+P->length>T->length)
		return -1;
	int count=pos;
	while(count--)
	{
		T->ch++;
	}
	char *ret=T->ch;
	char *p=P->ch;
	int t_size=pos;
	int length=T->length-P->length;
	while(*p!='\0' && length>=P->length)
	{
		if(*ret==*p)
		{
			ret++;
			p++;
		}
		else
		{
			p=P->ch;
			ret=++T->ch;
			t_size++;
			length--;
		}
	}
	if(length<P->length)
		return -1;
	else
		return t_size;
}

int SubString(HString *D,HString *S, int pos, int len)
{
	if(pos+len>S->length)
		return -1;
	int i=0;
	while(i++<pos)
	{
		S->ch++;
	}
	char *ret=S->ch;
	char *t=D->ch;
	while(len--)
	{
		*t++=*ret++;
	}
	*t='\0';
	return 1;
}
void StringConcat(HString *T, HString *s1,HString *s2)
{
	if(((s1->length)+(s2->length))>SIZE)
		return;
	char *ret=T->ch;
	while(*s1->ch!='\0')
	{
		*ret++=*s1->ch++;
	}
	while(*s2->ch!='\0')
	{
		*ret++=*s2->ch++;
	}
	*ret=*s2->ch;
}
void DestroyString(HString *S)
{
	free(S->ch);
	S->ch=NULL;
	S->length=0;
}
void ClearString(HString *S)
{
	*S->ch='\0';
	S->length=0;
}
int Length(HString *S)
{
	return S->length;
}
int StrCompare(HString *T, HString *S)
{
	while(*T->ch==*S->ch)
	{
		T->ch++;
		S->ch++;
	}
	if(*T->ch>*S->ch)
		return 1;
	else if(*T->ch<*S->ch)
		return -1;
	else
		return 0;
}

void StrCopy(HString *T, HString *S)
{
	if(STrFull(T))
	{
		cout<<"空间已满"<<endl;
		return;
	}
	char *p=T->ch;
	while(*S->ch!='\0')
	{
		*p++=*S->ch++;
	}
	*p=*S->ch;
}

void InitHString(HString *T)
{
	T->ch=(char*)malloc(sizeof(char)*SIZE);
	if(T->ch==NULL)
	{
		cout<<"开辟内存失败"<<endl;
		return;
	}
	T->length=0;
}

bool StrEmpty(HString *S)
{
	return S->length==0;
}
bool STrFull(HString *S)
{
	return S->length>=SIZE;
}
void StrAssign(HString *T, char *str)
{
	if(STrFull(T))
	{
		cout<<"内存已满"<<endl;
		return;
	}
	char *Str=T->ch;

	while(*str!='\0')
	{
		*Str++=*str++;
		T->length++;
	}
	*Str=*str;
}

void PrintString(HString *T)
{
	char *str=T->ch;
	while(*str!='\0')
	{
		cout<<*str;
		str++;
	}
	cout<<endl;
}

3.主函数main.cpp

#include"HString.h"

void main()
{
	char *str="abcdefg";
	char *ret="xy";
	char *p="ggg";

	HString S;
	HString TS;
	HString RS;

	InitHString(&S);
	InitHString(&TS);
	InitHString(&RS);
	int pos=1;
	int length=0;
	while(pos)
	{
		Show();
		cin>>pos;
		switch(pos)
		{
		case 1:
			StrAssign(&S,str);
			StrAssign(&TS,ret);
			break;
		case 2:
			StrCopy(&TS,&S);
			cout<<"拷贝后的字符串:";
			PrintString(&TS);
			break;
		case 3:
			pos=StrCompare(&S,&TS);
			cout<<"比较后的值:"<<pos<<endl;
			break;
		case 4:
			cout<<"字符串长度:"<<Length(&S)<<endl;
			break;
		case 5:
			PrintString(&S);
			break;
		case 6:
			ClearString(&S);
			break;
		case 7:
			StringConcat(&RS,&S,&TS);
			cout<<"链接后的字符串:"<<RS.ch<<endl;
			break;
		case 8:
			StrAssign(&S,str);
			cout<<"请输入位置:";
			cin>>pos;
			cout<<"输入长度:";
			cin>>length;
			pos=SubString(&RS,&S,pos,length);
			if(pos!=-1)
			    cout<<"子串:"<<RS.ch<<endl;
			else
				cout<<"输入位置和长度不合理"<<endl;
			break;
		case 9:
			StrAssign(&S,str);
			StrAssign(&TS,ret);
			cout<<"输入位置:";
			cin>>pos;
			pos=Index(&S,pos,&TS);
			if(pos!=-1)
				cout<<"在"<<pos<<"位置匹配成功"<<endl;
			else
				cout<<"匹配不成功"<<endl;
			break;
		case 10:
			StrAssign(&S,str);
			StrAssign(&TS,ret);
			StrAssign(&RS,p);
			cout<<"输入位置:";
			cin>>pos;
			Replace(&S,&TS,&RS,pos);
			cout<<S.ch<<endl;
			break;
		case 11:
			StrAssign(&S,str);
			StrAssign(&TS,ret);
			cout<<"输入位置:";
			cin>>pos;
			StrInsert(&S,pos,&TS);
			cout<<S.ch<<endl;
			break;
		case 12:
			StrAssign(&S,str);
			cout<<"请输入位置:";
			cin>>pos;
			cout<<"输入长度:";
			cin>>length;
			pos=StrDelete(&S,pos,length);
			if(pos!=-1)
				cout<<S.ch<<endl;
			else
				cout<<"位置或长度不合适,不能完成删除"<<endl;
			break;
		case 13:
			DestroyString(&S);
			cout<<"字符串已被摧毁"<<endl;
			break;
	//	case 0:  exit(-1);
		default:
				break;
		}
	}
}
时间: 2024-08-30 15:27:32

字符串链式实现的相关文章

用php实现一个简单的链式操作

最近在读<php核心技术与最佳实践>这本书,书中第一章提到用__call()方法可以实现一个简单的字符串链式操作,比如,下面这个过滤字符串然后再求长度的操作,一般要这么写: strlen(trim($str)); 那么能否实现下面这种写法呢? $str->trim()->strlen(); 下面就来试下. 链式操作,说白了其实就是链式的调用对象的方法.既然要实现字符串的链式操作,那么就要实现一个字符串类,然后对这个类的对象进行调用操作.我对字符串类的期望如下:(1)当我创建对象时,

lodash用法系列(5),链式

Lodash用来操作对象和集合,比Underscore拥有更多的功能和更好的性能. 官网:https://lodash.com/引用:<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.min.js"></script>安装:npm install lodash 首先通过npm安装lodash:npm i --save lodash 在js文件中引用lodash:var _ =

数据结构Java实现05----栈:顺序栈和链式堆栈

数据结构Java实现05----栈:顺序栈和链式堆栈 一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除操作. 先进后出:堆栈中允许进行插入和删除操作的一端称为栈顶,另一端称为栈底.堆栈的插入和删除操作通常称为进栈或入栈,堆栈的删除操作通常称为出栈或退栈. 备注:栈本身就是一个线性表,所以我们之前讨论过线性表的顺序存储和链式存储,对于栈来说,同样适

jQuery对象的链式操作用法分析

可以使用下面的原则判断一个函数返回的时候是jQuery对象,即是否可以用于链式操作. 除了获取某些数据的函数,比如获取属性值"attr(name)",获取集合大小"size()"这些函数明显是返回数据的.除了这些函数之外的jQuery函数都可以用于链式操作,比如设置属性"attr(name.value)". 链式编程.html('val').text('val').css()链式编程,隐式迭代.链式编程注意:$('div').html('设置值'

数往知来 JQuery_选择器_隐式迭代_链式编程 &lt;二十&gt;

一.通过js实现页面加载完毕执行代码的方式与jquery的区别 1.通过jquery的方式可以 让多个方法被执行,而通过window.onload的方式只能执行最后一个, 因为最后一次注册的方法会把前面的方法覆盖掉 1. window.onload需要等待页面的所有元素资源比如说img里的图片一些连接等等都下载完毕后才会触发: 2. 而jquery只要页面的标签元素都下载完毕就会触发了 二.$.map(数组,function(ele,index){})函数对数组进行遍历,遍历之后会返回一个新的数

数据结构Java实现07----队列:顺序队列&amp;顺序循环队列、链式队列、顺序优先队列

数据结构Java实现07----队列:顺序队列&顺序循环队列.链式队列.顺序优先队列 一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其另一端进行删除操作. 队列中允许进行插入操作的一端称为队尾,允许进行删除操作的一端称为队头.队列的插入操作通常称作入队列,队列的删除操作通常称作出队列. 下图是一个依次向队列中插入数据元素a0,a1,...,an-

PHP链式操作的实现--即PHP数据操作类。

所谓链式操作最简单的理解就是 操作完毕之后再返回对象$this 想必大家工作中基本都快用烂了得东西. 下面就是一个链式操作MYSQL数据库类. 最常见的链式操作 每一个方法操作之后,返回一个对象,直到最后一个方法才是执行和返回整个链式操作的结果. $model->where()->field()->limit()->select() use PDO; class CyDB extends PDO { private $config = null; public $table; //

栈:顺序栈和链式堆栈

一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除操作. 先进后出:堆栈中允许进行插入和删除操作的一端称为栈顶,另一端称为栈底.堆栈的插入和删除操作通常称为进栈或入栈,堆栈的删除操作通常称为出栈或退栈. 备注:栈本身就是一个线性表,所以我们之前讨论过线性表的顺序存储和链式存储,对于栈来说,同样适用. 二.堆栈的抽象数据类型: 数据集合: 堆栈的数据

【Java】子类的链式调用

记录最近在项目设计中遇到的一个小问题. 前提:有这样两个POJO类,它们都可以通过链式调用的方式来设置其属性值,其中一个类继承了另一个类. 问题:通过链式调用,子类对象访问父类方法后,如何使返回对象仍是子类对象,仍然可以继续链式调用子类的方法? 结论:子类重写父类中需要被调用的方法.在子类重写的方法中,首先通过super关键字调用父类方法, 然后通过return this语句返回子类对象. 为了更具体.更形象的描述问题和解决办法,上示例代码. BaseOption.AppearanceOptio