《数据结构(C语言版)》串的定长顺序存储
清华大学计算机系列教材 累计发行超400万册
严蔚敏 吴伟民 编著
数据结构(C语言版)
以下是本人对该紫皮书第四章串中4.2.1节串的定长顺序存储表示的代码实现,由于该存储结构非常简单,实用性也不高,与C语言中'\0'表示字符串的结束也不相同,而且只能静态分配内存,故没有做成系统式地全部代码,但是把课本上提到的关于这一节的全部两个函数均实现了,函数部分与课本完全相同
(貌似专栏把我缩进吃了,懒得加了,另外建议用visual studio编译)
代码如下:
//串的定长顺序存储表示
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAXSTRLEN 255//用户可以在255以内定义最大串长
typedef int Status;
typedef unsigned char SString[MAXSTRLEN + 1];//0号单元存放串的长度
/*注意这个数据结构和C语言中字符串不同,后者是在字符串末尾设置'\0',这个是在0号位置存放串长*/
Status Concat(SString& T, SString S1, SString S2);//连接两个字符串
Status SubString(SString& Sub, SString S, int pos, int len);//用Sub返回串S的第pos个字符起长度为len的字串
void ShowString(SString S);//打印字符串
int main()
{
SString MyStringA, MyStringB, ConnectStr;
unsigned char c;
int i = 1;
printf("请输入字符串A:");
while ((c = getchar()) != '\n' && i < 256)
{
MyStringA[i] = c;
i++;
}
MyStringA[0] = i - 1;
fflush(stdin);//清空输入缓冲区,防止用户输入超过字符串所能存取的最大长度
printf("请输入字符串B:");
i = 1;
while ((c = getchar()) != '\n' && i < 256)
{
MyStringB[i] = c;
i++;
}
MyStringB[0] = i - 1;
fflush(stdin);//清空输入缓冲区,防止用户输入超过字符串所能存取的最大长度
if (Concat(ConnectStr, MyStringA, MyStringB))
{
printf("字符串连接成功,未截断\n");
}
else
{
printf("字符串已连接,B字符串过长已被截断\n");
}
ShowString(ConnectStr);
printf("寻找A的给定长度的子串,请输入子串的位置和长度:");
int position, length;
scanf("%d%d", &position, &length);
SString sub;
if (SubString(sub, MyStringA, position, length))
{
ShowString(sub);
}
else
{
printf("子串位置错误!\n");
}
return 0;
}
Status Concat(SString& T, SString S1, SString S2)//连接两个字符串
{
Status uncut;//是否截断
if (S1[0] + S2[0] < MAXSTRLEN)//未截断
{
for (int i = 1; i <= S1[0]; i++)
{
T[i] = S1[i];
}
for (int i = S1[0] + 1; i <= S1[0] + S2[0]; i++)
{
T[i] = S2[i - S1[0]];
}
T[0] = S1[0] + S2[0];
uncut = TRUE;
}
else if (S1[0] < MAXSTRLEN)//截断
{
for (int i = 1; i <= S1[0]; i++)
{
T[i] = S1[i];
}
for (int i = S1[0] + 1; i <= MAXSTRLEN; i++)
{
T[i] = S2[i - S1[0]];
}
T[0] = MAXSTRLEN;
uncut = FALSE;
}
else
{
for (int i = 0; i <= MAXSTRLEN; i++)
{
T[i] = S1[i];
}
uncut = FALSE;
}
return uncut;
}
Status SubString(SString& Sub, SString S, int pos, int len)//用Sub返回串S的第pos个字符起长度为len的字串
{
if (pos<1 || pos>S[0] || len<0 || len>S[0] - pos + 1)
{
return ERROR;
}
for (int i = 1; i <= len; i++)
{
Sub[i] = S[pos + i - 1];
}
Sub[0] = len;
return OK;
}
void ShowString(SString S)//打印字符串
{
for (int i = 1; i <= S[0]; i++)
{
printf("%c", S[i]);
}
printf("\n");
}