PDA

View Full Version : [C] gestione libreria con liste dinamiche


Saverio92
29-12-2011, 11:39
vorrei creare in c un programma per gestire la mia libreria e mi sto avvalendo delle liste dinamiche per fare ciò. per ora ho implementato solo l'inserimento in lista, ma ho alcuni dubbi e non so se funziona a dovere. inoltre quando provo a far partire il programma al secondo inserimento mi dà errore "segmenation fault: 11". potreste dare gentilmente un'occhiata al codice? grazie :D

//
// libreria.c
//
//
// Created by on 26/12/11.
// Copyright (c) 2011 __MyCompanyName__. All rights reserved.
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct el{
char nome[40];
char genere[20];
int anno;
char autore[40];
char cas_edit[40];
int codice;
char descrizione[200];
struct el *next;
struct el *prev;
};
struct el *lista=NULL;
//FUNZIONE INSERISCI
struct el *inserisci(struct el *lista)
{
char nome_libro[40];
struct el *temp,*new,*prev;
temp=lista;
//Caso lista vuota
if(lista==NULL){
temp=malloc(sizeof(struct el));
printf("\nNome libro: ");
gets(temp->nome);
gets(temp->nome);
printf("\nGenere: ");
gets(temp->genere);
printf("\nAnno pubblicazione: ");
scanf("%d",&temp->anno);
printf("\nAutore: ");
gets(temp->autore);
gets(temp->autore);
printf("\nCasa editrice: ");
gets(temp->cas_edit);
printf("\nCodice libro: ");
scanf("%d",&temp->codice);
printf("\nDescrizione(MAX 200 caratteri): ");
gets(temp->descrizione);
gets(temp->descrizione);
temp->prev=NULL;
temp->next=NULL;
printf("\nnuovo");
return temp;
}
//Inserimento in ordine alfabetico
printf("\nNome libro: ");
gets(nome_libro);
while(temp!=NULL&&strcmp(nome_libro,temp->nome)<1){
temp=temp->next;
//Caso inserimento inizio coda
if(strcmp(nome_libro,temp->nome)>1&&temp->prev==NULL){
new=malloc(sizeof(struct el));
strcpy(new->nome,nome_libro);
printf("\nGenere: ");
gets(new->genere);
printf("\nAnno pubblicazione: ");
scanf("%d",&new->anno);
printf("\nAutore: ");
gets(new->autore);
gets(temp->autore);
printf("\nCasa editrice: ");
gets(new->cas_edit);
printf("\nCodice libro: ");
scanf("%d",&new->codice);
printf("\nDescrizione(MAX 200 caratteri): ");
gets(new->descrizione);
gets(new->descrizione);
new->prev=NULL;
new->next=temp;
temp->prev=new;
printf("\nInizio");
return new;
}
//Caso inserimento fine coda
if(strcmp(nome_libro,temp->nome)<1&&temp->next==NULL){
new=malloc(sizeof(struct el));
strcpy(new->nome,nome_libro);
printf("\nGenere: ");
gets(new->genere);
printf("\nAnno pubblicazione: ");
scanf("%d",&new->anno);
printf("\nAutore: ");
gets(new->autore);
gets(temp->autore);
printf("\nCasa editrice: ");
gets(new->cas_edit);
printf("\nCodice libro: ");
scanf("%d",&new->codice);
printf("\nDescrizione(MAX 200 caratteri): ");
gets(new->descrizione);
gets(new->descrizione);
new->prev=temp;
new->next=NULL;
temp->next=new;
printf("\nfine");
return lista;
}
//Caso inserimento in lista classico
if(strcmp(nome_libro,temp->nome)>1){
new=malloc(sizeof(struct el));
strcpy(new->nome,nome_libro);
printf("\nGenere: ");
gets(new->genere);
printf("\nAnno pubblicazione: ");
scanf("%d",&new->anno);
printf("\nAutore: ");
gets(new->autore);
gets(temp->autore);
printf("\nCasa editrice: ");
gets(new->cas_edit);
printf("\nCodice libro: ");
scanf("%d",&new->codice);
printf("\nDescrizione(MAX 200 caratteri): ");
gets(new->descrizione);
gets(new->descrizione);
prev=temp->prev;
new->prev=temp->prev;
new->next=temp;
temp->prev=new;
prev->next=new;
printf("\nclassico");
return lista;
}
}
}
//FUNZIONE VISUALIZZA
struct el visualizza(struct el *lista)
{

}
//FUNZIONE MAIN
void main()
{
int menu=-1;
while(menu!=0){
printf("\nGestisci la tua libreria.\n1. Inserisci\n2. Visualizza\n3. Elimina\n0. Esci\nScelta: ");
scanf("%d",&menu);
switch(menu){
case 1:
lista=inserisci(lista);
if(lista!=NULL)printf("\nInserimento effettuato con successo!");
break;
case 2:
case 3:
case 0:
printf("\nTerminazione programma!");
break;
}
}
}