Ciao sto provando ad implementare la rubrica in C soltanto che dopo aver alcuni contatti mi occupa tutta la ram in tutte le operazioni in particolare nell'inserimento
Ecco il codice
Main
#include <stdio.h>
#include <stdlib.h>
#include "rubrica.h"
void instructions(void);
int main(int argc, char** argv)
{
RubricaPtr startPtr = NULL;//Da cancellare
char nome[30] = "\0";//Stringa del nome
char cognome[30] = "\0";//Stringa del cognome
char birthday[30] = "\0";//Stringa del compleanno
unsigned int choice;//Scelta dell'utente
instructions();//Lista di possibili scelte
printf("? ");
scanf("%ud",&choice);
while (choice != 5)
{
switch (choice)
{
case 1://Inserimento
printf("Enter name: ");
scanf("%19s",nome);
printf("Enter surname: ");
scanf("%19s",cognome);
printf("Enter birthday: ");
scanf("%19s",birthday);
insert(nome,cognome,birthday);//Inserisce Contatto nella Rubrica
break;
case 2://Cancellazione
printf("Enter name to delete: ");
scanf("%19s",nome);
printf("Enter surname to delete: ");
scanf("%19s",cognome);
printf("Enter birthday to delete: ");
scanf("%19s",birthday);
deleteList(&startPtr,nome,cognome,birthday);//Elimina Contatto dalla Rubrica
break;
case 3://Stampa
print();//Stampa Rubrica
break;
default:
printf("Invalid Choice\n");
break;
}
instructions();
printf("? ");
scanf("%ud",&choice);
}
return (EXIT_SUCCESS);
}
void instructions(void)
{
printf("1 to insert into rubrica\n");
printf("2 to delete from rubrica\n");
printf("3 to print rubrica\n");
printf("4 to modify rubrica\n");
printf("5 to exit\n");
}
Rubrica
#include <stdio.h>
#include <stdlib.h>
#include "rubrica.h"
#include <string.h>
#include "confronto.h"
#include "salvataggioFile.h"
void insert(char nome[],char cognome[],char compleanno[])
{
RubricaPtr newPtr;//Puntatore al contatto da inserire
RubricaPtr previousPtr = NULL;//Puntatore al contatto precedente
RubricaPtr currentPtr = NULL;//Puntatore al contatto corrente
RubricaPtr startPtr = NULL;//Testa della lista
RubricaPtr tempPtr;//Nodo temporaneo
size_t x = 0;
startPtr = letturaFile();//Lettura della lista
newPtr = malloc(sizeof(Rubrica));
if (newPtr != NULL)//Memoria presente
{
for(x = 0;nome[x] != '\0';x++)
{
newPtr->name[x] = nome[x];//Insert character in the structure
}
newPtr->name[x] = '\0';
for (x = 0;cognome[x] != '\0';x++)
{
newPtr->surname[x] = cognome[x];//Inserisce il cognome nella struttura
}
newPtr->surname[x] = '\0';
for (x = 0;compleanno[x] != '\0';x++)
{
newPtr->birthday[x] = compleanno[x];//Inserisce il compleanno nella struttura
}
newPtr->birthday[x] = '\0';
newPtr->nextPtr = NULL;
previousPtr = NULL;//Nodo precedente
currentPtr = startPtr;//Contatto corrente è il primo
while(currentPtr != NULL)//Finche il contatto non punta a nulla
{
previousPtr = currentPtr;//Contatto precedente
currentPtr = currentPtr->nextPtr;//punta al nuovo contatto
}
if (previousPtr == NULL)//Primo Contatto
{
newPtr->nextPtr = startPtr;
startPtr = newPtr;
}
else
{
previousPtr->nextPtr = newPtr;//Punta al nuovo contatto
newPtr->nextPtr = currentPtr;//Punta al contatto successivo
}
currentPtr = startPtr;
while(currentPtr != NULL)
{
writeFile(currentPtr);
tempPtr = currentPtr;//Nodo temporaneo
currentPtr = currentPtr->nextPtr;//Avanzamento di nodo
free(tempPtr);//Libera memoria
}
}
else//Memoria non presente
{
printf("No memory available");
}
printf("\n");
}
void deleteList(RubricaPtr *sPtr,char nome[],char cognome[],char birthday[])
{
//Delete contatto from the rubrica
RubricaPtr tempPtr;//Puntatore temporaneo al nodo da cancellare
RubricaPtr previousPtr = NULL;
RubricaPtr currentPtr = *sPtr;
int isFound = 0;//Variable that rappresent if the element was found or not
while(currentPtr != NULL && isFound)
{
isFound = confrontoContatto(nome,cognome,birthday,currentPtr);//Controllo se è l'elemento corretto
previousPtr = currentPtr;//Va avanti di elemento
currentPtr = currentPtr->nextPtr;//Puntatore al nuovo elemento
}
if(previousPtr == NULL)
{
//Caso in cui l'elemento da eliminare è in testa alla Rubrica
tempPtr = *sPtr;//Copia temporanea dell'elemento
*sPtr = tempPtr->nextPtr;//Ora la lista punta al secondo elemento
free(tempPtr);//Libera la memoria dell'elemento cancellato
}
else
{
if(isFound)
{
//caso in cui viene trovato il valore
tempPtr = currentPtr;//Copia temporanea dei valori
previousPtr->nextPtr = currentPtr->nextPtr;//Punta all'elemento successivo
free(currentPtr);//Libera la memoria
}
else
{
printf("Element not found\n");
}
}
}
int isEmpty(RubricaPtr sPtr)
{
return sPtr == NULL;
}
void print(void)
{
RubricaPtr startPtr = NULL;//Nodo iniziale
startPtr = letturaFile();
if (isEmpty(startPtr))
{
printf("List empty\n");
}
else
{
printf("List is:\n");
printf("%-20s\t%-20s\t%-20s\n","Name","Surname","Birthday");
while(startPtr != NULL)
{
printf("%-19s\t%-19s\t %-19s\n",startPtr->name,startPtr->surname,startPtr->birthday);
startPtr = startPtr->nextPtr;
}
}
printf("\n");
}
Salvataggio file
#include <stdio.h>
#include <stdlib.h>
#include "rubrica.h"
RubricaPtr letturaFile(void)
{
RubricaPtr startPtr = NULL;//Testa della lista
RubricaPtr currentPtr = NULL;//Nodo della lista corrente
RubricaPtr previousPtr = NULL;//Nodo precedente
FILE *filePtr;//Puntatore a File
filePtr = fopen("rubrica.txt","r");//Apertura del file
if(filePtr == NULL)
{
//FIle non aperto
printf("File could not be opened\n");
}
else
{
//File aperto
if(feof(filePtr))
{
//File vuoto
printf("File is empty\n");
startPtr = NULL;//Puntatore a lista vuota
}
else
{
startPtr = malloc(sizeof(Rubrica));//Allocazione di Memoria
//Lettura elemento iniziale
fscanf(filePtr,"%-19s%-19s%-19s\n",startPtr->name,startPtr->surname,startPtr->birthday);
startPtr->nextPtr = NULL;//Assegnamento nodo successivo
currentPtr = startPtr;//Assegnamento elemento attuale
//Lettura elementi successivi
while(!feof(filePtr))
{
previousPtr = currentPtr;//Avanzamento di nodo
currentPtr = malloc(sizeof(Rubrica));//Allocazione memoria nodo successivo
previousPtr->nextPtr = currentPtr;//Puntatore al nodo successivo dell'elemento precedente
//Lettura elemento successivo
fscanf(filePtr,"%-19s%-19s%-19s\n",currentPtr->name,currentPtr->surname,currentPtr->birthday);
currentPtr->nextPtr = NULL;//Assegnamento nodo successivo
}
}
}
fclose(filePtr);//Chiusura file
return startPtr;
}
void writeFile(RubricaPtr currentPtr)
{
FILE *filePtr;
filePtr = fopen("rubrica.txt","w");
if (filePtr == NULL)
{
//File non aperto
printf("File could not be opened\n");
}
else
{
//File aperto
if(!feof(filePtr))
{
fprintf(filePtr,"%-19s%-19s%-19s\n",currentPtr->name,currentPtr->surname,currentPtr->birthday);
//File non pieno
}
else
{
//File terminato
printf("Elemento non riuscito ad inserire\n");
}
}
fclose(filePtr);
}
Potreste aiutarmi a risolvere l'errore penso avvenga nell'allocazione della memoria nella funzione Insert di Rubrica ma non so come risolvere