Lista di record(key,value)

di il
2 risposte

Lista di record(key,value)

Ho un errore di segmentazione ma non capisco quale sia il problema Il programma dovrebbe creare una lista di record con inserimento in testa.
l'errore si trova nella funzione "insertElement" (o nelle sue sottofunzioni). Ecco il codice:

// lista ordinata con value = struttura record, numero elementi passato da linea comando, ultimo elemento ha chiave -1

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

typedef struct record{
	int key;
	int value;
} rec;

typedef struct node{
	rec *record;
	struct node *next;
} tNode;

int converti(char *num);
rec *riempiRec(int n);
tNode *indexList(void);
void InsertElem(tNode *list,rec *inRec,int n);
tNode *allocNode(void);
void stampa(tNode *list);
void stampElem(rec *inRec,int n);
rec *allocRec(void);
void insertOrder(tNode *list,rec *nRecord);

int main(int argc,char *argv[]){
	if (argc!=2){
		fprintf(stderr,"errore passaggio parametri %s\n",argv[0]);
		exit(EXIT_FAILURE);
	}
	int n;
	tNode *list;
	n=converti(argv[1]);
	rec *inRec;
	inRec=riempiRec(n);
	stampElem(inRec,n);
	list=indexList();
	//fino a qui tutto bene
	
	InsertElem(list,inRec,n);
	stampa(list);
	return (EXIT_SUCCESS);
}

int converti(char *num){
	int n;
	char *p;
	errno=0;
	n=strtol(num,&p,10);
	if ( (errno != 0) || (*p!='\0') ){
		fprintf(stderr,"errore strtol %s\n",num);
		exit(EXIT_FAILURE);
	}
	return n;
}

rec *riempiRec(int n){
	rec *p,*temp;
	int i;
	p=allocRec();
	temp=p;
	for (i=0;i<n-1;i++){
		temp->key=i+1;
		temp->value=i;
		++temp;
	}
	temp->key=-1;
	temp->value=i;
	return p;
}

tNode *indexList(void){
	tNode *list;
	list=malloc(sizeof(tNode));
	if (list==NULL){
		perror("malloc()");
		exit(EXIT_FAILURE);
	}
	list->next=NULL;
	return list;
}

void InsertElem(tNode *list,rec *inRec,int n){
	stampElem(inRec,n);
	rec *nRecord;
	while (1){
		printf("inRec %d -> %d \n",(inRec)->key,(inRec)->value );
		if ( (inRec)->key == -1){
			return;
		}
		nRecord=allocRec();
		nRecord->key=(inRec)->key;
		nRecord->value=(inRec)->value;
		insertOrder(list,nRecord);
		++inRec;
		
		
	}
}

void insertOrder(tNode *list,rec *nRecord){
	tNode *temp,*new;
	new=allocNode();
	temp=list;
	new->next=temp->next;
	temp->next=new;
	new->record=nRecord;
	
}

tNode *allocNode(void){
	tNode *new;
	new=malloc(sizeof(tNode));
	if (new==NULL){
		perror("malloc()");
		exit(EXIT_FAILURE);
	}
	return new;
}

void stampa(tNode *list){
	printf("\n");
	tNode *temp=list;
	while (temp->next!=NULL){
		fprintf(stdout,"key: %d,value: %d \n",temp->next->record->key, temp->next->record->value);
		temp=temp->next;
	}
}

void stampElem(rec *inRec,int n){
	int i;
	for (i=0;i<n;i++){
		printf("key: %d -> %d \n",inRec->key,inRec->value);
		++inRec;
	}
	printf("\n");
}

rec *allocRec(void){
	rec *p=malloc(sizeof(rec));
	if (p==NULL){
		perror("malloc()");
		exit(EXIT_FAILURE);
	}
	return p;
}


voi riuscite a vedere l'errore?

2 Risposte

Devi accedere o registrarti per scrivere nel forum
2 risposte