重学数据结构:串的基本操作(C语言)

串的结构

#include "stdafx.h"
#include "stdlib.h"
#include "string.h"
#define MaxSize 50
#define bool int
#define true 1
#define false 0;


typedef struct
{
    char *data;
	int length;
}String;

初始化操作

void InitString(String *S)
{
   S->data=(char *)malloc(sizeof(char));
   S->length=0;
   for(int i=0;i<MaxSize;i++)
	   S->data[i]='0';
}

赋值操作

StrAssign(&T,chars):赋值操作。把串T赋值为chars。

bool StrAssign(String *S,char *t)
{
	int len=strlen(t);
    if(S==NULL||len==0)return false;
    
	for(int i=0;i<len;i++)
	    S->data[i]=t[i];
	S->length=len;
	return true;
}

复制操作

StrCopy(&T,S):复制操作。由串S复制得到串T。

bool StrCopy(String *T,String S)
{
   if(T==NULL)return false;
   T->data=S.data;
   T->length=S.length;
   return true;
}

判空操作

StrEmpty(S):判空操作。若S为空串,则返回TRUE,否则返回FALSE。

bool StrEmpty(String S)
{
    if(S.length==0)
		return true;
	else
		return false;
}

打印操作

void PrintString(String S)
{
    if(S.length==0)return;
    char *t=(char *)malloc(sizeof(char));
	for(int i=0;i<S.length;i++)
	{
		t[i]=S.data[i];
	}
	printf("%s\n",t);
	//printf("S->data=%s\n",S->data);
}

求串长

StrLength(S):求串长。返回串S的元素个数。

int StrLength(String S)
{
   return S.length;
}

清空操作

ClearString(&S):清空操作。将S清为空串。

void ClearString(String *S)
{
   //free(S);
	S=NULL;
}

串连接

Concat(&T,S1,S2):串联接。用T返回由S1和S2联接而成的新串

bool Concat(String *S,char *s1,char *s2)
{
    if(S==NULL)return false;
    int s1_len=strlen(s1);
	int s2_len=strlen(s2);
	for(int i=0;i<s1_len;i++)
          S->data[i]=s1[i];
	for(int k=0;k<s2_len;k++)
          S->data[k+i]=s2[k];
    S->length=s1_len+s2_len;
	return true;
}

求子串

SubString(&Sub,S,pos,len):求子串。用Sub返回串S的第pos个字符起长度为len的子串。

void SubString(String *Sub,String S,int pos,int len)
{
    if(S.length==0||pos<0||len>S.length||pos>S.length||pos+len>S.length)
		return;
	for(int i=0;i<len;i++)
		Sub->data[i]=S.data[pos+i];
	Sub->length=len;
}

定位操作

Index(S,T):定位操作。若主串S中存在与串T值相同的子串,则返回它在主串S中第一次出现的
位置;否则函数值为0。

//定位操作。若主串S中存在与串T值相同的子串,则返回它在主串S中第一次出现的位置;否则函数值为-1。
int StrIndex(String S,String T)
{
    int result=-1;
	int i=0;
    String substr;
    InitString(&substr);
	while(i<S.length-T.length+1)
	{
	   	SubString(&substr,S,i,T.length);

		if(StrCompare(substr,T)==0)
		{
		    return i;
		}else
		{
		   i++;
		}
		
	}
	return result;
}

比较操作

StrCompare(S,T):比较操作。若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0。

//比较操作。若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0
int StrCompare(String S,String T)
{
	for(int i=0;i<S.length&&i<T.length;i++)
	{
	    if(S.data[i]!=T.data[i])
			return S.data[i]-T.data[i];
	}
	return S.length-T.length;
   
}

测试代码

int main(int argc, char* argv[])
{
    String S,T,P,Q,X,Y,Z,substr;
	InitString(&S);
	InitString(&T);
	InitString(&X);
	InitString(&Y);
	InitString(&Z);
	InitString(&P);
	InitString(&Q);
	InitString(&substr);

	//赋值操作
	StrAssign(&S,"Hello World!");
	printf("输出赋值操作字符串:");
    PrintString(S);

    //判断串是否为空
    printf("串S是否为空:%d\n",StrEmpty(S)); 
    printf("串T是否为空:%d\n",StrEmpty(T)); 

    //获取串的长度
    printf("串S的长度:%d\n",StrLength(S)); 
    printf("串T的长度:%d\n",StrLength(T)); 

	StrAssign(&S,"Stay Young!");
	//复制操作
	StrCopy(&T,S);
	printf("输出复制赋值操作字符串:");
	PrintString(T);

    //清空操作
    ClearString(&S);
    printf("清空操作后串S是否为空:%d\n",StrEmpty(S)); 
     
    //串连接
    Concat(&Z,"Keep","Moving!");
	printf("输出串连接操作字符串:");
    PrintString(Z);

	//求子串
	SubString(&substr,S,5,5);
    printf("截取字符串:");
    PrintString(S);
	printf("SubString(&substr,S,5,5)=");
	PrintString(substr);

	//比较操作(第一次没写出来)
	StrAssign(&X,"abstraction");
	StrAssign(&Y,"abstract");
    int result=StrCompare(X,Y);
	printf("StrCompare(X,Y)=%d\n",result);


	//定位操作
	StrAssign(&P,"wangdao");
	StrAssign(&Q,"dao");
	printf("P:wangdao,Q:dao\n");
    int result_index=StrIndex(P,Q);
    printf("StrIndex(P,Q)=%d\n",result_index);
    return 0;


}

测试结果

输出赋值操作字符串:Hello World!
串S是否为空:0
串T是否为空:1
串S的长度:12
串T的长度:0
输出复制赋值操作字符串:Stay Young!
清空操作后串S是否为空:0
输出串连接操作字符串:KeepMoving!
截取字符串:Stay Young!
SubString(&substr,S,5,5)=Young
StrCompare(X,Y)=3
P:wangdao,Q:dao
StrIndex(P,Q)=4
  • 11
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基于定长顺序存储结构实现对的赋值、比较、求子的位置、替换等操作。要求所有操作均以函数的形式实现,在主函数中调用各个函数实现整体功能。 注意:每一个字符的第一个元素存放的是该字符的长度(不包括第一个元素),除的赋值外,其他所有操作(比较、求子的位置、替换)等都不应包含该字符。 1.1.实验1:赋值函数实现: 按照系统已经定义的函数接口编写函数实体,实现:将输入数组StrInput[]的数据赋值给待赋值数组StrTobeAssigned[],其中待赋值数组StrTobeAssigned[0]存放有效数据的长度,StrTobeAssigned[1]之后存放带赋值数据。 具体要求和相关假设为: ① 函数接口定义为:int MyStrAssign(char * StrTobeAssigned, char * StrInput); ② 输入参数:待赋值字符变量StrTobeAssigned,字符的期望值StrInput; ③ 输出参数:无; ④ 处理规则及返回值:将StrTobeAssigned[1]及之后的内容赋值为StrInput的有效内容,StrTobeAssigned[0]赋值为StrInput有效字符的长度,并返回1; ⑤ 假设: a)两个字符均不为空; b)StrInput存放的是一个完成的字符(不包含长度); c)赞不考虑输入数据超过数组总长度的情况。 1.2实验2:替换函数: 按照系统已经定义的函数接口编写函数实体,实现:在主中MainStr查找是否存在某特定子SubStr1,若存在则将所有的SubStr1替换为新的指定子SubStr2,函数返回字符替换的次数。 具体要求和相关假设为: ① 函数接口定义为:int MyStrReplace(char * MainStr, char * SubStr1, char * SubStr2); ② 输入参数:主变量MainStr,子变量SubStr1,SubStr2; ③ 输出参数:无; ④ 处理规则及返回值:若主中存在子,用SubStr2替换主MainStr中出现的所有与SubStr1相同的不叠的子,并返回字符替换的次数;否则返回0。 ⑤ 假设: a)主和两个子均不为空; b)MainStr[0]和SubStr1[0],SubStr2[0]分别存放对应字符的长度,不用替换该部分。 2.问题分析 (1)根据实验一的内容可知,我们需要通过编写函数实体的形式实现的赋值操作,主要的思路包括: (a)获得输入字符的长度len; (b)将输入字符的长度len赋值给待赋值字符的第一个元素StrTobeAssigned[0]; (c)依次将输入字符的数据赋值给待赋值字符。 (2)根据实验二的内容可知,我们需要通过编写函数实体的形式实现的替换操作,主要的思路包括: (a)遍历主MainStr,检查是否存在某特定子SubStr1; (b)如果存在则找到子在主中的位置; (c)在主中删除该子并更新主长度; (d)在主中插入该子并更新主长度; (e)过程中记录替换字符的次数,遍历结束后返回该次数(如果没有替换则为0); 如果有必要,可以使用本实验已经提供的相关函数,如:求子位置的函数MySubStrIndex(),子删除函数MyStrDelete()和子插入函数MyStrInsert()等
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值