Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [C] liste e puntatori

  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2006
    Messaggi
    7

    [C] aiuto liste e puntatori

    Salve, devo realizzare un programma per inserimento di n stringhe, ognuna delle quali possa singolarmente far riferimento a una lista di stringhe.
    L'idea è avere una lista concatenata di stringhe, e per ogni stringa un puntatore a una lista di stringhe non precisata(per questo nn userei gli alberi).
    Io l'ho implementata così

    # include<stdio.h>
    # include<stdlib.h>
    # include<time.h>
    # include<string.h>
    /*lista dei nomi dei dipendenti*/
    struct dependents {
    char nome[40];
    struct friends *ami;
    struct dependents *next;
    };
    /*lista dei dipendenti con cui ogni dipendente è in contatto*/
    struct friends{
    char names[40];
    struct friends *next;
    };
    /* PUNTATORE ALLA LISTA CONTENTE */ struct dependents *dip;
    inserimento dei nomi avviene con una funzione inserisci che usa un ordianmento per inserimento e ritorna un puntatore a struct dependents
    add dei nomi avviene con una funzione inserisci che usa un ordianmento per inserimento e ritorna un puntatore a struct friends
    IL PROBLEMA NASCE DA QUESTA FUNZIONE
    void *contatto(char *u, char *v){
    struct dependents *t;
    t=(struct dependents *)malloc(sizeof(struct dependents));
    t->ami=(struct friends *)malloc(sizeof(struct friends));

    strcpy(t->nome, u);
    dip=inserisci(t->nome, dip);
    if(strcmp(v, u) !=0){
    dip->ami = add(v, dip->ami);
    }

    strcpy(t->nome, v);
    dip=inserisci(t->nome, dip);
    strcpy(t->nome, u);
    dip=inserisci(t->nome, dip);
    if(strcmp(v, u) !=0){
    dip->ami = add(u, dip->ami);
    }
    return;
    }
    Essa deve inserire nella lista friends corrispondente alla stringa u, la stringa v e viceversa.
    Il problema mi si pone quando devo poi stampare la lista friends relativa a una certa stringa.
    Così implementato mi stampa solo la lista della prima stringa v che scrivo, poi sovrascrive e nn ottengo più nulla. Non so come far puntare correttamente ogni stringa della lista dependents a una sua propria lista friends, in modo da ottenere per n stringhe inserite in dependents n liste friends.
    Non so se la struttura che ho scelto è corretta, perfavore aiutatemi con qualche consiglio.
    Grazie infinite.

  2. #2

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2006
    Messaggi
    7
    Ok ora mi spiego meglio. Allora devo creare una lista dependents di stringhe indefinita nella sua lunghezza.
    Poi per ogni coppia di stringhe A e B, se richiamo su di esse la funzione conosce(A,B) essa dovrebbe creare per A una lista conoscenti in cui inserisce B, e viceversa per B. Se poi richiamo conosce(A,C), nella lista conoscenti di A dovrò aggiungere C, e poi crearne una per C in cui inserire A. e così via.
    Quello che devo ottenere date due chaimate conosce(A,B) e conosce(A,C)
    nella lista dependents: A, B,C
    nella lista conoscenti di A: B, C
    nella lista conoscenti di B: A
    nella lista conoscenti di C: A

    Codice PHP:
    # include<stdio.h>
    # include<stdlib.h>
    # include<time.h>
    # include<string.h>

    /*
    STRUTTURA DATI CHE IMPLEMENTA I DIPENDENTI DELL' AZIENDA
    */
    struct dependents {
            
    char nome[40];
            
    struct conoscenti *cono
            
    struct dependents *next;       
     };
    struct conoscenti {
            
    char nome[40];       
            
    struct conoscenti *next2
     };
            
    /*
     PUNTATORI ALLA LISTA CONTENTE 
    */ 
     
    struct dependents *dip

     
     
    /*
     Funzione inserisci
     Questa funzione inserisce nella lista dei dipendenti le stringhe in ordine alfabetico.
    */
    struct dependents *inserisci(char *ustruct dependents *tmp){
      
    struct dependents *p1, *p2, *t;
      
    t=(struct dependents *)malloc(sizeof(struct dependents));
     
      
    strcpy(t->nomeu);
      
      if (
    tmp == NULL)
        return(
    t); 
           
      
    p1=tmp;
      
    p2=tmp

      while (
    p1 != NULL &&(strcmp(p1->nomet->nome) !=0)) {
           
        if (
    strcmp(p1->nomeu) > 0) {
          if (
    p1 == tmp) {
           
    t->next=p1;
          
    tmp=t;
          return(
    tmp);
          }
          else {
            while (
    p2->next != p1)
            
    p2=p2->next;
             
    t->next=p1;
            
    p2->next=t;
            return(
    tmp);
          }
        }
        
        
    p1 p1->next;
      }  
      if (
    p1 == NULL){
        while(
    p2->next != NULL)
          
    p2=p2->next;
        
    p2->next=t;
      } 
      return(
    tmp);
     }
     
    /*
    ADD  Questa funzione inserisce nella lista dei conoscenti le stringhe in ordine alfabetico.*/ 
     
    struct conoscenti *add(char *ustruct conoscenti *tmp){
      
    struct conoscenti *p1, *p2, *t;
      
    t=(struct conoscenti *)malloc(sizeof(struct conoscenti));
     
      
    strcpy(t->nomeu);
      
      if (
    tmp == NULL)
        return(
    t); 
           
      
    p1=tmp;
      
    p2=tmp

      while (
    p1 != NULL &&(strcmp(p1->nomet->nome) !=0)) {
                     
        if (
    strcmp(p1->nomeu) > 0) {
          if (
    p1 == tmp) {
           
    t->next2=p1;
          
    tmp=t;
          return(
    tmp);
          }
          else {
            while (
    p2->next2 != p1)
            
    p2=p2->next2;
             
    t->next2=p1;
            
    p2->next2=t;
            return(
    tmp);
          }
        }    
        
    p1 p1->next2;
      }  
      if (
    p1 == NULL){
        while(
    p2->next2 != NULL)
          
    p2=p2->next2;
        
    p2->next2=t;
      } 
      return(
    tmp);
     }

    /*
     Funzione conosce deve inserire nella lista dei conoscenti di u, v.
     e nella lista dei conoscenti di v, u.
     e 
     Questa 
    */

    void *conosce(char *uchar *v){
      
    struct dependents *t;
      
    t=(struct dependents *)malloc(sizeof(struct dependents)); 
      
    struct conoscenti *p;
      
    p=(struct conoscenti *)malloc(sizeof(struct conoscenti));

      
    strcpy(t->nomeu);    
      
    dip=inserisci(t->nomedip);   
      if(
    strcmp(vu) !=0){ 
      
    strcpy(p->nomev); 
      
    dip->cono add(p->nomedip->cono);  
      
    printf("%s  "t->cono->nome);
      }   
       
      
    strcpy(t->nomev);
      
    dip=inserisci(t->nomedip);
      if(
    strcmp(vu) !=0){ 
      
    strcpy(p->nomeu); 
      
    t->cono add(t->nomet->cono);  
      
    printf("%s"t->cono->nome);
      }  
      
      return;

     }
     
     
    /*
     Procedura amici
     Elenca tutti i conoscenti del dipendente nome in ordine alfabetico.
    */
     
    void amici(char *u) {
      
    struct dependents  *tmp1;
      
    struct friends *tmp2;  
      
      
    tmp1 dip;
      
      while (
    tmp1 != NULL &&(strcmp(tmp1->nomeu) !=0)) {
          
    tmp1=tmp1->next;}
            
        if (
    tmp1 == NULL) {
        
    printf(">Il dipendente %s non esiste! \n"u);
        return;
      }   
        
      if (
    tmp1->cono->nome == NULL) {
        
    printf(">Il dipendente %s non ha amici! \n"u);
        return;
      }   
        
      while (
    tmp1->cono != NULL) {        
        
    printf("%s\n"tmp1->cono->nome); 
        
    tmp1->cono->next2;    
      } 
     } 
    Il problema è che nn so come creare liste conoscenti per ogni stringa e come poterle poi richiamarle per stamparne il contenuto.
    Grazie

  4. #4
    Incomincia ad eliminare i seguenti:
    codice:
    $ gcc -Wall -ansi -pedantic main.c
    
    main.c: In function 'conosce':
    main.c:117: warning: ISO C90 forbids mixed declarations and code
    main.c:136: warning: 'return' with no value, in function returning non-void
    main.c:138: warning: control reaches end of non-void function
    main.c: In function 'amici':
    main.c:166: warning: statement with no effect
    main.c:147: warning: unused variable 'tmp2'
    Elimina la variabile globale "struct dependents *dip;" e se proprio non puoi eliminarla (ma devi avere motivi veramente validi per farlo, ed io per ora non ne vedo), dalle almeno un nome che faccia capire al volo che trattasi appunto di una variabile globale, ad esempio:
    Codice PHP:
    struct dependents *gDip;
    struct dependents *g_dip;
    struct dependents *globalDip;
    struct dependents *global_dip
    Controlla SEMPRE il valore restituito da malloc ed in generale gli errori restituiti dalle funzioni che chiami!

    La funzione main dov'è?

  5. #5
    Domanda OoP.... come mai a te il codice viene tutto bello colorato ? ^^

  6. #6
    Originariamente inviato da Ov3rLo4d
    Domanda OoP.... come mai a te il codice viene tutto bello colorato ? ^^
    Perchè ha utilizzato i tag PHP

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.