[C] Dubbio su puntatori

di il
4 risposte

[C] Dubbio su puntatori

Ciao,

ho due strutture che definisco così:

struct lista
{
char *nome;
struct lista *next;
};

typedef struct lista lista;

struct nodo
{
int verso;
char *nome;
lista *adiacenze;
color c;
struct rbnode *left, *right, *up;
};

typedef struct nodo nodo;

che sarebbero un nodo e la sua lista delle adiacenze.

siccome non ero sicuro della funzione per l'inserimento delle adiacenze, volevo stampare a video l'elemento nome della struttura lista.

volevo sapere, un printf("%s", n->adiacenze->nome), dove nodo *n, è sbagliata?

grazie

4 Risposte

  • Re: [C] Dubbio su puntatori

    È corretta. Perchè printf("%s", n->adiacenze->nome); dovrebbe essere sbagliata?
  • Re: [C] Dubbio su puntatori

    Quando compilo il programma non mi da errori, però quando faccio per far partire l'eseguibile mi da un errore di perdita delle informazioni e mi termina il programma!


    edit: un'altra cosa: se volessi stampare la lista delle adiacenze, che ciclo mi consigliate? pensavo a un:
    
    while(n->adiacenze->next != NULL)
      {
      printf("%s\n",n->adiacenze->nome);
      n->adiacenze->next->next;
      }
    
    però mi da quel problema per il nome e non sono sicuro dell'istruzione per scorrere la lista.
  • Re: [C] Dubbio su puntatori

    Credo che il problema non sia nella printf() ma forse quando inizializzi i puntatori, prova a postare il codice relativo alle inzializzazzioni ecc.
    Per quanto riguarda il loop, potresti provare a fare cosi:
    
    nodo *p;
    p=n;
    while (p)
    {
    printf("%s\n",p->adiacente->nome);
    p = p->adiacente->next;
    }
    
    prova in questo modo.
  • Re: [C] Dubbio su puntatori

    Il problema che ho si era già ripresentato quando volevo stampare a video il nome della struttura nodo (cioè un char *nome)

    quando facevo una printf("%s\n", n->nome) mi si bloccava il programma in esecuzione. l'avevo risolto usando una funzione che creava un buffer per la stringa che riceveva.

    però non saprei se mi funzionerebbe con tutti questi puntatori a puntatori.

    qui c'è una parte del codice: se ti serve altro dimmelo:
    struct lista
    {
      char *nome;
      struct lista *coppia;
      struct lista *next;
      struct lista *prev;
    };
    
    typedef struct lista lista;
    
    struct rbnode
    {
      int x1;
      int y1;
      int x2;
      int y2;
      char *nome;
      lista *adiacenze;
      struct rbnode *left, *right, *up;
    };
    questi sono la struttura della lista e del nodo
    lista *listadiac(rbnode *n){
    
    	lista *q = malloc(sizeof(lista));
    
    	if(!q) {
    		fprintf(stderr,"Errore nell'allocazione del nuovo elemento\n");
    		exit(-1);
    	};
    	printf("lista di %s creata!\n", n->nome);
    	return q;
    }
    qui creo la lista. nella printf non mi da nessun problema
    void coppiadiac(lista *la, lista *lb, rbnode *a, rbnode *b)
    {
      lista *ap = malloc(sizeof(lista));
    	if(!ap) {
    		fprintf(stderr,"Errore nell'allocazione del nuovo elemento\n");
    		exit(-1);
    	};
    
      lista *bp = malloc(sizeof(lista));
    	if(!bp) {
    		fprintf(stderr,"Errore nell'allocazione del nuovo elemento\n");
    		exit(-1);	
    	};
    
    	ap->nome = b->nome;
    	ap->next = la;
    
    	bp->nome = a->nome;
    	bp->next = lb;
    
      printf("%s inserito nella lista di adiacenza di %s\n",b->nome,a->nome);
      printf("%s inserito nella lista di adiacenza di %s\n",a->nome,b->nome);
    
      ap->coppia = bp->coppia;
    }
    questa è una funzione che, nel caso due nodi (fai A e B) siano adiacenti, inserisce A nella lista delle adiacenze di B, B nella lista delle adiacenze di A, e fa puntare questi due elementi fra loro (in caso di cancellazione è più comodo che non ricercare tutte le varie occorrenze nelle liste di ogni nodo dell'albero)
    void adiac(rbnode *p, rbnode *nil, rbnode *b, lista *la, lista *lb)
    {
    
      if(p != nil)
      {
     	adiac(p->left,nil, b, la, lb);
            if(adiacente(p, b) == 0)
              coppiadiac(la, lb, p, b);
       	adiac(p->right,nil, b, la, lb);
      }
    }
    
    void findadiac(rbtree *p, rbnode *b, lista *la, lista *lb)
    {
      adiac(p->root, p->nil, b, la, lb);
    }
    qui è dove c'è un errore secondo me: praticamente ho pensato che, per vedere se un nodo è adiacente o no a uno o più nodi dell'albero, servisse una visita in ordine dell'albero, e a ogni nodo mi fa il controllo con la funzione adiacente (dove b è il nodo appena inserito e p è un nodo dell'albero. mi restituisce 0 se è adiacente e 1 se non lo è). l' if controlla se b è adiacente al nodo p considerato in quel momento e se lo è fa partire coppiadiac (la funzione listadiac viene già chiamata all'inserimento del nodo). il punto è che se inserisco due nodi adiacenti intervallati fra loro da uno che non è adiacente a nessuno di loro, all'inserimento del terzo nodo mi viene risposto che non è adiacente a nessun nodo!
    void inord(rbnode *p, rbnode *nil)
    {
      if(p != nil)
      {
        inord(p->left,nil);
        printf("%s: %d %d %d %d\n", p->nome, p->x1, p->y1, p->x2, p->y2);
       /* if(p->adiacenze == NULL)
          printf("lista vuota\n");
        else
          while(p->adiacenze->next == NULL)
            printf("%s\n", p->adiacenze->nome);   */
        inord(p->right,nil);
      }
    }
    
    void inorder(rbtree *p)
    {
      inord(p->root, p->nil);
    }
    
    questo infine è la stampa dell'albero in ordine. tra i commenti c'è la parte che mi da l'errore.
Devi accedere o registrarti per scrivere nel forum
4 risposte