Prefácio
Nesta seção, vamos falar sobre tabelas generalizadas em linguagem C. Principalmente apresentar a definição conceitual da tabela generalizada, e explicar sua estrutura de armazenamento, o algoritmo usará a ideia recursiva.
A tabela generalizada é uma espécie de extensão da tabela linear, amplamente utilizada na estrutura de dados.
1. O conceito de mesa generalizada
1. O conceito de tabelas generalizadas
(1) Tabela generalizada: também chamada de lista, é uma sequência finita de n (n> = 0) elementos,
denotados como: LS = (a1, a2, ..., an) ai (1 <= i <= n ) é o elemento de dados Ou tabela generalizada
onde:
LS: nome da tabela generalizada
n: comprimento de LS
Geralmente, as letras maiúsculas indicam o nome da tabela generalizada e as letras minúsculas indicam os elementos de dados
(2) Atom: Quando o elemento da tabela generalizada LS é um elemento de dados, é denominado atom
(3) A subtabela da tabela generalizada LS: Quando o elemento da tabela generalizada LS não é um elemento de dados, é chamado a subtabela da tabela generalizada
(4) A cabeça de LS: Quando a tabela generalizada não está vazia, o primeiro elemento a1 é chamado de cabeça de
LS (5) A cauda de LS: o resto (a2, ..., an ) é chamado de cauda
Por exemplo:
(1) A = (): A é uma lista vazia, comprimento n = 0
(2) B = (e), Cabeça (B) = e, Cauda (B) = (): uma cauda generalizada da tabela é Tabela vazia, o comprimento é 1
(3) C = (a, (b, c)), Cabeça © = a é um átomo, Cauda © = ((b, c)) é uma mesa generalizada e o comprimento da cauda é 1
(4) D = ((a, b), c), Cabeça (D) = (a, b) é uma tabela generalizada, Cauda (D) = ©
(5) E = ((a, b), c , (d, e)), Cabeça (E) = (a, b) é a subtabela de E, Cauda (E) = (c, (d, e)), Cabeça (Cauda (E)) = c, Cauda (Cauda (E)) = ((d, e))
Conclusão 1: A tabela generalizada permite o compartilhamento de subtabelas.
Conclusão 2: A tabela generalizada também permite a definição
de recursão d. Exemplo: G = (a, G) onde G é uma tabela generalizada de comprimento 2, o primeiro elemento é o átomo a, e os segundos Elementos são a própria tabela generalizada G
2. Representação gráfica de tabelas generalizadas
Em segundo lugar, a estrutura de armazenamento da tabela generalizada
1. A estrutura de armazenamento da tabela generalizada
(1) Uma vez que os elementos na tabela generalizada podem ser átomos ou tabelas generalizadas, haverá nós atômicos e nós de lista vinculada.
(2) O tamanho do espaço necessário para cada elemento não pode ser unificado, por isso é difícil de usar ordem Representação da estrutura de armazenamento, geralmente representada por uma estrutura em cadeia
Nó atômico: tag = 0 átomo (elemento), apenas 2 campos, campo de sinalização e campo de valor
nó da lista: tag = 1 hp (cabeçalho) tp (cabeçalho), há 3 campos, campo de bandeira, campo de ponteiro de cabeçalho e ponteiro de cauda de tabela campo
注:这种链式存储结构中,为了统一管理这2类结点,采用了共同体(联合)来定义广义表的结点类型。
//相关定义
typedef struct GLNode
{
ElemTag tag;//标志域,用以区分原子结点和表结点
union
{
AtomType atom;//原子结点
struct
{
struct GLNode *hp,*tp;
}ptr;//表结点
}
}*GList;
2. Operações básicas de tabelas generalizadas (algoritmo recursivo)
(1) Encontre o comprimento da tabela generalizada: int GLisitLength (Glist L)
Definição recursiva:
se L == NULL, comprimento 0
se L! = NULL, comprimento: 1 + GLisitLength (L-> ptr.tp)
//求广义表的长度
int GLisitLength (Glist L)
{
if (!L)
return 0;
return 1+GLisitLength(L->ptr.tp);
}
(2) Encontre a profundidade da tabela generalizada: int GLisitDepth (Glist L)
Tabela generalizada: LS = (a1, a2, ..., an)
Definição recursiva:
Se L == NULL,
se a profundidade for 1 se L! = NULL, profundidade: 1 + Max (ai)
L-> tag == 0, nó atômico: profundidade 0
//求广义表的深度
int GLisitDepth (Glist L)
{
if (!L)
return 1;
if (L->tag==0)
return 0;
for (max=0,p=L;p;p=p->ptr.tp)
{
dep = GLisitDepth(p->ptr.hp);
if (dep>max)
max = dep;
}
return max+1;
}
Resumindo
O texto acima apresentou brevemente a tabela generalizada. Existem muitas outras operações básicas em tabelas generalizadas, portanto, não as repetirei aqui. Se você estiver interessado, pode examinar outras implementações de código.
O próximo artigo iniciará a introdução da árvore de estrutura não linear. O comprimento é maior e será dividido em duas partes.
ps: O código não é original.
Se houver algum erro, corrija-me.