PDA

Visualizza la versione completa : [C] Funzione di una lista con sottolista


Pennacchio
20-02-2015, 09:22
Salve,
devo programmare una funzione avente una lista principale collegata con puntatori che in ingresso riceve valori in ordine crescente secondo il campo code, stampare la lista principale fino ad avere code==class (se a fine scansione la condizione non soddisfatta restituisce FALSE).
Se la condizione soddisfatta devo inserire un valore target in coda alla sottolista che soddisfa la condizione (restituendo TRUE).

Mi sono applicato e tutto procede bene finch non inserisco il valore class per confrontarlo con code, in quel momento la funzione si ferma.
Mi scuso se effettivamente un po' disordinato.
Sulla riga "case 4" mi viene segnalato un warning "argomento di sub_visit passa da un tipo di puntatore incompatibile" che non riesco a correggere.
Ringrazio per l'aiuto (ne ho tanto bisogno).



#include <stdio.h>
#include <stdlib.h>


typedef unsigned short int boolean;
#define FALSE 0
#define TRUE 1


struct list{
int code;
struct sublist * sub_ptr;
struct list * next_ptr;
};


struct sublist{
float value;
struct sublist * next_ptr;
};


void init(struct list **ptr);
boolean ord_insert(struct list **ptr, int code);
void visit(struct list *ptr);
boolean pre_insert(struct list **ptr, int code);
boolean search(struct list **ptr, int class, float target);
boolean suf_insert_sub(struct sublist **ptr, float value);
boolean pre_insert_sub(struct sublist **ptr, float value);
void sub_init(struct list **ptr);
void sub_visit(struct sublist *ptr);




int main(){


int digit, code, class;
float target;
struct list *ptr=NULL;
init (&ptr);
digit=0;


do{
printf("\n 1)Inserisci valore nella lista principale\n 2)Scandisci lista principale");
printf("\n 3)Inserisci elemento nella sottolista di un valore gia' esistente ");
printf("\n 4)Scandisci sottolista \n\n");
scanf("%d", &digit);
switch (digit){
case 1:printf("\n Digita il valore: ");
scanf("%d",&code);
ord_insert(&ptr, code);
printf("\n Valore -->%d inserito \n", code);
break;
case 2:visit(ptr);
break;
case 3:printf("\n Scegli un valore dalla lista principale: ");
scanf("%d", &class);
search(&ptr, class, target);
printf("\n Inserire elemento destinato alla sottolista: ");
scanf("%f", &target);
break;
case 4:sub_visit(ptr);
break;
default:printf("\n Comando digitato non valido");
}
}
while(digit!=0);
system("PAUSE");
return 0;
} //chiude main


void init(struct list **ptr){
*ptr=NULL;
}


boolean pre_insert(struct list **ptr, int code){
struct list *tmp_ptr;
tmp_ptr=*ptr;
(*ptr)=(struct list*)malloc(sizeof(struct list));
(*ptr)->code=code;
(*ptr)->next_ptr=tmp_ptr;
return TRUE;
}


boolean ord_insert(struct list **ptr, int code){
while(((*ptr)!=NULL) && (*ptr)->code<code)
ptr=&((*ptr)->next_ptr);
return pre_insert(ptr,code);
}


void visit(struct list *ptr){
if(ptr!=NULL){
printf("\n");
while(ptr!=NULL){
printf("-->%d", ptr->code);
ptr=ptr->next_ptr;
}
printf("\n");
}
else{
printf("\n La lista e' vuota\n");
}
}


boolean search(struct list **ptr, int class, float target){
if(ptr!=NULL){
boolean found = FALSE;
while(*ptr!=NULL && found==FALSE){
if((*ptr)->code==class){
suf_insert_sub((&(*ptr)->sub_ptr), target);
}
else{
ptr=&((*ptr)->next_ptr);
}
sub_visit((*ptr)->sub_ptr);
}
}
return FALSE;
}


void sub_init(struct list **ptr){
(*ptr)->sub_ptr=NULL;
}


boolean suf_insert_sub(struct sublist **ptr, float target){
while(*ptr!=NULL){
ptr=&((*ptr)->next_ptr);
}
return pre_insert_sub(ptr, target);
}


boolean pre_insert_sub(struct sublist **ptr, float target){
struct sublist *tmp;
tmp=*ptr;
(*ptr)=(struct sublist*)malloc(sizeof(struct sublist));
(*ptr)->value=target;
(*ptr)->next_ptr=tmp;
return TRUE;
}


void sub_visit(struct sublist *ptr){
if(ptr!=NULL){
while(ptr!=NULL){
printf("Valore inserito: %f",(ptr)->value);
ptr=ptr->next_ptr;
}
}
else{
printf("La lista vuota");
}
}

oregon
20-02-2015, 19:05
Sulla riga "case 4" mi viene segnalato un warning "argomento di sub_visit passa da un tipo di puntatore incompatibile" che non riesco a correggere.

La sub_visit, come hai scritto in

void sub_visit(struct sublist *ptr);

prevede un puntatore ad una "struct sublist" ma tu passi ptr che un puntatore ad una "struct list" e questo il motivo del warning.

Pennacchio
20-02-2015, 22:14
Hai ragione, grazie!
Provvedo alla correzione :)

Loading