¿Cómo implementar la estructura de datos a través del lenguaje C? Dé un ejemplo y sea lo más detallado posible.
La estructura de los datos no es más que tablas: listas lineales, listas enlazadas, pilas, colas, cadenas, matrices, árboles, árboles binarios, gráficos, etc.
Es común utilizar punteros o matrices para crear estructuras de datos y luego realizar operaciones como insertarlas, eliminarlas, buscarlas y ordenarlas.
La siguiente es una cola circular implementada en lenguaje C:
#include
#include
#define MAX_QSIZE 5
struct SqQueue
{ QElemType *base; // Espacio de almacenamiento asignado dinámicamente
int front; si la cola no está vacía, apunta al elemento principal de la cola
int rear; // Puntero de cola, si la cola no está vacía, apunta a la siguiente posición del elemento final de la cola. queue
};
// bo3-4.cpp operaciones básicas (9) de la cola circular (estructura de almacenamiento definida por c3-3.h)
void InitQueue(SqQueue &Q)
{ //Construye una cola vacía Q. En la página 64 del libro de texto
Q.base=(QElemType*)malloc(MAX_QSIZE*sizeof(QElemType));
if(!Q.base) // Error en la asignación de almacenamiento
salir(OVERFLOW);
Q.front=Q.rear=0;
}
void DestroyQueue(SqQueue &Q)
{ // Destruye la cola Q, Q ya no existe
if(Q.base) // La cola Q existe
free(Q.base); // Libera el espacio de almacenamiento señalado por Q.base
Q.base=NULL; // Q.base no apunta a ninguna unidad de almacenamiento
Q.front=Q.rear =0;
}
void ClearQueue(SqQueue &Q)
{ // Borrar la cola Q como una cola vacía
Q. front=Q .rear=0;
}
int QueueEmpty(SqQueue Q)
{ // Si la cola Q es una cola vacía, devuelve TRUE; de lo contrario, devuelve FALSO
if(Q.front==Q.rear) // Bandera de cola vacía
devuelve TRUE;
else
return FALSE;
}
int GetHead(SqQueue Q,QElemType &e)
{ // Si la cola Q no está vacía, use e para regresar el encabezado del elemento Q y devuelve OK; de lo contrario, devuelve ERROR
if(Q.front==Q.rear) // La cola está vacía
return ERROR; p>
e= Q.base[Q.front]; // Asigna el valor del elemento principal de la cola a e
return OK;
}
int EnQueue(SqQueue &Q ,QElemType e)
{ // Inserta el elemento e como el nuevo elemento de cola de la cola Q.
En la página 65 del libro de texto
if((Q.rear+1)%MAX_QSIZE==Q.front) // La cola está llena
return ERROR;
Q.base[Q.rear]=e; //Inserta e al final de la cola
Q.rear=(Q.rear+1)%MAX_QSIZE; el puntero de cola a MAX_QSIZE Toma el resto
return OK;
}
int QueueLength(SqQueue Q)
{ // Devuelve el número de elementos en la cola Q, es decir, la longitud de la cola.
En la página 64 del libro de texto
return(Q.rear-Q.front+MAX_QSIZE)%MAX_QSIZE;
}
int DeQueue(SqQueue &Q,QElemType &e ) // En la página 65 del libro de texto
{ // Si la cola Q no está vacía, elimine el elemento principal de Q, devuelva su valor con e y devuelva OK, de lo contrario, devuelva ERROR<; /p>
if(Q.front==Q.rear) // La cola está vacía
return ERROR;
e=Q.base[Q.front] ; // Reemplazar el encabezado de la cola El valor del elemento se asigna a e
Q.front=(Q.front+1)%MAX_QSIZE // Mover el puntero del encabezado de la cola
return OK;
}
void QueueTraverse(SqQueue Q,void(*visit)(QElemType))
{ // Llama a la función de visita en cada elemento en la cola Q desde el principio hasta el final de la cola. ()
int i=Q.front; // i inicialmente apunta al elemento al principio de la cola
while(i!=Q.rear) // i apunta al elemento en la cola Q
{ visit(Q.base[i] // Llama a la función visit() en el elemento señalado; a por i
i=(i+1)%MAX_QSIZE; // Apuntado por i Siguiente elemento
}
printf("\n") ;
}
void main()
{
int j;
int i=0, m;
int d;
SqQueue Q;
InitQueue(Q); // Inicializa la cola Q, sal si falla
printf("Después de inicializar la cola, ¿está vacía? %u(1: vacío 0: no)\n", QueueEmpty(Q));
printf("Ingrese elementos de cola enteros (no más de %d), -1 es el terminador temprano: ",MAX_QSIZE-1);
do
{ scanf("%d",&d); // Ingrese el elemento de cola entero desde el teclado
if(d==-1) // La entrada es por adelantado Terminator
break // Salir del bucle de datos de entrada
i++; // Contador +1
EnQueue(Q,d); // Ingresa los elementos de entrada de la cola
} while(i printf("La longitud de la cola es %d,",QueueLength (Q)); printf("¿La cola está vacía ahora? %u(1: Vacío 0: No)\n",QueueEmpty(Q)); printf("Los elementos se eliminan del encabezado de la cola %d veces consecutivas y los elementos se insertan desde el cola de la cola:\n",MAX_QSIZE ); for(m=1;m<=MAX_QSIZE;m++) { DeQueue(Q,d); // Eliminar el elemento principal y asigne su valor a d printf("El elemento eliminado es %d, ingrese el elemento a insertar:",d); scanf("% d",&d); // Ingresa el elemento a insertar Los elementos del equipo se entregan a d p> EnQueue(Q,d); // Poner en cola d } m=QueueLength(Q); // m es la longitud de la cola Q printf("Los elementos de la cola ahora están"); QueueTraverse(Q,print); // Llama a la función de impresión en cada elemento de la cola Q secuencialmente desde el encabezado; hasta el final de la cola. () printf("***Insertar %d elementos al final de la cola.",i+MAX_QSIZE); if(m -2>0) printf("Ahora elimina %d elementos del encabezado de la cola",m-2); while(QueueLength(Q)>2) { DeQueue( Q,d); // Elimina el elemento principal y asigna su valor a d printf("El valor del elemento eliminado es %d,",d ); } p> j=GetHead(Q,d); // Asigna el elemento principal de la cola a d if(j) // Cola Q no está vacío printf(" Ahora el elemento principal de la cola es %d\n",d); ClearQueue(Q); // Borra la cola Q printf("Después de borrar la cola, ¿está vacía?% u(1: Vacío 0: No)\n",QueueEmpty(Q)); DestroyQueue(Q); Destruir cola Q }