PDA

Visualizza la versione completa : [C] liste e puntatori


let23
24-05-2008, 15:08
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.

MacApp
24-05-2008, 20:56
usa i tag code o php, perché così, non si capisce gnente
;-)

let23
25-05-2008, 09:37
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

MacApp
26-05-2008, 15:33
Incomincia ad eliminare i seguenti:


$ 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:


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'è?

Ov3rLo4d
26-05-2008, 23:04
Domanda OoP.... come mai a te il codice viene tutto bello colorato ? ^^

menphisx
27-05-2008, 10:41
Originariamente inviato da Ov3rLo4d
Domanda OoP.... come mai a te il codice viene tutto bello colorato ? ^^

Perchè ha utilizzato i tag PHP

Loading