PDA

Visualizza la versione completa : [C] Segmentation in una lista...mi sembra corretta


Kandalf
23-04-2004, 12:12
xch mi d un segmentation fault?
a me sembra corretta
forse l'ultimo paus->next = NULL; impostato male?



#include <stdio.h>
#include <stdlib.h>

struct hello {
int inf;
struct hello *next;
};

void creaPrimo(int ins);
void creaAltri(int ins);

main()
{
int ins;
struct hello *p, *paus;

printf("Inserisci il primo elemento:\n");
scanf("%d", &ins);

/* Caso primo elemento */
if(ins == 0)
p = NULL;
else {
creaPrimo(ins);
paus = p->next;
/* Caso altri elementi */
do {
printf("Inserisci elementi successivi:\n");
scanf("%d", &ins);
creaAltri(ins);
} while (ins != 0);
paus->next = NULL;
}
}

void creaPrimo(ins) {
int size;
struct hello *p;
size = sizeof(struct hello);
p = (struct hello*)malloc(size);
p->inf = ins;
p->next = NULL;
}

void creaAltri(ins) {
int size;
struct hello *paus;
size = sizeof(struct hello);
paus = (struct hello*)malloc(size);
paus->inf = ins;
paus = paus->next;
}

Michele Facchin
23-04-2004, 12:46
Ma cos'? Una lista?

Se una lista, dove ritorni il valore del puntatore di testa, o dove glielo passi? :tongue:

Kandalf
23-04-2004, 13:01
che casino... :(

posso lasciarlo in 2 funzione separate la creazione degli elementi? o devo usarne per forza uno?


#include <stdio.h>
#include <stdlib.h>

struct hello {
int inf;
struct hello *next;
};

struct hello *creaPrimo(int ins);
struct hello *creaAltri(int ins);

main()
{
int ins;
struct hello *p, *paus;
struct hello *listaPtr;

printf("Inserisci il primo elemento:\n");
scanf("%d", &ins);

/* Caso primo elemento */
if(ins == 0)
p = NULL;
else {
listaPtr = creaPrimo(ins);
paus = p->next;
/* Caso altri elementi */
do {
printf("Inserisci elementi successivi:\n");
scanf("%d", &ins);
listaPtr = creaAltri(ins);
} while (ins != 0);
paus->next = NULL;
}
}

struct hello *creaPrimo(ins) {
int size;
struct hello *p;
size = sizeof(struct hello);
p = (struct hello*)malloc(size);
p->inf = ins;
p->next = NULL;
return p;
}

struct hello *creaAltri(ins) {
int size;
struct hello *p,*paus;
size = sizeof(struct hello);
paus = (struct hello*)malloc(size);
paus->inf = ins;
paus = paus->next;
return p;
}

Kandalf
23-04-2004, 14:26
ora mi d un errore mai visto

errore
Inconsistency detected by ld.so: dl-fini.c: 50: _dl_fini: Assertion `_rtld_local._dl_nloaded > 0' failed!

codice


#include <stdio.h>
#include <stdlib.h>

struct hello {
int inf;
struct hello *next;
};

struct hello *creaPrimo(int ins);
struct hello *creaAltri(int ins);

main()
{
int ins;
struct hello *p, *paus;
struct hello *listaPtr;

printf("Inserisci il primo elemento:\n");
scanf("%d", &ins);

/* Caso primo elemento */
if(ins == 0)
p = NULL;
else {
listaPtr = creaPrimo(ins);
paus = p;
/* Caso altri elementi */
do {
printf("Inserisci elementi successivi:\n");
scanf("%d", &ins);
listaPtr = creaAltri(ins);
} while (ins != 0);
paus->next = NULL;
}
}

struct hello *creaPrimo(ins) {
int size;
struct hello *p;
size = sizeof(struct hello);
p = (struct hello*)malloc(size);
p->inf = ins;
p->next = NULL;
return p;
}

struct hello *creaAltri(ins) {
int size;
struct hello *p,*paus;
size = sizeof(struct hello);
paus = (struct hello*)malloc(size);
paus->inf = ins;
paus = paus->next;
return p;
}

Michele Facchin
23-04-2004, 17:58
Penso di aver capito cosa devi fare.
In pratica devi inserire in una lista una serie di numeri preceduti da 0 numeri, .. 0.

Non ho capito perch utilizzi due funzioni di accodamento, cmq sbagliato visto che i parametri alle funzioni bisogna passarli.

In questo fourm c'era un esempio che ti hop scritto di una lista funzionante, usa quello mettendo la condizione, prima di inserire ogni elemento.

Ciao.

Kandalf
23-04-2004, 18:08
ho capito grazie...in verit volevo farlo tutto da solo un esercizio sul libro
ma proprio nn riesco a capire xch mi d il segmentation

Michele Facchin
23-04-2004, 18:46
Non s, dovrei controllare.

A occhio il code sbagliato, visto che nella seconda funzioni ritorni un puntatore che non hai assegnato a niente.

In pi devi anche passare il puntatore di testa.

Kandalf
24-04-2004, 10:00
quale sarebbe il puntatore?
ora l'ho cambiata...ma l'errore incomprensibile

bash-2.05b$ ./18.1
Inserisci il primo elemento:
5
Inserisci elementi successivi:
4
Inserisci elementi successivi:
5
Inserisci elementi successivi:
3
Inserisci elementi successivi:
0
Inconsistency detected by ld.so: dl-fini.c: 50: _dl_fini: Assertion `_rtld_local._dl_nloaded > 0' failed!



cmq il codice eccolo


#include <stdio.h>
#include <stdlib.h>

struct hello {
int inf;
struct hello *next;
};

struct hello *creaLista(int ins);

main()
{
int ins;
struct hello *p, *paus;
struct hello *listaPtr;

printf("Inserisci il primo elemento:\n");
scanf("%d", &ins);

/* Caso primo elemento */
if(ins == 0)
p = NULL;
else {
listaPtr = creaLista(ins);
paus = p;
/* Caso altri elementi */
do {
printf("Inserisci elementi successivi:\n");
scanf("%d", &ins);
listaPtr = creaLista(ins);
} while (ins != 0);
paus->next = NULL;
}
}

struct hello *creaLista(ins) {
struct hello *p, *paus;

int size;
if (!p) {
struct hello *p;
size = sizeof(struct hello);
p = (struct hello*)malloc(size);
p->inf = ins;
p->next = NULL;
} else {
size = sizeof(struct hello);
paus = (struct hello*)malloc(size);
paus->inf = ins;
paus = paus->next;
return p;
}
}

Loading