Tabela de estrutura de dados generalizada em linguagem C (conceito e sua estrutura de armazenamento)

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

Insira a descrição da imagem aqui

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.

Acho que você gosta

Origin blog.csdn.net/qq_51308373/article/details/115351066
Recomendado
Clasificación