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
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: data
y length
, que representan respectivamente la matriz que almacena elementos de datos y el número de elementos en la tabla de secuencia actual. MaxSize
Indica la longitud máxima de la tabla de secuencias.
Luego, necesitamos inicializar la tabla de secuencia. En InitList
la 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, ListInsert
la función se usa para i
insertar un nuevo elemento en la primera posición de la tabla de secuencias e
, y ListDelete
la 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 GetElem
primer 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.i
LocateElem
e
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 #define
palabras 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 Sqlist
para representar la tabla de secuencia, que contiene dos variables miembro: data
y 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;
}
ListInsert
i
La 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
. i
De lo contrario, el primer elemento y los elementos siguientes deben retroceder un poco para e
dejar espacio para el elemento insertado. Luego, inserte el elemento e
en la posición th i
y aumente el número de elementos en la tabla de secuencia en 1 al mismo tiempo. Finalmente, un retorno true
indica 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;
}
ListDelete
La 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 e
se le asigna i
el valor del elemento th, y el i
elemento 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 true
indica que la eliminación se realizó correctamente.
5. Encuentra elemento por bit
int GetElem(Sqlist L, int i) {
return L.data[i - 1];
}
GetElem
La función se utiliza para encontrar elementos poco a poco, es decir, devolver i
el 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;
}
LocateElem
e
La 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 main
la función, primero llamamos InitList
a la función para inicializar la tabla de secuencias en una tabla vacía. Luego, use ListInsert
la 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 InitList
la función, utilice malloc
la 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 IncreaseSize
la 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 main
la función, primero llamamos InitList
a la función para inicializar la tabla de secuencia y luego llamamos IncreaseSize
a la función para aumentar la longitud de la tabla de secuencia para acomodar más elementos.