Oppure

Loading
12/11/06 18:12
giuseppepio81
Ciao ragazzi!
qualcuno di voi saprebbe darmi una mano per questa traccia:

DATA UNA SUCCESSIONE POTENZIALMENTE INFINITA DI STRINGHE, MEMORIZZARE LE STRINGHE IN ORDINE ALFABETICO USANDO IL CONCETTO DI LISTA LINKATA.
ESSENDO LE STRINGHE DI LUNGHEZZA POTENZIALMENTE INFINITA IL NODO DELLA LISTA LINKATA DEVE CONTENERE UN PUNTATORE ALLA STRINGA DI INPUT.

Quello che non so fare è l'odinamento...

questo il codice di quello che ho prodotto sin ora (manca solo l'ordinamento):
Ps. il compilatore utilizzato è il Dev

#include <iostream.h>
#include <stdlib.h>
#include <string.h>

class lista{ //definizione della classe lista
private:
class elem_lista{ //definizione della classe elem_lista
public:
char dato[30]; //il dato e' contenuto in questo elemento //il dato e' contenuto in questo elemento
private:
elem_lista *ptr_succ; //puntatore all'elemento successivo
friend class lista;
};
public:

elem_lista *ptr_inizio; //primo elemento della lista

//inizializza la lista
lista(void){ptr_inizio=NULL;} //costruttore


//inserimento di un nuovo elemento nella lista
void ins_lista(char* nome);

//cerca un elemento nella lista
int cerca (char *nome);

//visualizza gli elementi della lista
void visual(void);

//cancella un elemento della lista
void canc (char* nome);

};


//prototipo, fornisce informazioni utili all'utente
void istruz_utente(void);
int main()
{
lista lista1; //definizione di una lista
char val_ins[30]; //input, stringa che conterra' il valore da inserire nella lista
char risp; //input, contiene la scelta dell'utente

istruz_utente();

while ((strcmp(val_ins, "stop";)!=0) && (strcmp(val_ins, "STOP";)!=0))
{
cout << "\n\ndigita un nome da inserire nella lista \n "<<"(<stop> per terminare)\t\t ---> ";
cin >> val_ins;

if ((strcmp(val_ins, "stop";)!=0)&& (strcmp(val_ins, "STOP";)!=0))


lista1.ins_lista(val_ins);
}
lista1.visual();

cout<< "inserisci il nome da cercare nella lista --> ";
cin >> val_ins;
cout << "la ricerca produrra' : \n\n";
cout << "\t 1 se il nome cercato e' presente nella lista \n";
cout << "\t 0 se il nome cercato non e' presente nella lista\n\n";
cout << "\n risultato della ricerca "<< lista1.cerca(val_ins) <<'\n';

cout << "\n inserisci il nome che vuoi eleminare dalla lista --> ";
cin >> val_ins;
lista1.canc(val_ins);

lista1.visual();
system("PAUSE";);
return 0;
}

void istruz_utente(void)
{
cout<< "questo programma crea una lista di nomi\n ";
cout<< "effettuare una ricerca all'interno della lista per cercare il nome desiderato\n";
cout<< "puo' eliminare un elemento dalla lista.";
}

void lista::ins_lista(char* nome)
{
elem_lista *ptr_nuovo; //puntatore all'elemento successivo della lista

ptr_nuovo= new elem_lista;

strcpy(ptr_nuovo->dato, nome);
//inserimento del dato all'inizio della lista
ptr_nuovo->ptr_succ = ptr_inizio;
ptr_inizio = ptr_nuovo;
}
/*****************************************
* parametri *
* nome - nome da cercare nella lista *
* *
* restituisce *
* 1 se il nome viene trovato *
* 0 se il nome non viene trovato *
*****************************************/
int lista::cerca(char *nome)
{
// struttura in cui stiamo cercando il dato
elem_lista *ptr_corrente;

ptr_corrente = ptr_inizio;
while(ptr_corrente !=NULL)
{
if (strcmp(ptr_corrente->dato, nome)==0)
break;
ptr_corrente= ptr_corrente->ptr_succ;
}
return(ptr_corrente != NULL);
}
// funzione che permette di visualizzare la lista

void lista::visual(void)
{
elem_lista *ptr_attuale;
ptr_attuale = ptr_inizio;

while (ptr_attuale != NULL)
{
cout<< "il nome nella lista e' " <<ptr_attuale->dato <<"\n";
ptr_attuale = ptr_attuale->ptr_succ;
}
}
//funzione che permette di cancellare un elemento dalla lista

void lista::canc (char* nome)
{
elem_lista *ptr_prec; //puntatore all'elemento precedente della lista
elem_lista *ptr_canc;
elem_lista *ptr_dopo;

ptr_prec = ptr_inizio;
ptr_canc = ptr_prec->ptr_succ;
ptr_dopo = ptr_canc->ptr_succ;

while(ptr_dopo != NULL)
{ //se il dato da cancellare e' il primo della lista
if (strcmp(ptr_prec->dato, nome)==0)
{
ptr_inizio = ptr_prec->ptr_succ;
break;
}
//se il dato da cancellare e' uno qualunque (non uno degli estremi!!!)
if (strcmp(ptr_canc->dato, nome)==0)
{
ptr_prec->ptr_succ = ptr_canc->ptr_succ;
break;
}
//dobbiamo avanzare
ptr_prec = ptr_canc;
ptr_canc = ptr_dopo;
ptr_dopo = ptr_dopo->ptr_succ ;

//se il dato da cancellare e' l'ultimo della lista
if (strcmp(ptr_dopo->dato, nome)==0)
{
ptr_canc->ptr_succ = ptr_dopo->ptr_succ;
break;
}
}
}
aaa
14/11/06 8:53
posta10100
potresti provare ad ordinare gli elementi utilizzando il risultato di strcmp... a seconda che il risultato sia > o < di 0 sai se la stringa va prima o dopo...
aaa
15/11/06 16:19
nikipe_silver
cerca qualcosa riguardante il bubble sort
aaa