PDA

View Full Version : HELP! puntatori in c++


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.