Um artigo para ensiná-lo a compreender uma sequência de estruturas de dados
① A definição do tipo de string
A definição de string é muito mais simples do que pilha e fila. Existem muitas funções para manipular strings na linguagem C, e a biblioteca de funções correspondente é string.h. O histórico de desenvolvimento da string é fornecido a seguir para aprofundar a impressão do leitor. (Não é o ponto principal, você pode pular se já tiver algum entendimento)
O objeto de processamento não numérico no computador são basicamente dados de string. Em linguagens de programação anteriores, as
cadeias de caracteres apareciam como constantes para entrada e saída. Com o desenvolvimento de programas de processamento de linguagem, o processamento de strings surgiu.
Desta forma, as cadeias de caracteres aparecem como um tipo de variável em cada vez mais linguagens de programação e uma
série de operações de cadeias de caracteres também são produzidas . Strings são geralmente chamados de strings para abreviar. No compilador assembly e de linguagem, o programa de origem e o
programa de destino são todos dados de cadeia de caracteres. No procedimento de processamento de transações, o nome e o endereço do cliente, bem como o nome, o local de origem e as especificações das mercadorias,
são geralmente tratados como cadeias de caracteres. Outro exemplo são os sistemas de recuperação de informações, programas de edição de texto, sistemas de perguntas e respostas,
sistemas de tradução de linguagem natural e programas de análise de música, todos os quais usam dados de string como o objeto de processamento.
No entanto, a estrutura de hardware do computador que usamos hoje em dia reflete principalmente as necessidades de cálculos numéricos, portanto, processar
dados de string é muito mais complicado do que processar números inteiros e de ponto flutuante. Além disso, em diferentes tipos de aplicações, as
cadeias processadas apresentam características diferentes.Para realizar o processamento de cadeias de forma eficaz, é necessário utilizar uma
estrutura de armazenamento adequada de acordo com a situação específica . Neste capítulo, discutiremos algumas operações básicas de manipulação de strings e várias estruturas de armazenamento diferentes.
Para a descrição da string, esta é a definição no livro didático. Embora simples, os leitores devem lê-lo com atenção.
② Representação e realização de string
Para strings, a maioria das operações em matrizes de caracteres pode ser feita usando funções na biblioteca de funções da linguagem C. O seguinte é baseado na string, combinada com a estrutura e não se aplica às funções integradas da biblioteca string.h O autor implementou o algoritmo de operação de alocação de heap para sua referência, estudo e uso. Nas capturas de tela do livro abaixo, o pseudocódigo explicou o processo de implementação da função em detalhes, então não o repetirei mais tarde.
Com relação ao algoritmo de correspondência de padrões e algoritmo de otimização para strings mais tarde, os leitores interessados podem ler e aprender por si próprios. A seguir está uma captura de tela da operação do algoritmo acima:
Finalmente o código
#include<stdio.h>
#include<malloc.h>
#define LEN sizeof(struct string)
struct string{
char *ch;
int length;
};
int main()
{
char s1[5]="123",s2[5]="456";
struct string *string1,*string2,*string3,*string4;
struct string *StrAssign(char *chars); // 生成一个其值等于串常量的串str
int StrLength(struct string *str); // 返回str元素的个数,称为串的长度
int StrCompare(struct string *str1,struct string *str2); // 若str1大于str2,返回值>0;若str1大于str2,返回值<0;若相等,返回值=0
void ClearString(struct string *str); // 将str清为空串
struct string *Concat(struct string *str1,struct string *str2); // 将str1和str2合成新串
void SubString(struct string *str,struct string *str2,int pos,int len); // 用sub返回串str中第pos个字符起长度为len的字串
// 测试
string1 = StrAssign(s1); // 初始化string1,string2,并将其ch的值分别赋为s1和s2
string2 = StrAssign(s2);
string4 = StrAssign(s1); // 给string4的ch赋上初值
printf("%s\n",string1->ch); // 输出string1的ch字符串
printf("%d\n",StrCompare(string1,string2)); // 比较string1和string2的ch字符串的大小
string3 = Concat(string1,string2); // 连接string1和string2
printf("%s\n",string3->ch);
SubString(string3,string4,1,2); // 测试SubString函数
printf("%s\n",string4->ch);
ClearString(string1); // 将string1清为空串
return 0;
}
struct string *StrAssign(char *chars)
{
// 生成一个其值等于串常量的串str
struct string *str;
str = (struct string*)malloc(LEN);
int i;
for(i = 0;chars[i] != '\0';i++);
str->length = i;
str->ch = chars;
return str;
}
int StrLength(struct string *str)
{
// 返回str元素的个数,称为串的长度
return str->length;
}
int StrCompare(struct string *str1,struct string *str2)
{
// 若str1大于str2,返回值>0;若str1大于str2,返回值<0;若相等,返回值=0
int i;
for(i = 0;i < StrLength(str1) && i < StrLength(str2);i++){
if(str1->ch[i] != str2->ch[i]){
return str1->ch[i] - str2->ch[i];
}
}
return str1->ch[i] - str2->ch[i];
}
void ClearString(struct string *str)
{
// 将str清为空串
str->ch = "";
str->length = 0;
printf("clear over!\n");
}
struct string *Concat(struct string *str1,struct string *str2)
{
// 将str1和str2合成新串
struct string *str3;
int i,j;
str3 = (struct string*)malloc(LEN);
str3->ch = str1->ch;
str3->length = str1->length + str2->length;
for(i = str1->length,j = 0;j < str2->length;i++,j++){
str3->ch[i] = str2->ch[j];
}
str3->ch[i] = '\0';
return str3;
}
void SubString(struct string *str,struct string *str2,int pos,int len)
{
// 用sub返回串str中第pos个字符起长度为len的字串
int i,j;
for(i = pos,j = 0;i < pos + len;i++,j++){
str2->ch[j] = str->ch[i];
}
str2->ch[j] = '\0';
str2->length = len;
}