《數(shù)據(jù)結(jié)構(gòu)(C語言版)》串的定長(zhǎng)順序存儲(chǔ)
清華大學(xué)計(jì)算機(jī)系列教材? ?累計(jì)發(fā)行超400萬冊(cè)
嚴(yán)蔚敏 吳偉民 編著
數(shù)據(jù)結(jié)構(gòu)(C語言版)
以下是本人對(duì)該紫皮書第四章串中4.2.1節(jié)串的定長(zhǎng)順序存儲(chǔ)表示的代碼實(shí)現(xiàn),由于該存儲(chǔ)結(jié)構(gòu)非常簡(jiǎn)單,實(shí)用性也不高,與C語言中'\0'表示字符串的結(jié)束也不相同,而且只能靜態(tài)分配內(nèi)存,故沒有做成系統(tǒng)式地全部代碼,但是把課本上提到的關(guān)于這一節(jié)的全部?jī)蓚€(gè)函數(shù)均實(shí)現(xiàn)了,函數(shù)部分與課本完全相同
(貌似專欄把我縮進(jìn)吃了,懶得加了,另外建議用visual studio編譯)
代碼如下:
//串的定長(zhǎng)順序存儲(chǔ)表示
#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以內(nèi)定義最大串長(zhǎng)
typedef int Status;
typedef unsigned char SString[MAXSTRLEN + 1];//0號(hào)單元存放串的長(zhǎng)度
/*注意這個(gè)數(shù)據(jù)結(jié)構(gòu)和C語言中字符串不同,后者是在字符串末尾設(shè)置'\0',這個(gè)是在0號(hào)位置存放串長(zhǎng)*/
Status Concat(SString& T, SString S1, SString S2);//連接兩個(gè)字符串
Status SubString(SString& Sub, SString S, int pos, int len);//用Sub返回串S的第pos個(gè)字符起長(zhǎng)度為len的字串
void ShowString(SString S);//打印字符串
int main()
{
SString MyStringA, MyStringB, ConnectStr;
unsigned char c;
int i = 1;
printf("請(qǐng)輸入字符串A:");
while ((c = getchar()) != '\n' && i < 256)
{
MyStringA[i] = c;
i++;
}
MyStringA[0] = i - 1;
fflush(stdin);//清空輸入緩沖區(qū),防止用戶輸入超過字符串所能存取的最大長(zhǎng)度
printf("請(qǐng)輸入字符串B:");
i = 1;
while ((c = getchar()) != '\n' && i < 256)
{
MyStringB[i] = c;
i++;
}
MyStringB[0] = i - 1;
fflush(stdin);//清空輸入緩沖區(qū),防止用戶輸入超過字符串所能存取的最大長(zhǎng)度
if (Concat(ConnectStr, MyStringA, MyStringB))
{
printf("字符串連接成功,未截?cái)郳n");
}
else
{
printf("字符串已連接,B字符串過長(zhǎng)已被截?cái)郳n");
}
ShowString(ConnectStr);
printf("尋找A的給定長(zhǎng)度的子串,請(qǐng)輸入子串的位置和長(zhǎng)度:");
int position, length;
scanf("%d%d", &position, &length);
SString sub;
if (SubString(sub, MyStringA, position, length))
{
ShowString(sub);
}
else
{
printf("子串位置錯(cuò)誤!\n");
}
return 0;
}
Status Concat(SString& T, SString S1, SString S2)//連接兩個(gè)字符串
{
Status uncut;//是否截?cái)?/p>
if (S1[0] + S2[0] < MAXSTRLEN)//未截?cái)?/p>
{
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)//截?cái)?/p>
{
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個(gè)字符起長(zhǎng)度為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");
}