C/Traballar con listas encadeadas: Diferenzas entre revisións

Contido eliminado Contido engadido
Gallaecio (conversa | contribucións)
Vou gardando, sigo tomando apuntes pero non sei se haberá máis.
Gallaecio (conversa | contribucións)
→‎Engadir bloques á lista: Ampliado cun programa base para engadir datos a unha lista encadeada
Liña 33:
Para crear bloques para a lista, farase xeralmente un a un a través dunha función como a seguinte:
<source lang=c>
estrutura * funciónCrearUnBloque(void)
{
estrutura * punteiro;
Liña 46:
</source>
 
O programa que chamase aá función debería controlar o valor que devolvese a función, e en caso de ser o punteiro nulo, actuar en consecuencia. Agora imaxinemos que a estrutura dos bloques, ademais de conter o punteiro que sinala ao seguinte bloque na lista encadeada, contén un <code>signed int</code>, que será o verdadeiro contido do bloque. Nese caso, para introducir novos datos na lista encadeada utilizaríase unha función como a seguinte:
<source lang=c>
signed short int InserirUnDato(estrutura ** punteiro, signed int dato)
{
// Declaración de variables
estrutura * bloque = NULL;
estrutura * lista = NULL;
estrutura * anterior = NULL;
 
bloque = CrearUnBloque(); // Pídese espazo para un bloque novo. A función corresponderíase coa anterior.
if(bloque == NULL)
{
printf("Non se puido reservar espazo para un novo bloque.\n");
return -1;
}
 
lista = *punteiro; // Recíbese a lista en “lista”, o punteiro ao que apunta “punteiro”.
 
while(lista && lista->dato < dato) // Cómpre ter en conta que a lista sempre ten que estar ordenada.
{
anterior = lista; // Apúntase primeiro o bloque actual.
lista = lista->seguinte; // Avánzase ao seguinte bloque da lista.
}
 
if(anterior == NULL) // Se a lista está baleira...
{
bloque->dato = dato; // Métese o dato no bloque reservado para o mesmo.
bloque->seguinte = lista; // Só haberá un bloque, o punteiro ao seguinte bloque será “lista”, nulo.
*punteiro = bloque; // O punteiro á lista apunta ao bloque, dado que é o único da lista.
}
else
{
bloque->dato = dato; // Métese o dato no bloque reservado para o mesmo.
bloque->seguinte = lista; // Punteiro ao seguinte bloque, ou a nada se é o último bloque.
anterior->seguinte = bloque;
}
 
return 0; // Saída correcta da función.
}
</source>
 
Cómpre ter en conta que este é o programa base á hora de engadir novos datos a unha lista encadeada e, xa que logo, pode ser que o programador queira modificalo para personalizalo.
 
==Véxase tamén==