Newsgroup: it.comp.lang.c
Titolo: Problema con allocazione dinamica della memoria

Quando vado a provare il programma mi si pianta e mi dice che la memoria 
non può essere read, ecc.
Qualcuno sa darmi una mano???
#include <stdio.h>
#include <stdlib.h>
struct albero{
	int data;
	struct albero *sx;
	struct albero *dx;
};
typedef struct albero ALBERO;
typedef ALBERO *ALBEROPTR;
void insert(ALBEROPTR *, int);
int menu(void);
main()
{
int i;
ALBEROPTR (*root)=NULL;
switch(menu())
	{
		case 1:
		printf("Immetti l'elemento da inserire nell'albero\n");
		scanf("%d", &i);
		printf("\n");
		insert(&root, i);
		break;
		[MEGACUT]
	}
return 0;
}
[....]
void insert(ALBEROPTR *radice, int x)
{
	ALBEROPTR new;
	new=malloc(sizeof(ALBERO));
	if(new==NULL)
		printf("Impossibile allocare la memoria\n");
	else
	{
		if((*radice)==NULL)
			{
				(*radice)->data=x;
				(*radice)->sx=NULL;
				(*radice)->dx=NULL;
			}
		else
			{
				if(x<(*radice)->data)
					insert((*radice)->sx, x);
				if(x>(*radice)->data)
					insert((*radice)->dx, x);
				if(x==(*radice)->data)
					printf("L'elemento e' gia' stato inserito\n");
			}
	}
}
-- 
Zarathustra
(18/22 PO 80 B/S; S)
Parkpre, LeeCougan and Eleven munito

 }
-- 
Mat/tia Belletti - Undergraduate student @ 
cs.unibo.it
ICQ: 33292311    - email: 
mbel...@cs.unibo.it
IRC: RedGlow     - site(s): 
http://mbellett.web.cs.unibo.it/
Jabber: RedGlow  - Linux registered user 299762 @ machine 213003

	new=malloc(sizeof(ALBERO));
Per curiosita' ...
usi un compilatore puro C o C++?
nel secondo caso prova a cambiare quel " new " che è riservato in C++
p.s.
evita il crossposting

 
-- 
oggi no, domani sì

 Qualcuno sa darmi una mano???
ALBEROPTR e` gia` un puntatore a struct albero, quindi, nel main, root
deve essere di tipo ALBEROPTR e non ALBEROPTR*.
Inoltre la funzione insert e` completamente errata per una serie di motivi:
- se radice e` NULL non puoi accedere ai suoi campi.
- se allochi spazio per new, perche` poi non lo usi?
- essendo una funzione ricorsiva se allochi spazio all'inizio e poi
prosegui hai memory leaks.
- il nome new non e` dei piu` felici
- la variabile temporanea new non e` che ti sia indispensabile
- quando passi i sottoalberi sinistri o destri a insert, devi passarne
l'indirizzo.
- e` sempre meglio ritornare un codice di errore.
Qui sotto ti ho scritto una funzione insert che ritorna -1 se non c'e`
abbastanza memoria per una nuova foglia, 0 se l'elemento esiste gia`, 1
altrimenti.
int insert(ALBEROPTR *radice, int x)
{
  if (*radice == NULL)
  {
    if ((*radice = malloc(sizeof(ALBERO))) == NULL)
      return -1;
 
    (*radice)->data = x;
    (*radice)->sx = (*radice)->dx = NULL;
    return 1;
  }
 
  if (x < (*radice)->data)
    return insert(&(*radice)->sx, x);
 
  else if (x > (*radice)->data)
    return insert(&(*radice)->dx, x);
 
  return 0;
}
Ciao.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Il problema è che questa roba non l'ho fatta io , ma l'ho copiata dalle 
dispense del mio prof, che all'altro appello mi ha bocciato con un 
programam perfettamente funzionante.È un vero cretino, non vuole che si 
usino assolutamente espressioni come break o continue, ci impone di 
usare sempre e comunque typedef e altre amenità del genere.


 usare sempre e comunque typedef e altre amenità del genere.
A priori sono buoni principi, ma ovviamente non possono essere applicati 
indiscriminatamente: esistono sempre casi in cui effettivamente le cose 
non devono essere fatte cosi' :)


 non devono essere fatte cosi' :)
Il problema č che se non programmi come vuole lui ti bocia all'esame.A 
settembre mi aveva fato fare un programma che doveva calcolare il max e 
la somma degli elementi in un albero.Lui diceva che non funzionava, solo 
perchč era fatto in maniera diversa da come voleva lui, cosě mi ha 
bocciato.Giunto a casa ho voluto provare e magicamente mi ha funzionato!!!
