实验六 串
1、实验目的:
(1)掌握串的概念。
(2)理解串的存储结构。
(3)能够基于串的相应存储结构实现串的常用操作。
2、实验环境与设备:
已安装Visual Studio 2010(或其以上版本)集成开发环境的计算机。
3、实验原理:
(1)串的定长顺序存储结构。
(2)串的常用操作实现。
4、实验内容:
基于串的定长顺序存储结构实现串的常用操作,并举例演示。
// 预定义常量
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
// 预定义类型
typedef int Status;
// 本程序定义常量,串的最大长度为255
#define MAXSTRLEN 255
// 本程序定义类型,定长顺序存储的串,0号位置存储串长。
typedef unsigned char SString[ MAXSTRLEN + 1];
//串的初始化操作,用字符数组chars初始化串T
Status StrAssign( SString T, char *chars )
//串的求长度操作
int StrLength( SString S )
//串的比较操作,若S>T,则返回1;若S=T,则返回0;若S<T,则返回-1
int StrCompare( SString S, SString T )
//串的清空操作,将得到空串
Status ClearString( SString S)
//串2联接到串1之后,得到新串T
Status Concat( SString T, SString S1, SString S2 )
//串的打印操作
void PrintString( SString S )
5、实验考核:
(1)完成纸质版实验报告
(2)提交电子版作业
6、执行结果示例如下:
来了来了
#include<stdio.h>
#include<string.h>
// 预定义常量
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
// 预定义类型
typedef int Status;
// 本程序定义常量,串的最大长度为255
#define MAXSTRLEN 255
// 本程序定义类型,定长顺序存储的串,0号位置存储串长。
typedef unsigned char SString[MAXSTRLEN + 1];
//串的初始化操作,用字符数组chars初始化串T
Status StrAssign(SString T, char *chars){
int len = strlen(chars);
if (len>MAXSTRLEN)
{
return ERROR;
}
else
{
T[0] = len;
for (int i = 1; i <= len; i++)
{
T[i] = chars[i - 1];
}
return OK;
}
}
//串的求长度操作
int StrLength(SString S){
return S[0];
}
//串的比较操作,若S>T,则返回1;若S=T,则返回0;若S<T,则返回-1
int StrCompare(SString S, SString T){
if (S[0]==T[0])
{
for (int i = 1; i <=S[0]; i++)
{
if (S[i] == T[i])
{
continue;
}
else
{
return S[i]>T[i] ? 1 : -1;
}
}
return 0;
}
return S[0] > T[0] ? 1 : -1;
}
//串的清空操作,将得到空串
Status ClearString(SString S){
S[0] = 0;
}
//串2联接到串1之后,得到新串T
Status Concat(SString T, SString S1, SString S2){
int i;
for (i = 1; i <= S1[0]; i++)
{
T[i] = S1[i];
}
if (S1[0]+S2[0]<=MAXSTRLEN)
{
for (i = 1; i <=S2[0]; i++)
{
T[S1[0] + i] = S2[i];
}
T[0] = S1[0] + S2[0];
return OK;
}
else
{
for (i = 1; S1[0] + i < MAXSTRLEN; i++)
{
T[S1[0] + i] = S2[i];
}
T[0] = MAXSTRLEN;
return ERROR;
}
}
//串的打印操作
void PrintString(SString S){
if (S[0]>0)
{
for (int i = 0; i < S[0]; i++)
{
printf("%c", S[i+1]);
}
}
else
{
printf("这个是空串");
}
printf("\n");
}
int main(){
SString S1, S2, S3;
char s1[MAXSTRLEN], s2[MAXSTRLEN];
printf("请输入第一个字符串:");
gets_s(s1, MAXSTRLEN);
printf("请输入第二个字符串:");
gets_s(s2, MAXSTRLEN);
StrAssign(S1, s1); StrAssign(S2, s2);
printf("赋值后第一个字符串是:\n"); PrintString(S1);printf("\n");
printf("赋值后第二个字符串是:\n"); PrintString(S2);printf("\n");
printf("*********************************************\n");
switch (StrCompare(S1,S2))
{
case 0:
printf("第一个字符串和第二个字符串相等\n");
break;
case 1:
printf("第一个字符串比第二个字符串大\n");
break;
case -1:
printf("第一个字符串比第二个字符串小\n");
break;
}
printf("*********************************************\n");
if (Concat(S3,S1,S2))
{
printf("这两个字符串连接后形成的字符串是:\n");
PrintString(S3);
printf("连接后的长度为:%d\n",S3[0]);
}
else
{
printf("连接失败");
}
printf("*********************************************\n");
printf("清空字符串S3\n");
ClearString(S3);
printf("清空后,S3的长度为:%d\n", S3[0]);
return 0;
}