串的存储表示和实现(串的基本操作合集)

1、采用书上第73页定义的串的定长顺序存储表示,编程实现串的下列基本操作。
(1)串联接          (2)求子串

2、采用书上第75页定义的串的堆分配存储表示,编程实现串的下列基本操作。
(1)生成串     (2)取串长度         (3)清空串      (4)串联接   
(5)求子串     (6)复制串           (7)串插入      (8)串删除

3、采用书上第73页定义的串的定长顺序存储表示,编程实现串的模式匹配算法及其改进算法。

例题一:

#include <stdio.h>
#define MAXSTRLEN 255
typedef unsigned char SString[MAXSTRLEN + 1];
#include <stdarg.h>
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#define TRUE 1
#define ERROR 0
#define OK 2
#define FALSE 0
typedef int Status;
using namespace std;
Status Concat(SString& T, SString S1, SString S2) {
	int uncut; int i;
	if (S1[0] + S2[0] <= MAXSTRLEN) {
		for (i = 1; i <=S1[0]; i++)
		{
			T[i] = S1[i];
			T[S1[0] + i] = S2[i];
			T[0] = S1[0] + S2[0];
			uncut = TRUE;
		}
		//T[1..S1[0]] = S1[1..S1[0]];
		//T[S1[0] + 1..S1[0] + S2[0]] = S2[1..S2[0]];
		//T[0] = S1[0] + S2[0]; uncut = TRUE;

	}
	else if (S1[0] < MAXSTRLEN) {
		for (i = 1; i <MAXSTRLEN; i++)
		{
			T[i] = S1[i];
		}
		for (i = 1; i < MAXSTRLEN - S1[0]; i++)
		{
			T[S1[0] + i] = S2[i];
		}
		//T[1..S1[0]] = S1[1..S1[0]];
		//T[S1[0] + 1..MAXSTRLEN] = S2[1..MAXSTRLEN - S1[0]];
		T[0] = MAXSTRLEN; uncut = FALSE;

	}
	else {
		for (i = 1; i < MAXSTRLEN; i++)
		{
			T[i] = S1[i];
		}
		uncut = FALSE;
	}
	return uncut;
}
Status SubString(SString& Sub, SString S, int pos, int len)
{
	int i;
	if (pos<1 || pos>S[0] || len<0 || len>S[0] - pos + 1)
		return ERROR;
	for (i = 1; i <=len; i++)
	{
		Sub[i]=S[pos+i];
	}
	//Sub[1..len] = S[pos..pos + len - 1];
	Sub[0] = len; return OK;
}

void main()
{
	SString T, S1, S2, S, Sub;
	int i, pos, len;
	printf("输入串S1的长度:");
	scanf("%d", &S1[0]);
	getchar();
	printf("输入串S1的值:");
	for (i = 1; i <= S1[0]; i++)
	{
		scanf("%c",&S1[i]);
	}
	printf("输出串S1的值:\n");
	for (i = 1; i <= S1[0]; i++)
	{
		printf("%c", S1[i]);
	}
	printf("\n");
	printf("输入串S2的长度");
	scanf("%d", &S2[0]);
	getchar();
	printf("输入串S2的值:\n");
	for (i = 1; i <= S2[0]; i++)
	{
		scanf("%c", &S2[i]);
	}
	printf("输出串S2的值:\n");
	for (i = 1; i <= S2[0]; i++)
	{
		printf("%c", S2[i]);
	}
	printf("\n");
	Concat(T, S1, S2);
	printf("输出串S1和串S2的联结串T的值:\n");
	for (i = 1; i <= T[0]; i++)
	{
		printf("%c", T[i]);
	}
	printf("\n");
	printf("输入串S的长度:");
	scanf("%d", &S[0]);
	getchar();
	printf("输入串S的值:");
	for (i = 1; i <= S[0]; i++)
	{
		scanf("%c", &S[i]);
	}
	printf("输出串S的值:\n");
	for (i = 0; i <= S[0]; i++)
	{
		printf("%c",S[i]);
	}
	printf("\n");
	printf("输入串S的字串Sub的开始字符位置:");
	scanf("%d", &pos);
	printf("输入串S的字串Sub的长度:");
	scanf("%d", &len);
	SubString(Sub, S, pos, len);
	printf("输出子串Sub的值:\n");
	for (i = 1; i <= Sub[0]; i++)
	{
		printf("%c", Sub[i]);
	}printf("\n");

}

例题二:

#include <stdarg.h>
#include <stdio.h>
#include<iostream>
#include<stdlib.h>
#define TRUE 1
#define ERROR 0
#define OK 2
#define FALSE -1
#define OVERFLOW -3 
typedef int Status;
using namespace std;
typedef struct {
	char* ch;
	int length;
}HString;
Status StrAssign(HString& T, char* chars) {
	int i;
	T.ch=(char*)malloc(100*sizeof(char));
	if(!T.ch) return FALSE;
	T.length=0;
	for(i=0;chars[i]!='\0';i++)
		{T.length++;
		T.ch[i]=chars[i];}
	return 0;
}//生成串
Status StrCopy(HString& S, HString T)
{   S.ch=(char*)malloc(100*sizeof(char));
	if(!S.ch) return FALSE;
	S.length=T.length;
	int i = 0;
	for (i = 0; i < T.length; i++)
		S.ch[i] = T.ch[i];
	return OK;
	
}//复制串
Status StrCompare(HString S, HString T)
{
	if (S.length > T.length)
		return 1;
	if (S.length == T.length)
		return 2;
	if (S.length < T.length)
		return 0;
}//比较串长度
Status StrLength(HString S)
{
	return S.length;
}//求串长
Status ClearString(HString &S)
{
	if (S.ch) { free(S.ch); S.ch = NULL; }
	S.length = 0;
	return OK;
}//清空串
Status Concat(HString& T, HString S1, HString S2)
{
	if (T.ch)free(T.ch);
	if (!(T.ch = (char*)malloc(100* sizeof(char))))
		exit(OVERFLOW);
	for (int i = 0; i < S1.length; i++)
		T.ch[i] = S1.ch[i];
	T.length = S1.length + S2.length;
	for (int i = 0; i < T.length - S1.length; i++)
	{
		T.ch[S1.length+i] = S2.ch[i];
	}
	return OK;
}//串联接

Status SubString(HString& Sub, HString S, int pos, int len)
{
	int i;
	if (pos<1 || pos>S.length || len<0 || len>S.length - pos + 1)
		return ERROR;
	if (Sub.ch)free(Sub.ch);
	if (!len) {
		Sub.ch = NULL; Sub.length = 0;
	}
	else {
		Sub.ch = (char*)malloc(len * sizeof(char));
		for (i = 0; i < len; i++)
		{
			Sub.ch[i] = S.ch[pos - 1 + i];
		}
		Sub.length = len;
	}
	return OK;
}//求子串
Status StrInsert(HString& S, int pos, HString T)
{
	if (pos<1 || pos>S.length + 1)return ERROR;
	if (T.length) {
		if (!(S.ch = (char*)realloc(S.ch, (S.length + T.length) * sizeof(char))))

			exit(OVERFLOW);
		for (int i = S.length - 1; i >= pos - 1; --i)
		{
			S.ch[i + T.length] = S.ch[i];
		}
		for (int i = 0; i < T.length; i++)
			S.ch[pos - 1 + i] = T.ch[i];
		S.length += T.length;
	}
	return OK;

}//串插入
Status StrDelete(HString& S, int pos, int len)
{
	int i,j;
	if(pos<1||pos+len>S.length||len<0) return FALSE;
	for(i=pos-1;i<pos-1+len;i++)
		S.ch[i]=' ';
	j=pos-1;
	for(i=pos-1+len;i<S.length;i++)
		{
		S.ch[j++]=S.ch[i];
		S.ch[i]=' ';}
	S.length=S.length-len;
	return 0;
}//串删除
Status DispStr(HString S){
	int i;
	for(i=0;i<S.length;i++)
		printf("%c",S.ch[i]);
	printf("\n");
}//串输出
int  main()
{

	HString T, S, S1, S2, Sub;
	int pos, len;
	char* a, str[100],*chars = "House";
	T.ch = NULL;
	S.ch = NULL;
	S1.ch = NULL;
	S2.ch = NULL;
	Sub.ch = NULL;
	printf("输出字符串常量chars:%s\n", chars);
	StrAssign(T, chars);
	printf("生成一个其值等于串常量chars的串T:");
	DispStr(T);
	StrCopy(S, T);
	printf("将串T的值复制到串S中,串S的值为:");
	DispStr(S);
	printf("串S的长度为:%d\n", StrLength(S));
	printf("比较串S和串T的大小:%d\n", StrCompare(S, T));
	printf("将串S清为空串!\n");
	ClearString(S);
	printf("串S的值为:");
	DispStr(S);
	printf("串T的值为:");
	DispStr(T);
	a = str;
	printf("输入串S1:");
	scanf("%s", a);
	StrAssign(S1, a);
	printf("串S1的值为:");
	DispStr(S1);
	printf("输入串S2:");
	scanf("%s", a);
	StrAssign(S2, a);
	printf("串S2的值为:");
	DispStr(S2);
	printf("返回由S1和S2联接而成的新串S:");
	Concat(S, S1, S2);
	DispStr(S);
	printf("输出串S的子串的起始字符位置:");
	scanf("%d", &pos);
	printf("输入串S的子串的长度:");
	scanf("%d", &len);
	printf("用Sub返回串S的第%d个字符起长度为%d的子串:", pos, len);
	SubString(Sub, S, pos, len);
	DispStr(Sub);
	printf("输入串S的插入位置:");
	scanf("%d", &pos);
	printf("在串S的第%d个位置插入串T,插入后串S的值为:", pos);
	StrInsert(S, pos, T);
	DispStr(S);
	printf("删除串S删除的子串的起始字符位置:");
	scanf("%d", &pos);
	printf("输入串S删除的子串的长度:");
	scanf("%d", &len);
	printf("串S中删除第%d个字符起长度为%d的子串,删除后S的值为:", pos, len);
	StrDelete(S, pos, len);
	DispStr(S);
}

第三题:
#include <stdio.h>
#define MAXSTRLEN 255
typedef unsigned char SString[MAXSTRLEN + 1];
#include <stdarg.h>
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#define TRUE 1
#define ERROR 0
#define OK 2
#define FALSE 0
typedef int Status;
using namespace std;
Status Index(SString S,SString T,int pos) {
	int i=pos;int j=i;
	while(i<=S[0]&&j<=T[0])
	{
		if(S[i]==T[j]){++i;++j;}
		
		else{i=i-j+2;j=1;}
	}
	if(j>T[0])return i-T[0];
	else return 0;
}

int main()
{
	SString T, S1, S2, S, Sub;
	int i, pos, len,post;
	printf("输入串S1的长度:");
	scanf("%d", &S1[0]);
	getchar();
	printf("输入串S1的值:");
	for (i = 1; i <= S1[0]; i++)
	{
		scanf("%c",&S1[i]);
	}
	printf("输出串S1的值:\n");
	for (i = 1; i <= S1[0]; i++)
	{
		printf("%c", S1[i]);
	}
	printf("\n");
	printf("输入串S2的长度:");
	scanf("%d", &S2[0]);
	getchar();
	printf("输入串S2的值:\n");
	for (i = 1; i <= S2[0]; i++)
	{
		scanf("%c", &S2[i]);
	}
	printf("输出串S2的值:\n");
	for (i = 1; i <= S2[0]; i++)
	{
		printf("%c", S2[i]);
	}
	printf("\n");
	printf("输入字符串S2在S1中的待匹配位置:\n");
	scanf("%d",&pos);
	Index(S1,S2,pos);
	post=Index(S1,S2,pos);
	printf("匹配结果:");
	if(post==0)
	printf("二者不匹配") ;
	else
	printf("二者在S1第%d位置开始匹配",post); 
	
}

改进算法:

#include <stdio.h>
#define MAXSTRLEN 255
typedef unsigned char SString[MAXSTRLEN + 1];
#include <stdarg.h>
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#define TRUE 1
#define ERROR 0
#define OK 2
#define FALSE 0
typedef int Status;
using namespace std;
void get_next(SString T, int next[])
{
	int i = 1, j = 0; next[1] = 0;
	while (i<T[0])
	{
		if (j == 0 || T[i] == T[j]) { i++; j++; next[i] = j; }
		else j = next[j];
	}
}
Status Index(SString S,SString T,int pos) {
	int i=pos;int j=i;int next[255];
	get_next(T,next);
	while(i<=S[0]&&j<=T[0])
	{
		if(S[i]==T[j]){++i;++j;}
		
		else{i=i-j+2;j=1;}
	}
	if(j>T[0])return i-T[0];
	else return 0;
}

int main()
{
	SString T, S1, S2, S, Sub;
	int i, pos, len,post;
	printf("输入串S1的长度:");
	scanf("%d", &S1[0]);
	getchar();
	printf("输入串S1的值:");
	for (i = 1; i <= S1[0]; i++)
	{
		scanf("%c",&S1[i]);
	}
	printf("输出串S1的值:\n");
	for (i = 1; i <= S1[0]; i++)
	{
		printf("%c", S1[i]);
	}
	printf("\n");
	printf("输入串S2的长度:");
	scanf("%d", &S2[0]);
	getchar();
	printf("输入串S2的值:\n");
	for (i = 1; i <= S2[0]; i++)
	{
		scanf("%c", &S2[i]);
	}
	printf("输出串S2的值:\n");
	for (i = 1; i <= S2[0]; i++)
	{
		printf("%c", S2[i]);
	}
	printf("\n");
	printf("输入字符串S2在S1中的待匹配位置:\n");
	scanf("%d",&pos);
	Index(S1,S2,pos);
	post=Index(S1,S2,pos);
	printf("匹配结果:");
	if(post==0)
	printf("二者不匹配") ;
	else
	printf("二者在S1第%d位置开始匹配",post); 
	
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值