ciao a tutti..
ho un mega problema...
il programma funziona ma quando inserisco il terzo input si ferma.
il debug mi ha dato errore di segmentazione...
vi prego aiutoooo...
ps.l'esecuzione si ferma al secondo malloc
#include <stdio.h>
#include <string.h>
// Contiene info Rispetto a un rettangolo
struct Rett
{
char key[10];
char filePtr[10];
int x;
int y;
int r;
int c;
struct Rett *nextPtr;
struct Rett *prevPtr;
};
typedef struct Rett Rett;
typedef Rett *RETTPTR;
//il file passato viene aperto in lettura e ritorna il puntatore al FILE (ptr puntatore)
void ptFile(char file[],FILE *ptr)
{
if((ptr=fopen(file,"r"))==NULL)
printf("file non può essere aperto\n");
}
//verifica ke il puntatore non sia vuoto
int isEmpty(RETTPTR x)
{
return x==NULL;
}
//effetua la ricenrca di un nodo o foglia all'interno dell'albero
int FindRiv(RETTPTR sPtr,char *key)
{
int flag=0;
RETTPTR nextPtr=sPtr;
RETTPTR curPtr=sPtr;
if(strcmp(curPtr->key,key)==0)
{
printf("Trovato\n");
return 1;
}
else
{
while(strcmp(key,curPtr->key)>=0 && flag!=1)
{
if(strcmp(key,curPtr->key)==0)
return 1;
else
{
if(curPtr->nextPtr==NULL)
flag=1;
else
curPtr=curPtr->nextPtr;
}
}
while(strcmp(key,curPtr->key)<0 && flag!=1)
{
if(strcmp(key,curPtr->key)==0)
return 1;
else
{
if(curPtr->prevPtr==NULL)
flag=1;
else
curPtr=curPtr->prevPtr;
}
}
return 0;
}
}
// Stampa la lista dei gicimenti memorizzati
void Print(RETTPTR sPtr)
{
if (isEmpty(sPtr))
printf("lista vuota \n");
else
{
while(sPtr->prevPtr!=NULL)
sPtr=sPtr->prevPtr;
while(sPtr!=NULL)
{
printf("<- %s -> ",sPtr->key);
sPtr=sPtr->nextPtr;
}
printf("\n");
}
}
//ha dei problemiii!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!
void InsertRiv(RETTPTR *sPtr,RETTPTR *newPtr)
{
int flag=0,flag1=0;
RETTPTR prevPtr=NULL,nextPtr=NULL;
RETTPTR curPtr=*sPtr;
if(isEmpty(*sPtr))
{
(*newPtr)->prevPtr=NULL;
(*newPtr)->nextPtr=NULL;
*sPtr=*newPtr;
}
else
{
while(strcmp((*newPtr)->key,curPtr->key)>0 && flag!=1)
{
if(curPtr->nextPtr==NULL)
{
curPtr->nextPtr=*newPtr;
(*newPtr)->nextPtr=NULL;
(*newPtr)->prevPtr=curPtr;
flag=1;
}
else
curPtr=curPtr->nextPtr;
}
if(curPtr->prevPtr!=NULL && curPtr->nextPtr!=NULL && flag!=1)
{
(*newPtr)->nextPtr=curPtr;
(*newPtr)->prevPtr=curPtr->prevPtr;
prevPtr=curPtr->prevPtr;
prevPtr->nextPtr=*newPtr;
curPtr->prevPtr=*newPtr;
}
while(strcmp((*newPtr)->key,curPtr->key)<0 && flag1!=1)
{
if(curPtr->prevPtr==NULL)
{
(*newPtr)->nextPtr=curPtr;
curPtr->prevPtr=*newPtr;
(*newPtr)->prevPtr=NULL;
flag1=1;
}
else
curPtr=curPtr->prevPtr;
}
if(curPtr->prevPtr!=NULL && curPtr->nextPtr!=NULL && flag1!=1)
{
(*newPtr)->nextPtr=curPtr->nextPtr;
(*newPtr)->prevPtr=curPtr;
nextPtr=curPtr->nextPtr;
curPtr->nextPtr=*newPtr;
nextPtr->prevPtr=*newPtr;
}
}
}
void rilevamento(int x,int y,int r,int c,char *file,char *key,RETTPTR *sPtr)
{
RETTPTR newPtr=NULL;
if(isEmpty(*sPtr))
{
newPtr=(RETTPTR)malloc(sizeof(RETTPTR));
if(newPtr==NULL)
printf("fine Memoria\n");
else
{
newPtr->x=x;
newPtr->y=y;
newPtr->r=r;
newPtr->c=c;
strcpy(newPtr->filePtr,file);
strcpy(newPtr->key,key);
InsertRiv(sPtr,&newPtr);
}
}
else
{
if(FindRiv(*sPtr,key)==1)
printf("gia inserito con questo codice\n");
else
{
newPtr=(RETTPTR)malloc(sizeof(RETTPTR));
if(newPtr==NULL)
printf("fine Memoria\n");
else
{
newPtr->x=x;
newPtr->y=y;
newPtr->r=r;
newPtr->c=c;
strcpy(newPtr->filePtr,file);
strcpy(newPtr->key,key);
InsertRiv(sPtr,&newPtr);
}
}
}
}
int main(void)
{
int C,x,y,l,d,r,c;
char file[10],key[10],nkey[50];
RETTPTR rivPtr=NULL;
RETTPTR sPtRett=NULL;
printf("GIACIMENTI\n- r x y r c file o :Per effetuare un rilevamento\n- s o1 o2..on : Per Creare un sistema\n- v x y : Per conoscere il valore\n- a x y l d : Per conoscere l'area del rettangolo\n- f : Per Terminare\n\n- 't': per il test\n\n\n");
while((C=getchar())!='f')
{
switch(C)
{
case 'r':
scanf("%d%d%d%d%s%s",&x,&y,&r,&c,file,key);
rilevamento(x,y,r,c,file,key,&rivPtr);
break;
case 's':
scanf("%s",nkey);
break;
case 'v':
scanf("%d%d",&x,&y);
break;
case 'a':
scanf("%d%d%d%d",&x,y,l,d);
break;
case 't':
Print(rivPtr);
break;
}
}
return 0;
}