数据结构-串

数据结构-串(C语言)

串是由0个或多个字符组成的有序序列。

基本概念

串的长度:串中字符的数目。

空串:零个字符的串,即长度为0。

子串:串中任意连续的字符组成的子序列称为该串的子串。

主串:包含子串的串。

串相等:当且仅当两个串长度相等,并且各个位置的对应字符都相等。

空格串:由一个或多个空格字符组成的串。

串的三种表示方法:定长顺序存储,堆分配存储,块链存储表示。

本文采用堆分配存储的表示方式。

串的基本操作:

定义

typedef struct
{
	char* c;
	int length;
}HString;

初始化

int Assign(HString& s,char* cs)
{
	char* c=cs;
	int length=0;
	while(*c){
		length++;
		c++;
	}
	if(length==0){
		s.length=0;
		s.c=NULL;
	}else{
		s.length=length;
		s.c=(char*)malloc(sizeof(char)*length);
		for(int i=0;i<length;i++){
			*(s.c+i)=*(cs+i);
		}
	}
}

先求的原始的字符串的串长,如果长度为0则串长度为0,否则依次赋值。

串比较

int compare_HString(HString s1,HString s2)
{
	for(int i=0;i<s1.length&&i<s2.length;i++){
		if(*(s1.c+i)!=*(s2.c+i)) return *(s1.c+i)-*(s2.c+i);
	}
	return s1.length-s2.length; 
}

比较s1和s2的值。

在不达到二者长度最大值时,依次顺序比较两个串对应位置的元素,如果不等则返回二个字符ASCII码相差数值。若在长度范围内都相等,则比较串长,返回串长相差值。

截取子串

int subHString(HString& t,HString s,int index,int length)
{
	if(length+index>s.length||s.length<0||index<0) return 0;
	if(length==0){
		t.length=0;
		t.c=NULL;
	}else{
		t.length=length;
		t.c=(char*)malloc(sizeof(char)*length);
		for(int i=0;i<length;i++){
			*(t.c+i)=*(s.c+i+index);
		}
	}
	return 1;
}

t为要截取的子串,s为被截取的主串,index为截取的起始位置,length为截取的长度。

1.判断截取子串的位置和长度是否符合被截取字符串。

2.若要截取字符串长度为0则直接赋值长度为0。

3.否则,分配相应空间后一次赋值。

串定位

int indexHString(HString t,HString s,int index)
{
	int i,j;
	if(index+t.length>s.length||index<0) return -1;
	 for(i=0,j=index;i<t.length&&j<s.length;){
	 	if(*(s.c+j)!=*(t.c+i)){
	 		i=0;
	 		j=j-i+1;
		 }else{
		 	i++;
		 	j++;
		 }
	 }
	 if(i==0) return -1;
	 return j-i;
}

从位置index开始,找到 t在s中的位置并返回,如果t存在与从index开始的s中则返回位置下标,否则返回-1。

源程序

#include<stdio.h>
#include<stdlib.h>

typedef struct
{
	char* c;
	int length;
}HString;

int Assign(HString& s,char* cs)
{
	char* c=cs;
	int length=0;
	while(*c){
		length++;
		c++;
	}
	if(length==0){
		s.length=0;
		s.c=NULL;
	}else{
		s.length=length;
		s.c=(char*)malloc(sizeof(char)*length);
		for(int i=0;i<length;i++){
			*(s.c+i)=*(cs+i);
		}
	}
}
//求串长
int length(HString s)
{
	return s.length;
}

int compare_HString(HString s1,HString s2)
{
	for(int i=0;i<s1.length&&i<s2.length;i++){
		if(*(s1.c+i)!=*(s2.c+i)) return *(s1.c+i)-*(s2.c+i);
	}
	return s1.length-s2.length; 
}

int subHString(HString& t,HString s,int index,int length)
{
	if(length+index>s.length||s.length<0||index<0) return 0;
	if(length==0){
		t.length=0;
		t.c=NULL;
	}else{
		t.length=length;
		t.c=(char*)malloc(sizeof(char)*length);
		for(int i=0;i<length;i++){
			*(t.c+i)=*(s.c+i+index);
		}
	}
	return 1;
}

int indexHString(HString t,HString s,int index)
{
	int i,j;
	if(index+t.length>s.length||index<0) return -1;
	 for(i=0,j=index;i<t.length&&j<s.length;){
	 	if(*(s.c+j)!=*(t.c+i)){
	 		i=0;
	 		j=j-i+1;
		 }else{
		 	i++;
		 	j++;
		 }
	 }
	 if(i==0) return -1;
	 return j-i;
}
//遍历串
void print(HString s)
{
	for(int i=0;i<s.length;i++)
		printf("%c",*(s.c+i));
	printf("\n");
}

int main()
{
    //定义4个字符串
	HString s1,s2,s3,t;
	char* cs1="1234";
	char* cs2="2456";
	char* cs3="asdfghjkg";
    //分别初始化s1,s2,s3
	Assign(s1,cs1);
	Assign(s2,cs2);
	Assign(s3,cs3);
    //遍历并打印s1,s2,s3
	print(s1);
	print(s2);
	print(s3);
    //求s1串长
	printf("%d\n",length(s1));
    //比较s1和s2的值
	printf("%d\n",compare_HString(s1,s2));
    //截取字符串
	subHString(t,s3,3,3);
	print(t);
    //串定位
	printf("%d\n",indexHString(t,s3,1));
	printf("%d\n",indexHString(t,s3,5));
	return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值