数据结构---串的定长顺序实现

本文探讨了计算机科学中处理字符串数据的重要性,特别是关注C语言环境下字符串的处理。相较于JAVA等高级语言封装后的便捷字符串操作,C语言中字符串的实现往往需要程序员进行更多手动操作。
摘要由CSDN通过智能技术生成

计算机经常处理字符串类型数据,所以需要用一种数据结构来定义它。话术我感觉JAVA等高级语言封装后的字符串比较好用..C里面好多操作还需要自己来实现Orz


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSTRLEN 255

typedef unsigned char SString[MAXSTRLEN + 1];
typedef unsigned char *PtrString;

//get a string that value is 'chars'
PtrString StrAssign(char chars[]);

//copy a string
PtrString StrCopy(PtrString S);

//if string is empty , return 1
int StrEmpty(PtrString S);

//if S > T, return 1; if S == T , return 0; if S < T, return -1
int StrCompare(PtrString S, PtrString T);

//get length of string
int StrLength(PtrString S);

//Clear string
void ClearString(PtrString S);

//connet s1 and s2 to get a new string
PtrString Concat(PtrString S1, PtrString S2);

//get substring
PtrString SubString(PtrString S, int pos, int len);

//get substing's pos in string
int Index(PtrString S, PtrString T);

//replace substring in string
void Replace(PtrString S, PtrString T, PtrString V);

//insert substring
void StrInsert(PtrString S, PtrString T, int pos);

//from pos delete substring that length is len
void StrDelete(PtrString S, int pos, int len);

//destroy string
void DestroyString(PtrString S);

void PrintString(PtrString S);


int main()
{
	PtrString S = StrAssign("abcdef");
	PrintString(S);
	PtrString TS = StrCopy(S);
	PrintString(TS);
	printf("%d\n", StrCompare(S, TS));
	PtrString T = StrAssign("bc");
	printf("%d\n", StrCompare(S, T));
	PtrString CS = Concat(S, T);
	PrintString(CS);
	PtrString SS = SubString(S, 1, 2);
	PrintString(SS);
	printf("%d\n", Index(S, T));
	StrDelete(S, 2, 2);
	PrintString(S);
	return 0;
}



PtrString StrAssign(char chars[])
{
	PtrString S = (PtrString)malloc(MAXSTRLEN * sizeof(unsigned char));
	for(int i = 1 ; chars[i-1] ; i ++)
	{
		S[i] = chars[i-1];
		S[0] = i;
	}
	return S;
}

PtrString StrCopy(PtrString S)
{
	PtrString T = (PtrString)malloc(MAXSTRLEN * sizeof(unsigned char));
	T[0] = S[0];
	for(int i = 1 ; i <= S[0] ; i ++)
	       T[i] = S[i];
	return T;
}

int StrEmpty(PtrString S)
{
	return S[0] ? 0 : 1;
}

int StrCompare(PtrString S, PtrString T)
{
	int i;
	for(i = 1 ; i <= S[0] && i <= T[0] ; i ++)
	{
		if(S[i] < T[i])
			return -1;
		if(S[i] > T[i])
			return 1;
	}
	if(S[0] == T[0])
		return 0;
	if(i <= S[0])
		return 1;
	if(i <= T[0])
		return -1;
}

int StrLength(PtrString S)
{
	return S[0];
}

void ClearString(PtrString S)
{
	S[0] = 0;
}

PtrString Concat(PtrString S1, PtrString S2)
{
	if(S1[0] == MAXSTRLEN)
		return StrCopy(S1);
	if(S1[0] + S2[0] <= MAXSTRLEN)
	{
	        PtrString S = StrCopy(S1);
	        S[0] += S2[0];
	        for(int i = S1[0] + 1 ; i <= S[0] ; i ++)
		       S[i] = S2[i-S1[0]];
	        return S;
	}
	else
	{
		PtrString S = StrCopy(S1);
		S[0] = MAXSTRLEN;
		for(int i = S1[0] + 1 ; i <= MAXSTRLEN ; i ++)
			S[i] = S2[i-S1[0]];
		return S;
	}
}

PtrString SubString(PtrString S, int pos, int len)
{
	PtrString T = (PtrString)malloc(MAXSTRLEN * sizeof(unsigned char));
	T[0] = len;
	for(int i = pos; i < pos + len ; i ++)
		T[i-pos+1] = S[i];
	return T;
}

int Index(PtrString S, PtrString T)
{
	int pos = -1;
	for(int i = 1 ; i <= S[0] ; i ++)
	{
		PtrString TS = SubString(S, i, T[0]);
		if(!StrCompare(TS, T))
		{
			pos = i;
			break;
		}
	}
	return pos;
}

void Replace(PtrString S, PtrString T, PtrString V)
{
	int pos = Index(S, T);
	for(int i = pos ; i < T[0] ; i ++)
		S[i] = V[i];
}

void StrInsert(PtrString S, PtrString T, int pos)
{
	for(int i = 0 ; i < T[0] ; i ++)
	{
		for(int j = S[0] + 1 ; j >= pos + i ; j ++)
			S[j] = S[j-1];
		S[0] ++;
	}
	for(int i = 0 ; i < T[0] ; i ++)
		S[i+pos] = T[i+1];
}

void StrDelete(PtrString S, int pos, int len)
{
	memcpy(S + pos , S + pos + len , S[0] - pos - len + 1);
	S[0] -= len;
}

void DestroyString(PtrString S)
{
	free(S);
}

void PrintString(PtrString S)
{
	for(int i = 1 ; i <= S[0] ; i ++)
		printf("%c", S[i]);
	printf("\n");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值