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++ - Invertire valori nella lista
Forum - C/C++ - Invertire valori nella lista

Avatar
Chiara87 (Normal User)
Newbie


Messaggi: 8
Iscritto: 04/03/2009

Segnala al moderatore
Postato alle 12:08
Domenica, 31/05/2009
Devo semplicemente scrivere una funzione che mi inverte i VALORI all'interno di una lista dinamica

Questo è il codice completo

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct nd  {
  5.         int val;
  6.         struct nd *next;
  7.         } TABR;
  8.        
  9. TABR* insertOrdina (TABR *l, int v)
  10. {
  11.       TABR *k, *t = (TABR *) malloc (sizeof(TABR));
  12.       if (t != NULL)
  13.       {
  14.             t->val = v;
  15.             t->next = NULL;
  16.             if (l == NULL)
  17.                      return t;
  18.             else
  19.             {
  20.                      if (v <= l->val)
  21.                      {
  22.                               t->next = l;
  23.                               return t;
  24.                      }
  25.                      else
  26.                      {
  27.                               k=l;
  28.                               while (l->next != NULL && v > l->next->val)
  29.                               {
  30.                                     l=l->next;
  31.                               }
  32.                               t->next = l->next;
  33.                               l->next = t;
  34.                               return k;
  35.                      }
  36.             }
  37.       }
  38.       else return l;
  39. }
  40.  
  41.  
  42. TABR *invertiLista(TABR *l)
  43. {
  44. int val;
  45.  
  46. while (l != NULL) {
  47.       TABR *t =l;
  48.       val = t->val;
  49.       t->val = t->next->val;
  50.       t->next->val = val;
  51.       t=t->next;
  52.       }
  53. return l;
  54. }
  55.  
  56.  
  57.  
  58. void stampaListaR(TABR *l)
  59. {
  60.      if (l != NULL)
  61.      {
  62.            printf("%d\n", l->val);
  63.            stampaListaR(l->next);
  64.      }
  65. }
  66.        
  67. int main () {
  68.  
  69. TABR *lint = NULL;
  70. FILE *fr;
  71. FILE *fw;
  72. int i, v;
  73.  
  74. fw = fopen ("dati.txt", "w");
  75.  
  76. printf("Scrivi 10 numeri nel file:\n\n");
  77.  
  78. if (fw != NULL)
  79. {
  80. for (i=1; i<=10; ++i)
  81. {
  82. scanf("%d", &v);
  83. fprintf(fw, "%d\n", v);
  84. }
  85. }
  86. fclose(fw);
  87.  
  88. fr = fopen ("dati.txt", "r");
  89.  
  90. if (fr != NULL)
  91. {
  92. while ((fscanf(fr, "%d", &v)) != EOF)
  93. {
  94.       lint = insertOrdina(lint, v);
  95. }
  96. }
  97. fclose(fr);
  98.  
  99. printf("\n\nI VALORI DEL FILE ORDINATI (IN MODO CRESCENTE) NELLA LISTA SONO:\n\n");
  100. stampaListaR(lint);
  101.  
  102. lint = invertiLista(lint);
  103.  
  104. printf("\n\nI VALORI INVERTITI DELLA LISTA SONO:\n\n");
  105. stampaListaR(lint);
  106.  
  107. system ("pause");
  108. return 0;  
  109. }



Il problema però risiede solamente nella funzione invertiLista infatti non mi viene stampato nulla, qualcuno saprebbe dirmi cosa sbaglio?
Grazie8-|

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 14:23
Domenica, 31/05/2009
Beh ... sicuramente ... con quale criterio hai scritto quella funzione? Come dovrebbe uscire da quel ciclo?

PM Quote
Avatar
Chiara87 (Normal User)
Newbie


Messaggi: 8
Iscritto: 04/03/2009

Segnala al moderatore
Postato alle 17:08
Domenica, 31/05/2009
Testo quotato

Postato originariamente da theprogrammer:

Beh ... sicuramente ... con quale criterio hai scritto quella funzione? Come dovrebbe uscire da quel ciclo?



si lo so che la funzione è sbagliata ma non capisco qual è l'errore. Dovrebbe uscire dal ciclo quando l'ultimo nodo punta a NULL. Nel ciclo avviene lo scambio dei valori (contenuti nei campi val) tra il primo elemento e il successivo. Al termine viene restituito il puntatore al primo elemento della lista.

è sbagliato tutto l'algoritmo?

nb. con la ricorsione mi viene più difficile da implementare

Ultima modifica effettuata da Chiara87 il 31/05/2009 alle 17:13
PM Quote