Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Opinione su di un codice per la creazione di una lista linkata concatenata e con nodo sentinella..
Forum - C/C++ - Opinione su di un codice per la creazione di una lista linkata concatenata e con nodo sentinella..

Avatar
comtel (Member)
Pro


Messaggi: 145
Iscritto: 08/04/2011

Segnala al moderatore
Postato alle 13:50
Domenica, 23/09/2018
Salve ragazzi, vorrei avere la vostra opinione riguardo questo codice che ho scritto per l'esercizio la cui traccia č la seguente:
Realizzare in C le funzioni per la gestione, mediante menų, delle strutture dati catena mediante lista lineare dinamica e generica con nodo sentinella.

Ecco la mia soluzione:
Codice sorgente - presumibilmente C++

  1. /*
  2. * Esercizio di creazione di una linked list con struttura
  3. * a catena, attraverso l'utilizzo di un nodo sentinella.
  4. */
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9.  
  10. struct node {
  11.     char info[30];
  12.     struct node *p_next;
  13. };
  14.  
  15. typedef struct node ELEMENT;
  16. typedef ELEMENT *LINK;
  17. LINK head, punt, h_sentinel, t_sentinel;
  18.  
  19. void chain_inseriment(short, ELEMENT *, ELEMENT **);
  20. void chain_elimination(char [], ELEMENT *);
  21.  
  22. int main(int argc, char *argv[]) {
  23.     int ch = 0; ELEMENT *data; char node_to_elim[30];
  24.  
  25.     h_sentinel = (ELEMENT *)calloc(1, sizeof(ELEMENT));
  26.     t_sentinel = (ELEMENT *)calloc(1, sizeof(ELEMENT));
  27.     strcpy(h_sentinel->info, "HEAD SENTINEL");
  28.     strcpy(t_sentinel->info, "TAIL SENTINEL");
  29.  
  30.     head = h_sentinel;
  31.     h_sentinel->p_next = t_sentinel;
  32.     t_sentinel->p_next = h_sentinel;
  33.  
  34.     while(ch != 3) {
  35.         printf("0. Show, 1. Inseriment, 2. Elimination, 3. Exit;\n>> ");
  36.         scanf("%d", &ch);
  37.         switch(ch) {
  38.             case 0:
  39.                 punt = h_sentinel;
  40.                 while(punt != t_sentinel) {
  41.                     printf("%s\n", punt->info);
  42.                     punt = punt->p_next;
  43.                 }
  44.                 printf("***\n");
  45.                 break;
  46.             case 1:
  47.                 printf("Inseriment of the node:\n");
  48.                 data = (ELEMENT *)calloc(1, sizeof(ELEMENT));
  49.                 scanf(" %s", data->info);
  50.                 chain_inseriment(sizeof(ELEMENT), data, &h_sentinel);
  51.                 printf("***\n");
  52.                 break;
  53.             case 2:
  54.                 printf("Elimination of the node:\n");
  55.                 scanf(" %s", node_to_elim);
  56.                 chain_elimination(node_to_elim, h_sentinel);
  57.                 printf("***\n");
  58.                 break;
  59.             case 3:
  60.                 printf("Exiting..\n");
  61.                 exit(1);
  62.             default:
  63.                 printf("Command not found..\n");
  64.                 break;
  65.         }
  66.     }
  67. }
  68.  
  69. void chain_inseriment(short len_info, ELEMENT *data, ELEMENT **h_sentinel) {
  70.     ELEMENT *ptr = (ELEMENT *)calloc(1, sizeof(ELEMENT));
  71.     memcpy(ptr, data, len_info);
  72.      
  73.     ptr->p_next = (*h_sentinel)->p_next;
  74.     (*h_sentinel)->p_next = ptr;  
  75. }
  76.  
  77. void chain_elimination(char node_to_elim[], ELEMENT *h_sentinel) {
  78.     punt = h_sentinel;
  79.     while(punt != t_sentinel) {
  80.         if(strcmp((punt->p_next)->info, node_to_elim) == 0) {
  81.             punt->p_next = (punt->p_next)->p_next;
  82.             break;
  83.         } else {
  84.             punt = punt->p_next;
  85.         }
  86.     }
  87. }




PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 19:14
Domenica, 23/09/2018
A parte il limite di 30 caratteri su node_to_elim e info (se inserisco piu' di 30 caratteri probabilmente andro' a causare un segfault), mi sembra una buona implementazione. :k:


Il mio blog: https://piero.dev
PM Quote
Avatar
comtel (Member)
Pro


Messaggi: 145
Iscritto: 08/04/2011

Segnala al moderatore
Postato alle 9:15
Lunedė, 24/09/2018
Ti ringrazio Piero :)

PM Quote