title: How to delete the first node of a linked list?
body: <p>I want to delete the first Node of a list (I call it &quot;head&quot;) but output give me an error &quot;pointer being freed was not allocated&quot;. Do you know where is the issue? Sorry for Italian words if you didn't understand something I can edit my question. I think that the issue is in <code>void cancellaTriangolo</code>. Maybe I saved wrong nodes and they don't save themselves.</p>
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;string.h&gt;
  #include &lt;stdlib.h&gt;
  
  /* STRUTTURE */
  typedef struct punto {
      int x;
      int y;
  } PUNTO;
  
  typedef struct triangolo {
      PUNTO v;
      int lato;
  } TRIANGOLO;
  
  typedef struct nodo {
      TRIANGOLO t;
      struct nodo *next;
  } NODO;
  
  /* STAMPA LISTA */
  int perimetro(TRIANGOLO t) {
      return t.lato * 3;
  }
  
  void stampaTriangolo(TRIANGOLO t) {
      printf(&quot;Il triangolo ha il lato uguale a: %d con un perimetro pari a %d, il vertice in alto ha coordinate (%d,%d)\n&quot;,
             t.lato, perimetro(t), t.v.x, t.v.y);
  }
  
  void stampaLista(NODO *head) {
      if (head-&gt;next == NULL) {
          printf(&quot;Lista vuota!\n&quot;);
      } else {
          while (head-&gt;next != NULL) {
              head = head-&gt;next;
              stampaTriangolo(head-&gt;t);
          }
      }
  }
  
  /* INSERIMENTO */
  TRIANGOLO creaTriangolo() {
      TRIANGOLO nuovo;
      printf(&quot;Inserisci il lato del nuovo triangolo: &quot;);
      scanf(&quot;%d&quot;, &amp;nuovo.lato);
      printf(&quot;\n&quot;);
      printf(&quot;Inserisci le coordinate del vertice con y maggiore:\n&quot;);
      printf(&quot;x: &quot;);
      scanf(&quot;%d&quot;, &amp;nuovo.v.x);
      printf(&quot;\n&quot;);
      printf(&quot;y: &quot;);
      scanf(&quot;%d&quot;, &amp;nuovo.v.y);
      printf(&quot;\n&quot;);
      
      return nuovo;
  }
  
  void inserisciPerPerimetro(NODO *head) {
  
      NODO *nuovo = malloc(sizeof(NODO));
      nuovo-&gt;t = creaTriangolo();
      nuovo-&gt;next = NULL;
  
      if (head == NULL) {
          head = nuovo;
      } else {
          if (perimetro(nuovo-&gt;t) &lt; perimetro(head-&gt;t)) {
              nuovo-&gt;next = head;
              head = nuovo;
          } else {
              while (head-&gt;next != NULL &amp;&amp; perimetro(head-&gt;next-&gt;t) &lt; perimetro(nuovo-&gt;t)) {
                  head = head-&gt;next;
              }
              nuovo-&gt;next = head -&gt; next;
              head-&gt;next = nuovo;
          }
      }
      printf(&quot;Inserimento effettuato!\n\n&quot;);
  }
  
  /* CANCELLAZIONE IN TESTA */
  void cancellaTriangolo(NODO *head) {
      NODO *primoNodo = NULL;
  
      /* lista vuota? */
      if (head == NULL) {
          primoNodo = NULL;
          printf(&quot;Lista vuota!\n\n&quot;);
      } else {
          primoNodo = head;
          head = head-&gt;next;
          free(primoNodo);
          printf(&quot;Cancellazione effettuata!\n&quot;);
      }
  }
  
  int main() {
      /* inizializza la lista */
      NODO *head = malloc(sizeof(NODO));
      head-&gt;next = NULL;
      
      int risposta = -1;          // per interazione con utente
  
      while (risposta != 0) {
          /* richiedi un'operazione all'utente */
          printf(&quot;Che operazione vuoi svolgere?\n&quot;);
          printf(&quot;1 -&gt; Inserisci un triangolo nella lista ordinata secondo il perimetro crescente\n&quot;);
          printf(&quot;2 -&gt; Cancella il triangolo in testa alla lista\n&quot;);
          printf(&quot;3 -&gt; Visualizza la lista di triangoli\n&quot;);
          printf(&quot;0 -&gt; Termina il programma\n&quot;);
          scanf(&quot;%d&quot;, &amp;risposta);
  
          /* gestisci le operazioni dell'utente */
          if (risposta == 1) {
              inserisciPerPerimetro(head);
          } else
          if (risposta == 2) {
              cancellaTriangolo(head);
          } else
          if (risposta == 3) {
              stampaLista(head);
          } else
          if (risposta == 0) {
              printf(&quot;Finito!\n\n&quot;);
          } else {
              printf(&quot;Selezione non valida!\n\n&quot;);
          }
      }
  }
  </code></pre>