[C] aiuto liste e puntatori

di
Anonimizzato4828
il
4 risposte

[C] aiuto liste e puntatori

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


# 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 *u, struct dependents *tmp){
  struct dependents *p1, *p2, *t;
  t=(struct dependents *)malloc(sizeof(struct dependents));

  strcpy(t->nome, u);
  
  if (tmp == NULL)
    return(t);
       
  p1=tmp;
  p2=tmp;

  while (p1 != NULL &&(strcmp(p1->nome, t->nome) !=0)) {
       
    if (strcmp(p1->nome, u) > 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 *u, struct conoscenti *tmp){
  struct conoscenti *p1, *p2, *t;
  t=(struct conoscenti *)malloc(sizeof(struct conoscenti));

  strcpy(t->nome, u);
  
  if (tmp == NULL)
    return(t);
       
  p1=tmp;
  p2=tmp;

  while (p1 != NULL &&(strcmp(p1->nome, t->nome) !=0)) {
                 
    if (strcmp(p1->nome, u) > 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 *u, char *v){
  struct dependents *t;
  t=(struct dependents *)malloc(sizeof(struct dependents));
  struct conoscenti *p;
  p=(struct conoscenti *)malloc(sizeof(struct conoscenti));

  strcpy(t->nome, u);    
  dip=inserisci(t->nome, dip);   
  if(strcmp(v, u) !=0){
  strcpy(p->nome, v);
  dip->cono = add(p->nome, dip->cono);  
  printf("%s  ", t->cono->nome);
  }   
   
  strcpy(t->nome, v);
  dip=inserisci(t->nome, dip);
  if(strcmp(v, u) !=0){
  strcpy(p->nome, u);
  t->cono = add(t->nome, t->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->nome, u) !=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 Risposte

  • Re: [C] aiuto liste e puntatori

    Ciao non ho capito una cosa:
    un dipendente può avere un solo parente? e poi perchè nella struttura non hai messo anche un puntatore dependent all'elemento precedente della lista?
  • Re: [C] aiuto liste e puntatori

    Overflow ha scritto:


    ciao non ho capito una cosa:
    un dipendente può avere un solo parente? e poi perchè nella struttura non hai messo anche un puntatore dependent all'elemento precedente della lista?
    IL problema è proprio il fatto che un dipendente può avere un numero di parenti pari al massimo al numero totali di dipendenti.
    Non ho messo un puntatore all'elemento precedente, perchè inserisco i parenti in ordine alafabetico, e poi ogni volta che richiamo la funzione conosce associata a 2 parenti, es conosce(A, B), ad una nuova,se nn esiste già per una precedente chiamata di conosce su A, lista legata solo ad A viene aggiunto B, e viceversa a una lista con B, viene aggiunto A.
    E così via per ogni chiamata conosce. L'unica cosa determinata è che i nomi dei dipendenti sono univoci.
  • Re: [C] aiuto liste e puntatori

    Quindi tu hai una lista parenti di un elemento dipendente. e ogni elementi parente avrà un puntatore all'elemento parente successivo.

    d1-d2-d3-d4
    | |
    | p1-p2-p3
    |
    p1-p2-p3
    uno schema tipo questo dove d1-d2-d3-d4 sono i dipendenti legati ai parenti p1-p2-p3 che sono anch'essi dipendenti. Giusto?
    direi che la funzione add che aggiunge i conoscenti a un elemento deve essere diversa.
  • Re: [C] aiuto liste e puntatori

    La funzione per aggiungere conoscenze l'ho fatta cosi:
    
    
    struct dependent dp;
    int main()
    {
    /* inserisci gli elementi 
    dp = inserisci(..);
    ...
    */
    AddCono("nomedipendente","nomeconoscente");
    
    
    }
    void AddCono(char* nDip,char* nCon)
    {
    /* 
    funzione per inserire i conoscenti della lista dipendenti in ordine alfabetico e associa al conoscente anche come conoscente lo stesso dipendente di questa funzione.
    La funzione è icompleta perchè non gestisce i casi dove il conoscente non è un elemento della lista dipendenti.
    
    */
    
    	repeat++; //è una variabile globale con valore 0 e serve per gestire la ricorsione con le quali manovro le conoscenze
    	struct conoscenti* t, *tmp, *d;
    	struct dependent* p1;
    	int ver=0;
    
    	p1=dp;
    	tmp = new (struct conoscenti);
    	t= new (struct conoscenti);
    	t->next =0;
    	d=0;
    	
    	while (dp)
    	{
    		if (strcmp(dp->name,nDip)==0)
    		{
    			if(!dp->cono)
    			{
    				dp->cono = new (struct conoscenti);
    				strcpy(dp->cono->name ,nCon);
    				dp->cono->next =0;
    				dp=p1;
    				if (repeat==1) 
    				{
    					repeat=-1;
    					AddCono(nCon,nDip);
    					
    				}
    				return;
    			}
    			t = dp->cono;
    			while (t && strcmp(t->name,nCon)!=0)
    			{
    				if(strcmp(t->name,nCon)>0) //t->name è più grande
    				{
    					ver=1;
    					strcpy(tmp->name,nCon);
    					tmp->next =t;
    					if (!d)
    					{
    						dp->cono =tmp;
    						dp=p1;
    						if (repeat==1) 
    						{
    							repeat=-1;
    							AddCono(nCon,nDip);
    							
    						}
    						return;
    					}
    					d->next=tmp;
    				}
    				d=t;
    				t = t->next;
    			}
    			if (ver==0)
    			{
    				t = new (struct conoscenti);
    				strcpy(t->name,nCon);
    				if(d) d->next =t;
    			}
    		 break;	
    		} 
    	dp=dp->next;
    	
    	}
    	dp=p1;
    
    				if (repeat==1) 
    				{
    					repeat=-1;
    					AddCono(nCon,nDip);
    					
    				}
    }
    
    
    questo programma è un po diverso dal tuo. spero possa esseri utile.
Devi accedere o registrarti per scrivere nel forum
4 risposte