|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Sep 2015
Messaggi: 9
|
[ C ] Problema liste
Salve a tutti!
In questi giorni sto affrontando lo studio delle liste nel linguaggio C e un piccolo problema è affiorato durante lo svolgimento di qualche esercizio. Sostanzialmente, il mio problema lo riscontro nel main: non riesco a inizializzare n stringhe in una lista. Qualcuno può aiutarmi a capire come risolvere questo problema? Io proprio non riesco a venire a capo.
|
|
|
|
|
|
#2 | |
|
Junior Member
Iscritto dal: Sep 2015
Messaggi: 9
|
Quote:
Si vuole una funzione che elimina tutti i nodi di una lista contenenti una data chiave. Quella di input è una lista concatenata. La chiave contenuta in ogni nodo è una stringa, quindi il prototipo dei nodi sarà: struct nodo { char *chiave; struct nodo *prec; struct nodo *succ; }; Questo è il prototipo della funzione: struct nodo *DividiLista (nodo *a, char *k); dove a è la lista da cui bisogna eliminare tutti i nodi che contengono, nel campo chiave, una stringa uguale a k. Per quanto riguarda il codice, l'ho fatto e non dovrebbero esserci errori sintattici, ma non riuscendo a costruire il main ( per il problema sopra esposto ) non capisco se è funzionante o meno. Se comunque potrebbe servire lo inserisco. |
|
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Sep 2015
Messaggi: 9
|
Il main non l'ho fatto ( non riesco a impostarlo ). Per codice intendevo le funzioni che mi servono per risolvere il problema. Comunque, questo è quello che ho scritto:
#include <stdio.h> #include <stdlib.h> #include <string.h> struct nodo { char *chiave; struct nodo *prec; struct nodo *succ; }; typedef struct nodo nodo; nodo *DividiLista ( nodo *a, char *k ) { nodo *p; int f; p = a; f = strcmp ( p->chiave, k ); while ( p != NULL ) { if (( f < 0 ) || ( f > 0 )){ p = p->succ; } if ( (f == 0) && (p->succ = NULL) ) { p = p->prec; free ( p->succ->chiave ); free ( p->succ ); } if (( f == 0 )&& ( a = p )) { a = a->succ; p = p->succ; free (p->prec->chiave); free ( p->prec ); } if (( f == 0 ) && ( p != a)) { free ( p->chiave ); free ( p ); p->prec->succ = p->succ; p->succ->prec = p->prec; p = p->succ; } p = p->succ; } return a; } |
|
|
|
|
|
#4 |
|
Junior Member
Iscritto dal: Sep 2015
Messaggi: 9
|
Codice:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
struct nodo
{
char *chiave;
struct nodo *prec, *succ;
};
typedef struct nodo nodo;
nodo *DividiLista(nodo*, char*);
nodo *CancellaZero(nodo*);
nodo *CancellaUno(nodo*);
nodo *DividiLista( nodo *a, char *k )
{
nodo *p;
while ( a != NULL && strcmp(a->chiave, k) == 0 ){
a = CancellaZero( a );
}
if ( a == NULL )
{
return NULL;
}
p = a;
while( p->succ != NULL )
{
if ( strcmp(p->succ->chiave, k) == 0 ){
p = CancellaUno( p );
} else {
p = p->succ;
}
}
return a;
}
nodo *CancellaZero( nodo *a )
{
nodo *p;
if ( a == NULL )
return NULL;
p = a->succ;
if( p != NULL)
p->prec = NULL;
free(a->chiave);
free(a);
return p;
}
nodo *CancellaUno( nodo *a)
{
nodo *p;
if( a->succ == NULL )
return a;
p = a->succ;
a->succ = p->succ;
if(p->succ != NULL)
p->succ->prec = a;
free(p->chiave);
free(p);
return a;
}
Ultima modifica di .Zero : 05-09-2015 alle 11:25. |
|
|
|
|
|
#5 |
|
Junior Member
Iscritto dal: Sep 2015
Messaggi: 9
|
|
|
|
|
|
|
#6 |
|
Junior Member
Iscritto dal: Sep 2015
Messaggi: 9
|
Mmh... ho capito.
E ora come faccio a costruire la funzione main per far partire il programma? |
|
|
|
|
|
#7 |
|
Junior Member
Iscritto dal: Sep 2015
Messaggi: 9
|
Tenendo presente quello che hai scritto ho progettato il main nel modo seguente:
Codice:
int main () {
char *s[5] = {"cane", "gatto", "camaleonte", "leone", "scimmia"};
char *c = {"gatto"};
char *l = {"leone"};
nodo *a = NULL;
int i;
for ( i = 0; i<=5; i++ ) {
a = InserisciLista ( a, s[i], 0 );
}
a = DividiLista( a, c, l );
MostraLista(a);
}
Codice:
nodo *InserisciLista( nodo *a, char *chiave, int i ){
nodo *p, *q;
if( i == 0){
p = malloc(sizeof(nodo));
p->chiave = chiave;
p->prec = NULL;
p->succ = a;
if( a != NULL)
a->prec = p;
a = p;
} else {
p = malloc(sizeof(nodo));
p->chiave = chiave;
p->prec = a;
p->prec->succ = p;
a = p;
}
return a;
}
|
|
|
|
|
|
#8 | |
|
Junior Member
Iscritto dal: Sep 2015
Messaggi: 9
|
Quote:
Perdona l'attesa ma sono stato senza internet in questi giorni. "i" mi permette di far partire la funzione, fondamentalmente, perché nel main lo imposto come 0 ( zero ) e, quindi, mi fa partire la funzione. Un controllo inutile, pensi? |
|
|
|
|
|
|
#9 | |
|
Junior Member
Iscritto dal: Sep 2015
Messaggi: 9
|
Quote:
Ho risolto il problema, comunque. Ho utilizzato la funzione "InserisciZero" e ho inserito manualmente le varie parole, senza utilizzare altre funzioni: Codice:
nodo *InserisciZero(nodo *a, char *k){
nodo *p;
p = malloc(sizeof(nodo));
p->chiave = k;
if( a == NULL){
p->succ = NULL;
p->prec = NULL;
return p;
}
p->succ = a;
p->prec = NULL;
a->prec = p;
return p;
}
Codice:
main(){
nodo *a= NULL;
a = InserisciZero(a, "bue");
a = InserisciZero(a, "capra");
a = InserisciZero(a, "serpente");
a = InserisciZero(a, "maiale");
a = InserisciZero(a, "topo");
char *k = "capra";
char *k1 = "maiale";
printf("Lista originale:\n");
MostraLista(a);
a = EstraiSegmento(a, k, k1);
printf("Lista modificata:\n");
MostraLista(a);
}
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:03.




















