Una lista estática es un tipo de Lista que almacena elementos en un array con una posición fija. Este tipo de lista es ideal para manipular posiciones, buscar elementos y acceder a posiciones arbitrarias rápidamente. Sin embargo, no es óptimo en aplicaciones donde el tamaño de la muestra del elemento que se va a almacenar es desconocido o donde no se puede reservar espacio que no se utilizará; para estas aplicaciones véase Listas Dinámicas.


Estructura de datos

#define LNULL -1    //posición nula
#define MAX 10      //la lista tendrá 10 elementos [0-9]
 
typedef ... tItemL; //tipo de elemento
typedef int tPosL;  //tipo de posición
 
// Para lista estática:
typedef struct {
    tItemL data[MAX]; //Array donde se almacena la información
    tPosL lastPos;    //Última posición que almacena información útil
} tList;

Implementación no ordenada:

void createEmptyList(tList *L) {  
    L->lastPos = LNULL;  
}  
  
bool isEmptyList(tList L) {  
    return L.lastPos == LNULL;  
}  
  
bool insertItem(tItemL d, tPosL p, tList *L) {  
    bool out = false;  
    if (L->lastPos < MAX - 1) {  //lista no llena  
        if (p == LNULL || p == L->lastPos) {  //Primer elemento o al final
            L->lastPos++;  
            L->data[L->lastPos] = d;  
        } else {  
            //si hay más elementos delante de p, rotamos 1 a dcha.
            for (tPosL i = L->lastPos; i > 0 && d < L->data[i-1]; i--) {  
                L->data[i] = L->data[i - 1];  
            }  
            L->data[p] = d;  
        }  
        out = true;  
    }  
    return out;  
}  
  
void deleteAtPosition(tPosL p, tList *L) {  
    for (tPosL i = p; i < L->lastPos; i++) {
        L->data[i] = L->data[i + 1];  
    }  
    L->lastPos--; 
}  
  
tItemL getItem(tPosL p, tList L) {  
    return L.data[p];  
}  
  
void updateItem(tItemL d, tPosL p, tList *L) {  
    L->data[p] = d;  
}  
  
tPosL findItem(tConsoleId id, tList L) {  
    tPosL out = LNULL; //valor nulo por defecto  
    tPosL p;  
 
	//atravesamos la lista hasta encontrar un match o terminar el recorrido 
    for (p=0; p <= L.lastPos && out == LNULL ;p++) {
        if (strcmp(L.data[p].consoleId, id) == 0) {  
            out = p;
        }  
    }  
    return out;  
}  
  
tPosL first(tList L) {  
    return isEmptyList(L) ? LNULL : 0;  
}  
  
tPosL last(tList L) {  
    return L.lastPos;
}  
  
tPosL previous(tPosL p, tList L) {  
    return !(isEmptyList(L) || p<=0) ? p - 1: LNULL;  
}  
  
tPosL next(tPosL p, tList L) {  
    return (p >= 0 && p < L.lastPos) ? p + 1: LNULL;  
}