Estructura de datos 1: implementación básica de la tabla de secuencia

Tabla de contenido

1. Definir el tipo de tabla de secuencia

2. Tabla de secuencia de inicialización

3. Insertar elementos en la tabla de secuencia

4. Eliminar un elemento en la lista de secuencias

5. Encuentra elemento por bit

6. Encuentra elemento por valor

7. Inicializa la tabla de secuencias e inserta elementos en ella.

8. Tabla de secuencia de asignación dinámica


Este blog presenta principalmente las operaciones básicas de la tabla de secuencia, que es una tabla lineal que se almacena continuamente en direcciones físicas. El código presentado en este artículo usa matrices estáticas.

        En primer lugar, necesitamos definir un tipo de estructura de tabla de secuencia Sqlist, que contiene dos variables miembro: datay length, que representan respectivamente la matriz que almacena elementos de datos y el número de elementos en la tabla de secuencia actual. MaxSizeIndica la longitud máxima de la tabla de secuencias.

        Luego, necesitamos inicializar la tabla de secuencia. En InitListla función, establecer el número de elementos de la tabla de secuencias en 0 significa que la tabla de secuencias es una tabla vacía.

        Luego, podemos implementar la operación de insertar elementos o eliminar elementos en la tabla de secuencia. Específicamente, ListInsertla función se usa para iinsertar un nuevo elemento en la primera posición de la tabla de secuencias e, y ListDeletela función se usa para eliminar el primer elemento en la tabla de secuencias i. Cabe señalar que antes de realizar una operación de inserción o eliminación, es necesario determinar si la operación es legal. Si la posición que se va a insertar no está dentro del rango de la tabla de secuencias, o si la tabla de secuencias ha alcanzado la longitud máxima, entonces esta operación es ilegal.

        Además, también podemos buscar elementos por orden de bit o valor de la tabla de secuencias. Específicamente, la función se usa para buscar elementos bit a bit y devuelve el valor del GetElemprimer elemento en la tabla de secuencia ; la función se usa para buscar elementos por valor y devuelve el orden de bits del elemento cuyo primer valor es igual en la tabla de secuencias . Cabe señalar que cuando se busca por valor, se debe recorrer toda la tabla de secuencias hasta que se encuentre un elemento coincidente o se llegue al final de la lista.iLocateEleme

        Finalmente, inicializamos la tabla de secuencia en la función principal, insertamos un elemento en ella y generamos el valor de cada elemento en la tabla de secuencia. Además de los arreglos estáticos, también podemos usar arreglos asignados dinámicamente para implementar tablas secuenciales. Cabe señalar que cuando se utilizan matrices asignadas dinámicamente, se requiere la asignación y liberación de memoria dinámica para utilizar mejor los recursos de la computadora.

1. Definir el tipo de tabla de secuencia

//静态数组
#define MaxSize 10 //定义最大长度
typedef struct {
    int data[MaxSize];
    int length;
}Sqlist;

Como puede ver, usamos #definepalabras clave para definir la longitud máxima de la tabla de secuencias MaxSize, a la que se puede hacer referencia fácilmente en el código. Luego, definimos un tipo de estructura Sqlistpara representar la tabla de secuencia, que contiene dos variables miembro: datay length, que representan respectivamente la matriz que almacena elementos de datos y el número de elementos en la tabla de secuencia actual.

2. Tabla de secuencia de inicialización

void InitList(Sqlist& L) {
    L.length = 0;
}

La función de esta función es inicializar la tabla de secuencias como una tabla vacía, es decir, establecer el número de elementos en la tabla de secuencias en 0.

3. Insertar elementos en la tabla de secuencia

bool ListInsert(Sqlist& L, int i, int e) {
    if (i<1 || i>L.length + 1)
        return false;
    if (L.length >= MaxSize)
        return false;
    for (int j = L.length; j >= i; j--)//将第i个元素及之后的元素往后移动
        L.data[j] = L.data[j - 1];
    L.data[i - 1] = e;
    L.length++;
    return true;
}

ListInsertiLa función se utiliza para insertar un nuevo elemento en la posición th en la tabla de secuencia e. Primero, es necesario juzgar si la operación es legal, si la posición a insertar está fuera del rango de la tabla de secuencia, o la tabla de secuencia ha alcanzado la longitud máxima, la operación es ilegal y regresa directamente false. iDe lo contrario, el primer elemento y los elementos siguientes deben retroceder un poco para edejar espacio para el elemento insertado. Luego, inserte el elemento een la posición th iy aumente el número de elementos en la tabla de secuencia en 1 al mismo tiempo. Finalmente, un retorno trueindica que la inserción fue exitosa.

4. Eliminar un elemento en la lista de secuencias

bool ListDelete(Sqlist& L, int i, int &e) {
    if (i<1 || i>L.length + 1)
        return false;
    e = L.data[i - 1];
    for (int j = i; j < L.length; j++) {
        L.data[j - 1] = L.data[j];
    }
    L.length--;
    return true;
}

ListDeleteLa función se utiliza para eliminar el primer elemento de la lista de secuencias i. Asimismo, es necesario juzgar si la operación es legal. Si la posición a borrar está fuera del rango de la tabla de secuencia, la operación es ilegal y regresa directamente false. De lo contrario, al elemento ese le asigna iel valor del elemento th, y el ielemento th y los siguientes elementos se mueven un bit hacia adelante para eliminar el elemento e. Finalmente, el número de elementos en la tabla de secuencia se reduce en 1 y el resultado trueindica que la eliminación se realizó correctamente.

5. Encuentra elemento por bit

int GetElem(Sqlist L, int i) {
    return L.data[i - 1];
}

GetElemLa función se utiliza para encontrar elementos poco a poco, es decir, devolver iel valor del elemento th en la lista de secuencias. Cabe señalar que, dado que esta función no implica la modificación de elementos en la tabla de secuencias, se puede declarar que los parámetros se pasan por valor en lugar de por referencia.

6. Encuentra elemento por valor

int LocateElem(Sqlist L, int e) {
    for (int i = 0; i < L.length; i++)
        if (L.data[i] == e)//匹配
            return i + 1;
    return 0;
}

LocateElemeLa función se utiliza para buscar elementos por valor, es decir, devuelve el orden de bits del primer elemento cuyo valor es igual a en la lista ordenada . Cabe señalar que cuando se busca por valor, se debe recorrer toda la tabla de secuencias hasta que se encuentre un elemento coincidente o se llegue al final de la lista. Devuelve 0 si no se encuentra ningún elemento coincidente.

7. Inicializa la tabla de secuencias e inserta elementos en ella.

int main() {
    Sqlist L;
    InitList(L);
    ListInsert(L, 3, 3);
    for (int i = 0; i < MaxSize; i++) {
        printf("data[%d]=%d\n", i, L.data[i]);
    }
    return 0;
}

En mainla función, primero llamamos InitLista la función para inicializar la tabla de secuencias en una tabla vacía. Luego, use ListInsertla función para insertar el elemento 3 en la tercera posición en la tabla de secuencia. Finalmente, recorra toda la tabla de secuencias y genere el valor de cada elemento.

8. Tabla de secuencia de asignación dinámica

Además de los arreglos estáticos, también podemos usar arreglos asignados dinámicamente para implementar tablas secuenciales. Cabe señalar que cuando se utilizan matrices asignadas dinámicamente, se requiere la asignación y liberación de memoria dinámica para utilizar mejor los recursos de la computadora. El siguiente es un ejemplo de código de una tabla de secuencia de asignación dinámica simple:

#define ElemType int
#define Initsize 10
typedef struct {
    ElemType* data; //表示动态分配数组的指针
    int Maxsize;
    int length;
}SeqList;

void InitList(SeqList& L) {
    //用malloc函数申请一片连续的存储空间
    L.data = (int*)malloc(Initsize * sizeof(int));
    L.length = 0;
    L.Maxsize = Initsize;
}

//增加动态数组的长度
void IncreaseSize(SeqList& L, int len) {
    int* p = L.data;
    L.data = (int*)malloc((L.Maxsize + len) * sizeof(int));
    for (int i = 0; i < L.length; i++) {
        L.data[i] = p[i];
    }
    L.Maxsize = L.Maxsize + len;
    free(p);
}

int main() {
    SeqList L;
    InitList(L);
    IncreaseSize(L, 5);
    return 0;
}

En este código, primero definimos un tipo de estructura de una tabla de secuencia asignada dinámicamente SeqList, que contiene tres variables miembro, que representan respectivamente la matriz que almacena elementos de datos, el número de elementos en la tabla de secuencia actual y la longitud máxima de la matriz.

En InitListla función, utilice mallocla función para solicitar un espacio de almacenamiento continuo para almacenar los elementos en la tabla de secuencias y, al mismo tiempo, inicializar el número de elementos y la longitud máxima de la tabla de secuencias en 0 y valores preestablecidos Initsize.

Si el número de elementos en la tabla de secuencia ha alcanzado la longitud máxima, podemos usar IncreaseSizela función para aumentar la longitud de la tabla de secuencia para acomodar más elementos. Esta función primero guarda el puntero del espacio de almacenamiento original p, luego vuelve a solicitar un espacio de almacenamiento más grande, copia los elementos anteriores al nuevo espacio de almacenamiento uno por uno y finalmente libera el espacio de almacenamiento original.

En mainla función, primero llamamos InitLista la función para inicializar la tabla de secuencia y luego llamamos IncreaseSizea la función para aumentar la longitud de la tabla de secuencia para acomodar más elementos.

Supongo que te gusta

Origin blog.csdn.net/m0_62338174/article/details/131022431
Recomendado
Clasificación