欢迎光临散文网 会员登陆 & 注册

《数据结构(C语言版)》串的定长顺序存储

2022-04-03 10:39 作者:回到唐朝当少爷  | 我要投稿

清华大学计算机系列教材   累计发行超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");

}

《数据结构(C语言版)》串的定长顺序存储的评论 (共 条)

分享到微博请遵守国家法律