La implementación de mi cola (en C) -- ampo con queue camp codereview Relacionados El problema

My queue implementation (in C)


6
vote

problema

Español

Esta es la implementación de mi cola en C. Siéntase libre de hacerme cualquier pregunta relacionada con mi código. Cualquier consejo o sugerencia es bienvenido, incluidos consejos sobre el nombramiento / espaciamiento / convenciones comunes.

queue_node, cola, create_queue, destroye_queue, queue_push, queue_pop están destinados a trabajar con cualquier estructura de nodos que tenga un miembro 99887776655544330 y funciones para crear el nodo y destruir el nodo.

  #include <stdlib.h> /* malloc(), EXIT_SUCCESS */ #include <stdio.h> /* fprintf */ #include <stddef.h> /* size_t */  struct Coordinate {     int x;     int y; };  struct Queue_node {     struct Queue_node *next; };  struct Queue {     struct Queue_node *front;     struct Queue_node *back;      size_t size; };  struct Queue* create_queue(void) {      struct Queue *created_queue = malloc(sizeof(*created_queue));      if (created_queue == NULL) {         return NULL;     }      created_queue->back = NULL;     created_queue->front = NULL;     created_queue->size = 0;      return created_queue; }  void destroy_queue(struct Queue *input_queue, void (*delete_node)(void*)) {      while (input_queue->front != NULL) {          struct Queue_node *deleted_node = input_queue->front;         input_queue->front = input_queue->front->next;         if (delete_node != NULL) {             delete_node(deleted_node);         }     }     free(input_queue); }  void queue_push(struct Queue *input_queue, void *input_node) {      ++input_queue->size;      if (input_queue->front == NULL) { // first insert          input_queue->front = (struct Queue_node*) input_node;         input_queue->back = (struct Queue_node*) input_node;          return;     }      input_queue->back->next = (struct Queue_node*) input_node;     input_queue->back = input_queue->back->next; }  void* queue_pop(struct Queue* input_queue) {      if (input_queue->front == NULL) { // empty queue         return NULL;     }      --input_queue->size;      struct Queue_node *deleted_node = input_queue->front;     input_queue->front = input_queue->front->next;      return deleted_node; }  /* nodes that are queue_pop()'d must be free()'d by caller */  static struct Weighted_coord_node {     struct Queue_node *next;     // parent property      int weight;     struct Coordinate coord;     // child properties };  static struct Weighted_coord_node* create_node(struct Coordinate coord, int weight) {      struct Weighted_coord_node *node = malloc(sizeof(*node));      if (node == NULL) {         return NULL;     }     node->next = NULL;     node->coord = coord;     node->weight = weight;      return node; }  int main() {      struct Queue *my_queue = create_queue();     if (!my_queue) {         return EXIT_FAILURE;     }      struct Weighted_coord_node *my_node;          my_node = create_node((struct Coordinate){5,5}, 0);     if (!my_node) {         return EXIT_FAILURE;     }     queue_push(my_queue, my_node);      my_node = create_node((struct Coordinate){7,7}, 2);     if (!my_node) {         return EXIT_FAILURE;     }     queue_push(my_queue, my_node);      my_node = create_node((struct Coordinate){11,11}, 5);     if (!my_node) {         return EXIT_FAILURE;     }     queue_push(my_queue, my_node);      while (my_node = queue_pop(my_queue)) {         fprintf(stderr, "POP->  X: %i, Y:%i   weight: %i ", my_node->coord.x, my_node->coord.y, my_node->weight);         free(my_node);     }      destroy_queue(my_queue, free);      return EXIT_SUCCESS; }   

Reescribí el código después de la sugerencia de VNP. Aquí está la nueva versión: Mi implementación de la cola (en C) [V.2]

Original en ingles

This is my queue implementtion in C. Feel free to ask me any questions relating to my code. Any tips or suggestions are welcome, including tips on naming/spacing/common conventions.

Queue_node, Queue, create_queue, destroye_queue, queue_push, queue_pop are meant to work with any node struct which has a member struct Queue_node *next and functions to create the node and destroy the node.

#include <stdlib.h> /* malloc(), EXIT_SUCCESS */ #include <stdio.h> /* fprintf */ #include <stddef.h> /* size_t */  struct Coordinate {     int x;     int y; };  struct Queue_node {     struct Queue_node *next; };  struct Queue {     struct Queue_node *front;     struct Queue_node *back;      size_t size; };  struct Queue* create_queue(void) {      struct Queue *created_queue = malloc(sizeof(*created_queue));      if (created_queue == NULL) {         return NULL;     }      created_queue->back = NULL;     created_queue->front = NULL;     created_queue->size = 0;      return created_queue; }  void destroy_queue(struct Queue *input_queue, void (*delete_node)(void*)) {      while (input_queue->front != NULL) {          struct Queue_node *deleted_node = input_queue->front;         input_queue->front = input_queue->front->next;         if (delete_node != NULL) {             delete_node(deleted_node);         }     }     free(input_queue); }  void queue_push(struct Queue *input_queue, void *input_node) {      ++input_queue->size;      if (input_queue->front == NULL) { // first insert          input_queue->front = (struct Queue_node*) input_node;         input_queue->back = (struct Queue_node*) input_node;          return;     }      input_queue->back->next = (struct Queue_node*) input_node;     input_queue->back = input_queue->back->next; }  void* queue_pop(struct Queue* input_queue) {      if (input_queue->front == NULL) { // empty queue         return NULL;     }      --input_queue->size;      struct Queue_node *deleted_node = input_queue->front;     input_queue->front = input_queue->front->next;      return deleted_node; }  /* nodes that are queue_pop()'d must be free()'d by caller */  static struct Weighted_coord_node {     struct Queue_node *next;     // parent property      int weight;     struct Coordinate coord;     // child properties };  static struct Weighted_coord_node* create_node(struct Coordinate coord, int weight) {      struct Weighted_coord_node *node = malloc(sizeof(*node));      if (node == NULL) {         return NULL;     }     node->next = NULL;     node->coord = coord;     node->weight = weight;      return node; }  int main() {      struct Queue *my_queue = create_queue();     if (!my_queue) {         return EXIT_FAILURE;     }      struct Weighted_coord_node *my_node;          my_node = create_node((struct Coordinate){5,5}, 0);     if (!my_node) {         return EXIT_FAILURE;     }     queue_push(my_queue, my_node);      my_node = create_node((struct Coordinate){7,7}, 2);     if (!my_node) {         return EXIT_FAILURE;     }     queue_push(my_queue, my_node);      my_node = create_node((struct Coordinate){11,11}, 5);     if (!my_node) {         return EXIT_FAILURE;     }     queue_push(my_queue, my_node);      while (my_node = queue_pop(my_queue)) {         fprintf(stderr, "POP->  X: %i, Y:%i   weight: %i\n", my_node->coord.x, my_node->coord.y, my_node->weight);         free(my_node);     }      destroy_queue(my_queue, free);      return EXIT_SUCCESS; } 

I rewrote the code following @vnp's suggestion. Here is the new version: My queue implementation (in C) [V.2]

     
   
   

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 
  • seco . Object.assign0 ASIGNA Object.assign1 al Object.assign2 No importa qué. Considerar

      Object.assign3  

    ( Object.assign4 s Hay solo para aclarar la lógica).

    DITTO PARA Object.assign5 .

  • Por lo general, no queremos que el código del cliente esté al tanto de los contenedores, ni depende de ellos. Si la percepción, eventualmente, decidiría mantener las coordenadas ponderadas en un árbol en lugar de una lista, deberá rediseñar 99887766555443316 y el código circundante. Recomiendo encarecidamente tener Object.assign7 Mantener el puntero a los datos reales

      Object.assign8  
 
  • DRY. queue_push assigns queue_back to the input_node no matter what. Consider

      if (input_queue->front == NULL) {       assert(input_queue->back == NULL);       input_queue->front = input_node;   } else {       assert(input_queue->back != NULL);       input_queue->back->next = input_node;   }   input_queue->back = input_node; 

    (asserts are there only to clarify the logic).

    Ditto for queue_pop.

  • Usually we don't want the client code to be aware of the containers, neither depend of them. If perchance you'd eventually decide to keep the weighted coordinates in a tree rather than a list, you'd need to redesign struct Weighted_coord_node, and the surrounding code. I strongly recommend to have struct Queue_node keeping the pointer to the actual data

      struct Queue_node {       struct Queue_node * next;       void * client_data;   }; 
 
 
 
 

Relacionados problema

2  Montón Binomial en Java  ( Binomial heap in java ) 
Tengo esta implementación de un montón de binomio que proporciona inserto, disminución de la tecla y el extracto en el tiempo logarítmico. minpriorityqueue...

1  DEQUEUE () en la implementación de la cola que utiliza una lista circular vinculada  ( Dequeue in queue implememtation that uses a circular linked list ) 
Utilizo una lista de enlaces circulares para implementar un queue , y solo sostiene un 99887776665544332 (Tenga en cuenta que 99887776655443333 enlaces a...

5  Cola de bloqueo con la exactitud de la lista doblemente vinculada  ( Lock free queue with doubly linked list correctness ) 
Necesito una cola de bloqueo que se implementa mediante la lista doblemente vinculada. es mi código correcto? ¿Hay algún error? ¿Hay alguna mejoras a realiz...

8  Reader de cola sin bloqueo Seclador de Singler-Writer en C ++  ( Lockless queue multiple reader singler writer in c ) 
Escribí una cola sin encimera para enviar objetos pequeños desde un solo hilo a un hilo de trabajador aleatorio. suposiciones: x86 / x86_64 compilado con...

2  Cola de bloqueo delimitada  ( Bounded blocking queue ) 
¿Puede alguien por favor revise este código para mí? No he implementado todos los métodos para la simplicidad. NSUSerDefaults1 Preguntas abiertas: l...

4  Linkedlist para ser utilizado en una pila o cola  ( Linkedlist to be used in a stack or queue ) 
Todo esto funciona. Solo quería asegurarse de que no me perdí nada. Viniendo de C ++ y trabajando en mi camino a través de algoritmos, 4ta ed. Aquí está mi cl...

3  Cola de JavaScript para las funciones de ASYNC  ( Javascript queue for async functions ) 
Basado en la respuesta a Mi pregunta anterior sobre el desbordamiento de pila , armé la siguiente clase de cola. Me doy cuenta de que ya hay bibliotecas para...

2  Implementación de la lista de la cola prioritaria  ( Priority queue linked list implementation ) 
Soy nuevo en Python y quería asegurarme de que mi código responde a la pregunta de mi tarea debido. Mi tarea: Una cola de prioridad es una cola en la que...

19  Una clase de hilo-piscina / cola personalizada  ( A custom thread pool queue class ) 
Quería una clase que ejecuta cualquier cantidad de tareas, pero solo cierta cantidad al mismo tiempo (por ejemplo, para descargar varios contenidos de Interne...

3  Cola MultiPhread Generic Simple  ( Simple generic multithreaded queue ) 
Esta es una cola de hilo simple que se usa en un modelo de consumidor productor. public class ThreadedQueue<TType> { private Queue<TType> _queue; p...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos