fedkara
17-05-2013, 06:04
Salve a tutti i sto provando a realizzare l'algoritmo di ricerca calcolata utilizzando le linked-list
il programma prende dei dati strutturati e li ordina in un tabella hash ogni elemento dell'hash e un puntatore a la testa di una linked-list. il mio è un problema di segmentetion fault ho capito + o - deve sta l'errore ma non riesco a risolverlo : nella funzione hash appena provo a lavorare su ptr[] va in segmentetion fault qualcuno che ha un pò di dimistichezza con i puntatori può aiutarmi please !!!
#include <iostream>
using namespace std;
struct archivio
{
unsigned int key;
char nome[20];
struct archivio *next;
};
typedef struct archivio *archivioPtr;
void inizializza(archivioPtr *,int);
int hash(archivioPtr *,int ,archivioPtr );
archivioPtr hash_search(archivioPtr *,int ,unsigned int);
int main(int argc, char **argv)
{
archivioPtr a,*b=NULL,trovato;
int n,chiave;
cout << "Quanti nomi vuoi inserire nell'archivio ? : ";
cin >>n;
a = new archivio [n];
for(int i=0; i<n; i++)
{
cout << "Inserire chiave : ";
cin >>a[i].key;
cout << "Inserire nome : ";
cin >> a[i].nome;
a[i].next=NULL;
}
inizializza(b,n);
for(int i=0; i<n; i++)
hash(b,n,&a[i]);
cout << "Inserisci la chiave da cercare : ";
cin >> chiave;
if((trovato=hash_search(b,n,chiave))!=NULL)
cout << "La chiave "<< chiave << "e' stata trovata nell'archivio il nome e' "<< trovato->nome<<endl;
else
cout << "La chiave non e' stata trovata."<<endl;
cout <<"Premere invio per terminare il programma _ _ _ ";
cin.get();
return 0;
}
void inizializza(archivioPtr *ptr,int dim)
{
ptr = new archivioPtr [dim];
for (int i=0; i<dim; i++)
{
ptr[i] = NULL;
}
}
int hash(archivioPtr *ptr,int dim,archivioPtr info)
{
int k;
archivioPtr current,previous;
k= info->key % dim;
if(ptr[k] == NULL)
{
ptr[k]=info;
}
else
{
current=ptr[k]->next;
while(current!=NULL)
{
previous=current;
current=current->next;
}
}
previous->next=info;
return 0;
}
archivioPtr hash_search(archivioPtr *ptr,int dim,unsigned int key)
{
int pos;
archivioPtr current;
pos=key%dim;
if(ptr[pos]->key==key)
return ptr[pos];
else
{
current=ptr[pos]->next;
while(current!=NULL && current->key!=key)
current=current->next;
}
return current;
}
Grazie in anticipo per le risposte mi rendo conto che è un problema difficile ma propio nn so come risolvere visto che non mi da errori di compilazione.
il programma prende dei dati strutturati e li ordina in un tabella hash ogni elemento dell'hash e un puntatore a la testa di una linked-list. il mio è un problema di segmentetion fault ho capito + o - deve sta l'errore ma non riesco a risolverlo : nella funzione hash appena provo a lavorare su ptr[] va in segmentetion fault qualcuno che ha un pò di dimistichezza con i puntatori può aiutarmi please !!!
#include <iostream>
using namespace std;
struct archivio
{
unsigned int key;
char nome[20];
struct archivio *next;
};
typedef struct archivio *archivioPtr;
void inizializza(archivioPtr *,int);
int hash(archivioPtr *,int ,archivioPtr );
archivioPtr hash_search(archivioPtr *,int ,unsigned int);
int main(int argc, char **argv)
{
archivioPtr a,*b=NULL,trovato;
int n,chiave;
cout << "Quanti nomi vuoi inserire nell'archivio ? : ";
cin >>n;
a = new archivio [n];
for(int i=0; i<n; i++)
{
cout << "Inserire chiave : ";
cin >>a[i].key;
cout << "Inserire nome : ";
cin >> a[i].nome;
a[i].next=NULL;
}
inizializza(b,n);
for(int i=0; i<n; i++)
hash(b,n,&a[i]);
cout << "Inserisci la chiave da cercare : ";
cin >> chiave;
if((trovato=hash_search(b,n,chiave))!=NULL)
cout << "La chiave "<< chiave << "e' stata trovata nell'archivio il nome e' "<< trovato->nome<<endl;
else
cout << "La chiave non e' stata trovata."<<endl;
cout <<"Premere invio per terminare il programma _ _ _ ";
cin.get();
return 0;
}
void inizializza(archivioPtr *ptr,int dim)
{
ptr = new archivioPtr [dim];
for (int i=0; i<dim; i++)
{
ptr[i] = NULL;
}
}
int hash(archivioPtr *ptr,int dim,archivioPtr info)
{
int k;
archivioPtr current,previous;
k= info->key % dim;
if(ptr[k] == NULL)
{
ptr[k]=info;
}
else
{
current=ptr[k]->next;
while(current!=NULL)
{
previous=current;
current=current->next;
}
}
previous->next=info;
return 0;
}
archivioPtr hash_search(archivioPtr *ptr,int dim,unsigned int key)
{
int pos;
archivioPtr current;
pos=key%dim;
if(ptr[pos]->key==key)
return ptr[pos];
else
{
current=ptr[pos]->next;
while(current!=NULL && current->key!=key)
current=current->next;
}
return current;
}
Grazie in anticipo per le risposte mi rendo conto che è un problema difficile ma propio nn so come risolvere visto che non mi da errori di compilazione.