Nippolo ha scritto:
Per quanto riguarda il fatto che senza la variabile "corr" il programma non funziona bene, sinceramente mi sembra strano... potresti postare il codice completo? Così ho la possibilità di testarlo.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define MAX 30
//--------------------------------------------------------------------------------------------------
//------------------------------------------------STRUTTURE DATI------------------------------------
//--------------------------------------------------------------------------------------------------
struct s_persona
{
char cognome[MAX];
char nome[MAX];
};
typedef struct s_persona t_persona;
struct s_nodo
{
t_persona persona;
struct s_nodo *next;
};
typedef struct s_nodo t_nodo;
typedef t_nodo *t_lista;
//--------------------------------------------------------------------------------------------------
//-------------------------------------------PROTOTIPI FUNZIONI------------------------------
//--------------------------------------------------------------------------------------------------
t_persona aggiungi_persona();
t_lista inserimento_lista(t_lista lista,t_persona persona);
void stampa_lista(t_lista lista);
t_nodo *cerca_persona(t_lista lista, char *cognome, char *nome);
t_lista cancella_persona(t_lista lista, char *cognome, char *nome);
t_lista cancella_lista(t_lista lista);
//--------------------------------------------------------------------------------------------------
//------------------------------------------------MAIN--------------------------------------------
//--------------------------------------------------------------------------------------------------
int main()
{
int scelta,i,n_persone;
char cognome[MAX], nome[MAX];
t_lista lista; //Creo una variabile 'lista' di tipo 't_lista'
t_persona persona; //Creo una variabile 'persona' di tipo 't_persona'
t_nodo *persona_cercata;
//**INIZIALIZZO UNA LISTA VUOTA**
lista=NULL;
do
{
system("CLS");
printf("\n**MENU ESERCIZIO LISTE**\n");
printf("1. Inserisci Persona nella Lista\n");
printf("2. Stampa Lista\n");
printf("3. Cerca Persona nella Lista\n");
printf("4. Cencella Persona dalla Lista\n");
printf("5. Cancella Lista\n");
printf("6. Esci\n\n");
printf("Scegli un'opzione del menù: ");
scanf("%d",&scelta);
switch(scelta)
{
case 1:
system("CLS");
printf("\n**INSERIMENTO PERSONA IN LISTA**\n");
printf("Quante Persone vuoi inserire in Lista? ");
scanf("%d",&n_persone);
for(i=0;i<n_persone;i++)
{
persona=aggiungi_persona();
lista=inserimento_lista(lista,persona);
}
scelta=7;
printf("\n");
system("PAUSE");
break;
case 2:
system("CLS");
printf("\n**STAMPA PERSONE IN LISTA**\n");
stampa_lista(lista);
scelta=7;
printf("\n");
system("PAUSE");
break;
case 3:
system("CLS");
printf("\n**CERCA PERSONE NELLA LISTA**\n");
printf("Inserire Cognome e Nome della persona da cercare:\n");
fflush(stdin);
printf("\nCognome: ");
gets(cognome);
printf("\nNome: ");
gets(nome);
fflush(stdin);
persona_cercata=cerca_persona(lista,cognome,nome);
if(persona_cercata!=NULL)
{
printf("\nPersona presente nella Lista\n");
scelta=7;
system("PAUSE");
break;
}
else
{
printf("\nPersona NON presente in Lista\n");
scelta=7;
system("PAUSE");
break;
}
case 4:
system("CLS");
printf("\n**CANCELLA PERSONA DALLA LISTA**\n");
printf("Inserire Cognome e Nome della persona da eliminare:\n");
fflush(stdin);
printf("Cognome: ");
gets(cognome);
printf("Nome: ");
gets(nome);
fflush(stdin);
lista=cancella_persona(lista,cognome,nome);
scelta=7;
system("PAUSE");
break;
case 5:
system("CLS");
printf("\n**ELIMINA LISTA**\n");
lista=cancella_lista(lista);
assert(lista==NULL);
printf("Lista cancellata con successo\n");
scelta=7;
system("PAUSE");
break;
default:
printf("!ERRORE! -> Scelta non disponibile nel menù.\n\n");
system("PAUSE");
break;
}
}while(scelta<1 || scelta>6);
}
//--------------------------------------------------------------------------------------------------
//----------------------------------------------DEFINIZIONE FUNZIONI------------------------
//--------------------------------------------------------------------------------------------------
//FUNZIONE AGGIUNGI PERSONA IN LISTA
t_persona aggiungi_persona()
{
system("CLS");
t_persona persona;
fflush(stdin);
printf("Inserisci Cognome: ");
gets(persona.cognome);
printf("Inserisci Nome: ");
gets(persona.nome);
fflush(stdin);
return persona;
}
//FUNZIONE INSERIMENTO ORDINATO IN LISTA
t_lista inserimento_lista(t_lista lista,t_persona persona)
{
int ctrl_1=1;
int ctrl_2=1;
t_lista prec,corr,nuovo;
prec=NULL;
corr=lista;
while(corr!= NULL && ((strcmp(persona.cognome,corr->persona.cognome)>0)||
(strcmp(persona.cognome,corr->persona.cognome)==0)&&strcmp(persona.nome,corr->persona.nome)>0))
{
prec=corr;
corr=corr->next;
}
nuovo=(t_nodo *)malloc(sizeof(t_nodo));
assert(nuovo!=NULL);
nuovo->persona=persona;
if(prec==NULL)
{
nuovo->next=lista;
lista=nuovo;
return lista;
}
else
{
prec->next=nuovo;
nuovo->next=corr;
return lista;
}
}
//FUNZIONE STAMPA LISTA
void stampa_lista(t_lista lista)
{
t_lista corr; //Variabile per scorrere la lista
corr=lista;
while(corr!=NULL)
{
printf("\n%s %s",corr->persona.cognome,corr->persona.nome);
corr=corr->next;
}
return;
}
//FUNZIONE CERCA PERSONA NELLA LISTA (Momentaneamente passando sia cognome e nome)
t_nodo *cerca_persona(t_lista lista, char *cognome, char *nome)
{
int ctrl_1=1;
int ctrl_2=1;
t_nodo *corr;
corr=lista;
//Cerco la posizione della Persona all'interno della Lista
while(corr!=NULL && (ctrl_1=strcmp(cognome,corr->persona.cognome))>0)
{
corr=corr->next;
}
if(ctrl_1==0)
{
while(corr!=NULL && (ctrl_2=strcmp(nome,corr->persona.nome))>0)
{
corr=corr->next;
}
}
if(ctrl_1==0 && ctrl_2==0)
return corr;
else
return NULL;
}
//FUNZIONE CANCELLA PERSONA DALLA LISTA
t_lista cancella_persona(t_lista lista, char *cognome, char *nome)
{
int ctrl_1=1;
int ctrl_2=1;
t_lista prec,corr;
prec=NULL;
corr=lista;
//Ricerca Posizione
while(corr!=NULL && (ctrl_1=strcmp(cognome,corr->persona.cognome))>0)
{
prec=corr;
corr=corr->next;
}
if(ctrl_1==0)
{
while(corr!=NULL &&(ctrl_2=strcmp(nome,corr->persona.nome))>0)
{
prec=corr;
corr=corr->next;
}
}
if(ctrl_1==0 && ctrl_2==0)
{
if(prec==NULL)
{
lista=corr->next;
}
else
{
prec->next=corr->next;
}
free(corr);
printf("Persona eliminata con successo\n");
return lista;
}
else
{
printf("Persona non presente in lista");
return lista;
}
}
//FUNZIONE CANCELLA LISTA
t_lista cancella_lista(t_lista lista)
{
t_lista corr,succ;
corr=lista;
while(corr!=NULL)
{
succ=corr->next;
free(corr);
corr=corr->next;
corr=succ;
}
return NULL;
}
Ora però vorrei modificare la struttura dati, come vedrai dal codice la struttura dati è composta come segue:
struct s_persona
{
char cognome[MAX];
char nome[MAX];
};
typedef struct s_persona t_persona;
struct s_nodo
{
t_persona persona;
struct s_nodo *next;
};
typedef struct s_nodo t_nodo;
typedef t_nodo *t_lista;
Invece adesso ho implementato un struttura dati nel modo seguente:
typedef struct s_persona
{
char cognome[MAX];
char nome[MAX];
struct s_persona *next;
}persona;
Ma sbaglio qualcosa mi sa, perchè nello stampare la lista accade:
1) Stampa il primo inserito all'infinito o esce dal programma
2) Stampa l'ultimo inserito all'infinito o esce dal programma
3) Stampa il primo della lista all'infinito o esce dal programma
Sbaglio sicuramente qualcosa nell'ordinare la lista e nell'utilizzo dei puntatori probabilmente. Ci smanetto un pò e in caso ti chiedo aiuto