vicko98
20-08-2018, 00:25
Salve,
mi sto preparando per un esame universitario basato sul linguaggio C.
Ho svolto una traccia di qualche esame fa in cui veniva chiesto di creare una lista con una sottolista annidata, inserendo prima i dati nella lista principale in maniera ordinata, mentre nella sottolista è richiesto un inserimento in coda.
il testo è questo:
Un servizio di assistenza clienti utilizza un archivio informatico in cui gli interventi di assistenza
vengono organizzati in funzione del nome del quartiere in cui si deve effettuare l'intervento. In
particolare, la struttura dati utilizzata include una lista che contiene le seguenti informazioni:
Nome Quartiere
Coda degli interventi
Dove il campo Nome Quartiere specifica il nome di uno dei quartieri in cui è divisa la città in cui
opera il servizio di assistenza.
La lista è realizzata con puntatori ed è ordinata per Nome di Quartiere.
Per ogni elemento della lista, oltre al campo Nome Quartiere, è memorizzata la coda degli
interventi. Tale coda contiene tutti gli interventi da eseguire in ciascun quartiere, memorizzati in
ordine temporale di arrivo. Ciascun elemento della coda degli interventi contiene i dati del
cliente che ha richiesto l’intervento di assistenza, e cioè:
Cognome
Nome
Via
Telefono
Tipo di Intervento Richiesto
Descrizione dell'intervento richiesto
La coda degli interventi è realizzata con puntatori.
Il tipo di intervento è codificato con un opportuno codice definito tramite enum
Codificare in Linguaggio C:
le strutture dati utilizzate;
una procedura di inserimento di un nuovo quartiere (non presente in archivio);
una procedura di inserimento di una richiesta di intervento. Se il quartiere non esiste, viene
inserito in archivio;
una procedura che indichi il numero di interventi per ciascun quartiere;
una procedura che riceve in ingresso il nome di un quartiere e che in uscita fornisce tutti i dati
del primo intervento presente in coda per quel quartiere. Tale richiesta viene quindi eliminata
dalla coda;
Il main che richiama opportunamente le procedure precedenti.
Durata della prova: 2 ore
il codice è questo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
enum tipo {inst,exe,test};
struct intervento
{
char cognome[20];
char nome[20];
char via[30];
char telefono[15];
enum tipo t;
char info[30];
struct intervento *next;
};
struct quartiere
{
char nomehq[20];
struct intervento *act;
struct quartiere *next;
};
void inshq(struct quartiere** list)
{
struct quartiere *p,*g,*t=*list,*scorri=*list;
int status=0;
p=(struct quartiere*)malloc(sizeof(struct quartiere));
p->next=NULL;
//p->act=(struct intervento*)malloc(sizeof(struct intervento));
//p->act->next=NULL;
printf("Inserisci un nome di un quartiere: ");
scanf("%s",p->nomehq);
while(scorri!=NULL)
{
if(strcmp(p->nomehq,scorri->nomehq)==0)
{
status=1;
printf("Quartiere giC esistente! Inserire un altro nome \n");
return;
}
else status=0;
scorri=scorri->next;
}
if(status==0)
{
if(*list==NULL)
{
*list=p;
}
else
{
for(g=*list;g!=NULL&&strcmp(g->nomehq,p->nomehq)<0;t=g,g=g->next);
if(t==g)
{
p->next=*list;
*list=p;
}
else
{
t->next=p;
p->next=g;
}
}
}
}
void inscoda(struct quartiere **list)
{
char namehq[20];
int status=0;
struct quartiere *scorri=*list;
printf("Inserire nome quartiere: ");
scanf("%s",namehq);
while(scorri!=NULL)
{
if(strcmp(scorri->nomehq,namehq)==0)
{
printf("Quartiere trovato \n");
status=1;
struct intervento *p;
p=(struct intervento*)malloc(sizeof(struct intervento));
p->next=NULL;
printf("Inserisci Cognome: ");
scanf("%s",p->cognome);
printf("Inserisci Nome: ");
scanf("%s",p->nome);
printf("Inserisci Via: ");
scanf("%s",p->via);
printf("Inserisci Telefono: ");
scanf("%s",p->telefono);
printf("Inserisci Tipo intervento [0=install|1=Esecuzione|2=Test] : ");
scanf("%d",&(p->t));
while(getchar()!='\n');
printf("Inserisci descrizione intervento: ");
fgets(p->info,31,stdin);
if(scorri->act==NULL)
{
scorri->act=p;
return;
}
else
{
struct intervento *scorri1=scorri->act;
//while(scorri1->next!=NULL)scorri1=scorri1->next;
scorri1->next=p;
}
}
else status=0;
scorri=scorri->next;
}
if(status==0)inshq(list);
}
void stampa(struct quartiere **list)
{
struct quartiere *scorri=*list;
while(scorri!=NULL)
{
printf("Nome quartiere: %s \n",scorri->nomehq);
struct intervento *scorri1=(*list)->act;
while(scorri1!=NULL)
{
printf("Cognome:%s \n",scorri1->cognome);
scorri1=scorri1->next;
}
scorri=scorri->next;
}
}
void cont(struct quartiere **list,char nhq[30])
{
struct quartiere *scorri=*list;
int i=0,stat=0;
while(scorri!=NULL)
{
if(strcmp(nhq,scorri->nomehq)==0)
{
struct intervento* scorri1=scorri->act;
while(scorri1!=NULL)
{
i++;
scorri1=scorri1->next;
}
printf("Numero interventi quartiere: %s \n Interventi n. %d",scorri->nomehq,i);
return;
}
scorri=scorri->next;
}
printf("non sono stati trovati quartieri con quel nome! \n");
}
void cerca(struct quartiere **list,char nhq[20])
{
struct quartiere *scorri=*list;
while(scorri!=NULL)
{
if(strcmp(scorri->nomehq,nhq)==0)
{
struct intervento *p;
p=scorri->act;
scorri->act=scorri->act->next;
printf("Cognome del primo in coda: %s \n",p->cognome);
printf("Nome del primo in coda: %s \n",p->nome);
free(p);
}
scorri=scorri->next;
}
}
int main()
{
struct quartiere *lista;
lista=NULL;
int i=0;
inshq(&lista);
while(i<1){
inscoda(&lista);
i++;
}
cont(&lista,"tremestieri");
cerca(&lista,"tremestieri");
//stampa(&lista);
}
Il problema sorge sul sistema operativo utilizzato, se eseguito con il compilatore di linux(gcc) parte senza dare troppi problemi.
Mentre se eseguo lo stesso codice su windows, questo al termine dell'inserimento dei primi dati nella sottolista, fa return e termina il programma :
Process returned -1073741819 (0xC0000005) execution time : 21.037 s
Press any key to continue.
Ora, volendo..il docente utilizza esclusivamente linux, quindi ironicamente non sarebbe un problema :D, ma a me da fastidio lasciarlo così, vorrei capire quindi cosa fa infuriare windows con il proprio compilatore, qualcuno sa dirmi perchè?
Grazie in anticipo.
mi sto preparando per un esame universitario basato sul linguaggio C.
Ho svolto una traccia di qualche esame fa in cui veniva chiesto di creare una lista con una sottolista annidata, inserendo prima i dati nella lista principale in maniera ordinata, mentre nella sottolista è richiesto un inserimento in coda.
il testo è questo:
Un servizio di assistenza clienti utilizza un archivio informatico in cui gli interventi di assistenza
vengono organizzati in funzione del nome del quartiere in cui si deve effettuare l'intervento. In
particolare, la struttura dati utilizzata include una lista che contiene le seguenti informazioni:
Nome Quartiere
Coda degli interventi
Dove il campo Nome Quartiere specifica il nome di uno dei quartieri in cui è divisa la città in cui
opera il servizio di assistenza.
La lista è realizzata con puntatori ed è ordinata per Nome di Quartiere.
Per ogni elemento della lista, oltre al campo Nome Quartiere, è memorizzata la coda degli
interventi. Tale coda contiene tutti gli interventi da eseguire in ciascun quartiere, memorizzati in
ordine temporale di arrivo. Ciascun elemento della coda degli interventi contiene i dati del
cliente che ha richiesto l’intervento di assistenza, e cioè:
Cognome
Nome
Via
Telefono
Tipo di Intervento Richiesto
Descrizione dell'intervento richiesto
La coda degli interventi è realizzata con puntatori.
Il tipo di intervento è codificato con un opportuno codice definito tramite enum
Codificare in Linguaggio C:
le strutture dati utilizzate;
una procedura di inserimento di un nuovo quartiere (non presente in archivio);
una procedura di inserimento di una richiesta di intervento. Se il quartiere non esiste, viene
inserito in archivio;
una procedura che indichi il numero di interventi per ciascun quartiere;
una procedura che riceve in ingresso il nome di un quartiere e che in uscita fornisce tutti i dati
del primo intervento presente in coda per quel quartiere. Tale richiesta viene quindi eliminata
dalla coda;
Il main che richiama opportunamente le procedure precedenti.
Durata della prova: 2 ore
il codice è questo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
enum tipo {inst,exe,test};
struct intervento
{
char cognome[20];
char nome[20];
char via[30];
char telefono[15];
enum tipo t;
char info[30];
struct intervento *next;
};
struct quartiere
{
char nomehq[20];
struct intervento *act;
struct quartiere *next;
};
void inshq(struct quartiere** list)
{
struct quartiere *p,*g,*t=*list,*scorri=*list;
int status=0;
p=(struct quartiere*)malloc(sizeof(struct quartiere));
p->next=NULL;
//p->act=(struct intervento*)malloc(sizeof(struct intervento));
//p->act->next=NULL;
printf("Inserisci un nome di un quartiere: ");
scanf("%s",p->nomehq);
while(scorri!=NULL)
{
if(strcmp(p->nomehq,scorri->nomehq)==0)
{
status=1;
printf("Quartiere giC esistente! Inserire un altro nome \n");
return;
}
else status=0;
scorri=scorri->next;
}
if(status==0)
{
if(*list==NULL)
{
*list=p;
}
else
{
for(g=*list;g!=NULL&&strcmp(g->nomehq,p->nomehq)<0;t=g,g=g->next);
if(t==g)
{
p->next=*list;
*list=p;
}
else
{
t->next=p;
p->next=g;
}
}
}
}
void inscoda(struct quartiere **list)
{
char namehq[20];
int status=0;
struct quartiere *scorri=*list;
printf("Inserire nome quartiere: ");
scanf("%s",namehq);
while(scorri!=NULL)
{
if(strcmp(scorri->nomehq,namehq)==0)
{
printf("Quartiere trovato \n");
status=1;
struct intervento *p;
p=(struct intervento*)malloc(sizeof(struct intervento));
p->next=NULL;
printf("Inserisci Cognome: ");
scanf("%s",p->cognome);
printf("Inserisci Nome: ");
scanf("%s",p->nome);
printf("Inserisci Via: ");
scanf("%s",p->via);
printf("Inserisci Telefono: ");
scanf("%s",p->telefono);
printf("Inserisci Tipo intervento [0=install|1=Esecuzione|2=Test] : ");
scanf("%d",&(p->t));
while(getchar()!='\n');
printf("Inserisci descrizione intervento: ");
fgets(p->info,31,stdin);
if(scorri->act==NULL)
{
scorri->act=p;
return;
}
else
{
struct intervento *scorri1=scorri->act;
//while(scorri1->next!=NULL)scorri1=scorri1->next;
scorri1->next=p;
}
}
else status=0;
scorri=scorri->next;
}
if(status==0)inshq(list);
}
void stampa(struct quartiere **list)
{
struct quartiere *scorri=*list;
while(scorri!=NULL)
{
printf("Nome quartiere: %s \n",scorri->nomehq);
struct intervento *scorri1=(*list)->act;
while(scorri1!=NULL)
{
printf("Cognome:%s \n",scorri1->cognome);
scorri1=scorri1->next;
}
scorri=scorri->next;
}
}
void cont(struct quartiere **list,char nhq[30])
{
struct quartiere *scorri=*list;
int i=0,stat=0;
while(scorri!=NULL)
{
if(strcmp(nhq,scorri->nomehq)==0)
{
struct intervento* scorri1=scorri->act;
while(scorri1!=NULL)
{
i++;
scorri1=scorri1->next;
}
printf("Numero interventi quartiere: %s \n Interventi n. %d",scorri->nomehq,i);
return;
}
scorri=scorri->next;
}
printf("non sono stati trovati quartieri con quel nome! \n");
}
void cerca(struct quartiere **list,char nhq[20])
{
struct quartiere *scorri=*list;
while(scorri!=NULL)
{
if(strcmp(scorri->nomehq,nhq)==0)
{
struct intervento *p;
p=scorri->act;
scorri->act=scorri->act->next;
printf("Cognome del primo in coda: %s \n",p->cognome);
printf("Nome del primo in coda: %s \n",p->nome);
free(p);
}
scorri=scorri->next;
}
}
int main()
{
struct quartiere *lista;
lista=NULL;
int i=0;
inshq(&lista);
while(i<1){
inscoda(&lista);
i++;
}
cont(&lista,"tremestieri");
cerca(&lista,"tremestieri");
//stampa(&lista);
}
Il problema sorge sul sistema operativo utilizzato, se eseguito con il compilatore di linux(gcc) parte senza dare troppi problemi.
Mentre se eseguo lo stesso codice su windows, questo al termine dell'inserimento dei primi dati nella sottolista, fa return e termina il programma :
Process returned -1073741819 (0xC0000005) execution time : 21.037 s
Press any key to continue.
Ora, volendo..il docente utilizza esclusivamente linux, quindi ironicamente non sarebbe un problema :D, ma a me da fastidio lasciarlo così, vorrei capire quindi cosa fa infuriare windows con il proprio compilatore, qualcuno sa dirmi perchè?
Grazie in anticipo.