Newsgroup: it.comp.lang.c
Titolo: Help non riesco a definire il puntatrore

Scusate se mi intrommetto.
Sto creando il segente programa.
Creo ricorsivamente una lista di nome Deposito,
Creo un altra lista di nume Inserimento
Devo mettere inserimento in tesa a deposito.
Creo un puntatore coda nella lista inserimento e poi cerco di collegare le
due liste con la procedura Ins_Deposito.
Sapete indicarmi l'errore?
Vi ringrazio molto
Saluti
Mirko
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct elemento
        {
int x,y,z,k;
struct elemento *succ;
};
typedef struct elemento tessera;
typedef tessera *LINK;
LINK Deposito,coda;
...
*/ inserimento in testa alla lista */
void Ins_Deposito(LINK deposito, LINK coda, LINK inserimento)
   {
    coda = deposito;
    deposito = inserimento;
    free(inserimento);
   }
*/ costruzione della lista /*
LINK Costruzione_2 (int k,int a,int b,int c,int d)
{
LINK testa;
int i=k;
if ( i == 0 )
  {
 /*  coda = testa; */
   return NULL;
  }
else
    {
     testa = malloc(sizeof(tessera));
     if (i == k)
      coda = testa;
     testa -> x = a;
     testa -> y = b;
     testa -> z = c;
     testa -> k = d;
     testa -> succ = Costruzione_2 ( i - 1,a,b,c,d );
     return testa;
    }
}
Inserimento = Costruzione_2(k,a,b,c,d);
Ins_Deposito(Deposito,coda, Inserimento);
}

Devo mettere inserimento in tesa a deposito.
Ciao Mirko, mi sono permesso di scriverti un programma simile, che fa proprio
questo, cioe' crea due liste e ne pone una in testa all'altra.
Spero ti sia utile.
In particolare da' un'occhiata alla procedura "inserisci_tessera()".
Se la osservi bene ti accorgi che, come parametri, non sono passati dei semplici
puntatori, ma puntatori a puntatori.
Questo perche' un puntatore quando deve essere aggiornato, come nel caso dela
creazione di una lista, nel suo valore e non nel valore puntato, deve essere
passato "per riferimento".
Ora, non esistendo questo tipo di passaggio di parametri in C, viene
semplicemente passato il suo indirizzo e tramite questo esso viene aggiornato. 
In pratica un puntatore, essendo una variabile, e' soggetta alle stesse regole
delle variabili normali.
Osserva il programma d'esempio seguente :
void func1(char *t)
{
     t = (char *) malloc(20);
}
void func2(char **t)
{
     *t = (char *) malloc(20) ;
}
main()
{
    char *p = "ciao";
    printf("valore del puntatore prima di func1() = %p\n", p);
    func1(p);
    printf("valore del puntatore dopo func1()     = %p\n", p);
    printf("valore del puntatore prima di func2() = %p\n", p);
    func2(&p);
    printf("valore del puntatore dopo func2()     = %p\n", p);
}
Nel primo caso il puntatore 'p' non cambia valore, nel secondo invece viene
modificato.
Il programma che ti ho scritto e' il seguente :
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct elemento { int x,y,z,k;
			  struct elemento *succ;
			} tessera;
typedef tessera * LINK;
LINK testa_prima_lista = NULL,
     coda_prima_lista = NULL,
     testa_seconda_lista = NULL,
     coda_seconda_lista = NULL;
void inserisci_tessera(LINK * head, LINK * tail, int x, int y, int z, int k)
{
     LINK temp;
     temp = (tessera *)malloc(sizeof(struct elemento));
     temp->x = x;
     temp->y = y;
     temp->z = z;
     temp->k = k;
     temp->succ = NULL;
     if (*head)
     {
	(*tail)->succ = temp;
	*tail = (*tail)->succ;
     }
     else
     {
	*head = temp;
	*tail = *head;
     }
} /* end of inserisci_tessera() */
void scrivi_lista(LINK p)
{
     int i = 0;
     while (p)
     {
	   printf("%d) x = %2d / y = %2d / z = %2d / k = %2d\n", ++i,
								 p->x,
								 p->y,
								 p->z,
								 p->k);
	   p = p->succ;
     }
} /* end of scrivi_lista() */
void main ( void )
{
     LINK cursore;
     int i = 0;
     inserisci_tessera(&testa_prima_lista, &coda_prima_lista, 3, -2, 11, 44);
     inserisci_tessera(&testa_prima_lista, &coda_prima_lista, 13, -3, 13, 40);
     inserisci_tessera(&testa_prima_lista, &coda_prima_lista, 23, -4, 12, 48);
     inserisci_tessera(&testa_seconda_lista, &coda_seconda_lista, 23, +2, 12,
24);
     inserisci_tessera(&testa_seconda_lista, &coda_seconda_lista, 13, 73, 99,
10);
     printf("prima lista :\n\n");
     scrivi_lista(testa_prima_lista);
     printf("\nseconda lista :\n\n");
     scrivi_lista(testa_seconda_lista);
     /* l'istruzione seguente pone la seconda lista in testa alla prima */
     coda_seconda_lista->succ = testa_prima_lista;
     printf("\nlista finale:\n\n");
     scrivi_lista(testa_seconda_lista);
}
Andrea, mica uno qualunque...
--------------------------------------------------
"Ho cambiato signature, si vede ?" 
--
Posted from 
itaca.ulysse.it
 [195.223.254.1]
via Mailgate.ORG Server - 
http://www.mailgate.org

 Sapete indicarmi l'errore?
Così a occhio mi sembra che di errori ce ne siano diversi ma posso
sbagliare. Purtroppo alla fine del sorgente che riporti c'è una parte
che sembra incompleta e quindi non sono riuscito a capire bene il tutto.
Rimanda il sorgente completo magari con un piccolo esempio di utilizzo
per poterlo almeno provare.
EMG