Newsgroup: it.comp.lang.c
Titolo: Aiuto con liste e puntatori

Devo scrivere un programma che usi una array di liste, queste liste possono
essere scorse sia dalla testa che
dalla coda, devo poter estrarre un elemento, cancellare un'intera lista ecc.
Il mio problema riguarda questo codice: premetto che le funzioni di
inserimento, cancellazione, ricerca di un elemento per numero e tipo ecc. le
ho spudoratamente copiate (e ovviamente dovrebbero essere giuste !).
Qui riporto solo la funzione di inserimento in coda Queue__Insert().
la Queue__ReadAll() e la main() invece l'ho scritta io.
Uso vc++ 6.
Ora se io inserisco due elementi, poniamo 'a' e 'b', nella lista numero 1
quando richiamo la ReadAll questa
scrive
Value:  b    value: b
Lista 2: vuota
Lista 3: vuota
......
.....
invece VORREI che scrivesse    value: a  value: b          (o invertiti)
!!!!
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
/* #include "queue.h"  */
/*------------- GENERAL
DEFINITIONS -----------------------------------------*/
#define N 8
int error = 0;   /* If Error = 1 esce dalla funzione */
int ch;
typedef struct qelemTAG
{
   struct qelemTAG *next;
   struct qelemTAG *prev;
   char *info;
} qelem;
typedef struct QueueTAG
{
   qelem *head;
   qelem *tail;
   int items;
} Queue;
/*------------- GLOBAL
VARIABLES --------------------------------------------*/
static Queue Q[N];
/*------------- INTERNAL FUNCTIONS
PROTOTYPES -------------------------------*/
/*------------- FUNCTIONS
IMPLEMENTATION ------------------------------------*/
int Queue__Constr(void)
{
   int q;
   for (q = 0; q < N; ++q) {
      /* Initialize q-th queue */
      Q[q].head = NULL;
      Q[q].items = 0;
      Q[q].tail = NULL;
   }
   return (0);
}
int Queue__Insert(char *i, int q)
{
   qelem *temp = malloc(sizeof(qelem));
   /* Sanity check */
   if (temp == NULL) printf("Not enough memory allocating queue %d.", q);
   /* Initialize queue element */
   temp->info = i;
   temp->next = NULL;
   temp->prev = NULL;
   /* Update queue data */
   ++Q[q].items;
   if (Q[q].tail)
   {
      Q[q].tail->next = temp;
      temp->prev = Q[q].tail;
      Q[q].tail = temp;
   }
   else
      Q[q].head = Q[q].tail = temp;
   return (0);
}
/*---------------------------  Stampa tutte le
liste ------------------------*/
void Queue__ReadAll()
{
 int q;
 qelem *temp;
 char *tmp_info;
 for (q = 1; q <= N; q++)
 {
  if (Q[q].items == 0) printf("Lista %d: vuota\n", q);
  else
  {
   temp = Q[q].head;
   while (temp != NULL) {
         printf("Value: ");
   tmp_info = temp->info;
   printf(" %c ", *tmp_info );
   temp = temp->next;           /* qui prende il prossimo elemento e infatti
esce dal while */
   } ;                                    /* ma allora perchè tmp_info mi dà
sempre lo stesso elemento? */
   printf("\n");                        /* sto sbagliando qui o è sbagliata
la procedura Queue_Insert() ? */
  }
 }
     printf("Invio per continuare");
     ch = getchar();
}
int main() {
int uscita = 0;
int q, inizializza;
int scelta;
int dato;
char mydato;
char *mydato2 = &mydato;
char *returnvalue;
//clrscr();              /* ho cercato questa funzione su MSDN ma non esiste
*/
inizializza = Queue__Constr();
while (uscita == 0)
{
  printf(" 1 - Immetti un nuovo dato\n");
  printf(" 2 - Cancella un dato\n");
  printf(" 3 - Leggi un dato\n");
  printf(" 8 - Leggi tutte le liste\n");
  printf(" 9 - Uscita\n\n");
  printf(" Scegli: ");
  scelta = getchar();
  error = 0; /* ad ogni ciclo rimette l'errore a 0 */
  while (( ch = getchar()) != '\n')       /* questo ciclo while lo metto
dopo ogni lettura per svuotare il */
  { ;                                /* buffer di tastiera: in questo modo
non mi dà problemi, credo, però non */
  };                             /* è molto elegante a vedersi */
  switch (scelta) {
   /* Inserisce un dato in coda */
  case 49:
  printf("Inserisci un carattere: ");
  dato = getchar();
 while (( ch = getchar()) != '\n')
  { ;
  };
  printf("Inserisci la lista (1-8): ");
  q=getchar();
 while (( ch = getchar()) != '\n')
  { ;
  };
  mydato = (char)dato;
  Queue__Insert(mydato2,q-48);   /* anche questo è brutto ma getchar() mi
restitusce un codice ANSI */
  break;
  case 56:
   printf("N di lista  -  Elementi\n\n");
  Queue__ReadAll();
  break;
  case 57:
  printf("\n");
  uscita = 1;
  break;
  }
  }
  return (0);
  }
spero che qualcuno mi aiuti perchè io sono davvero fuso e non so più che
fare.
P.S. anche usando una funzione già fornita, e copiata, Queue__Read(int i,
int q) che accetta come parametri
il numero dell'elemento e il numero della lista, questa mi restituisce
sempre lo stesso valore, diciamo
elemento 1 lista 1 = 'b'
elemento 2 lista 1 = 'b'

  Queue__Insert(mydato2,q-48);   /* anche questo è brutto ma getchar() mi
...
Il valore della variabile mydato cambia ad ogni input ma visto che
tutti gli elementi puntano a questa variabile quando stampi i
contenuto della lista ottieni semplicemente l'ultimo valore inserito
ripetuto per tutti gli elementi.
HTH
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

restitusce un codice ANSI */
Invece di usare questi codici numerici, usa
Queue__Insert(mydato2, q - '1');
Per quanto riguarda il problema, ti consiglio di controllare col debugger
del vc++ che le liste contengano effettivamente quello che ti aspetti (e'
probabile che ti sia scappato da qualche parte un errore molto banale, e
difficilmente lo scoprirai senza un debugger). Io comunque nel tuo codice
non ho trovato errori.
Saluti,
    Mardy