PDA

View Full Version : Programma Coda in C


Jack-Carter
30-05-2008, 21:06
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_STR 10

#define SUCCESS 2
#define FAILURE 3

struct e {
int key;
/* ... */
struct e *next;
};

struct e *enqueue (struct e *pTail, int val);
struct e *dequeue (struct e *pTail, int *val, int *status);
struct e *newE ( );
void traversal (struct e *pTail);
void lettura (int *val);
void stampa (int val, int status);

int
main (
void
)
{
char scelta[MAX_STR];
struct e *pTail;
int val, status;

pTail = NULL;

do {
printf (
"Effettua la scelta (enqueue (e), dequeue (d), traveral (t),"
" f (fine)): ");
scanf ("%s", scelta);

if (strcmp (scelta, "e") == 0) {
lettura (&val);
pTail = enqueue (pTail, val);
} else
if (strcmp (scelta, "d") == 0) {
pTail = dequeue (pTail, &val, &status);
stampa (val, status);
} else {
if (strcmp (scelta, "t") == 0) {
traversal (pTail);
} else {
if (strcmp (scelta, "f") != 0) {
printf ("Scelta errata!!!\n");
}
}
}
} while (strcmp (scelta, "f") != 0);

return (SUCCESS);
}

struct e *
enqueue (
struct e *pTail,
int val
)
{
struct e *pNew;

pNew = newE ();

pNew->key = val;
/* campi */

if (pTail==NULL) {
pTail = pNew;
pTail->next = pTail;
} else {
pNew->next = pTail->next;
pTail->next = pNew;
pTail = pNew;
}

return (pTail);
}

struct e *
dequeue (
struct e *pTail,
int *val,
int *status
)
{
struct e *pOld;

if (pTail != NULL) {
*status = SUCCESS;
if (pTail == pTail->next) {
*val = pTail->key;
free (pTail);
pTail = NULL;
} else {
pOld = pTail->next;
*val = pOld->key;
pTail->next = pOld->next;
free (pOld);
}
} else {
*status = FAILURE;
}

return (pTail);
}

void
traversal (
struct e *pTail
)
{
struct e *pTmp;

fprintf (stdout, "pTail -> ");
if (pTail == NULL) {
fprintf (stdout, "NULL\n");
} else {
pTmp = pTail;
do {
fprintf (stdout, "%d -> ", pTmp->key);
pTmp = pTmp->next;
} while (pTmp != pTail);

fprintf (stdout, "pTail \n");
}

return;
}

struct e *
newE (
)
{
struct e *p;

p = (struct e *) malloc (sizeof (struct e));

if (p==NULL) {
fprintf (stderr, "Allocazione fallita.");
exit (FAILURE);
}

return (p);
}

/* lettura dati */
void
lettura (
int *val
)
{
fprintf (stdout, "Elemento da introdurre = ");
scanf ("%d", val);

return;
}

/* visualizzazione dati */
void
stampa (
int val,
int status
)
{
if (status == SUCCESS) {
fprintf (stdout, "Elemento estratto = %d\n", val);
} else {
fprintf (stdout, "Elemento inesistente.\n");
}

return;
}


Salve, ho un problema con questo programma in C. Visto che per me le code sono un argomento nuovo, voglio capire se sono io a non aver ben capito come funzionano o se è il programma ad essere sbagliato. Premetto di non averlo fatto io.
Il programma non ha errori di compilazione, viene eseguito correttamente senza errori di allocazione etc. Il problema è questo:

Effettua la scelta (enqueue (e), dequeue (d), traveral (t), f (fine)): t
pTail -> NULL
Effettua la scelta (enqueue (e), dequeue (d), traveral (t), f (fine)): e
Elemento da introdurre = 1
Effettua la scelta (enqueue (e), dequeue (d), traveral (t), f (fine)): t
pTail -> 1 -> pTail
Effettua la scelta (enqueue (e), dequeue (d), traveral (t), f (fine)): e
Elemento da introdurre = 2
Effettua la scelta (enqueue (e), dequeue (d), traveral (t), f (fine)): t
pTail -> 2 -> 1 -> pTail
Effettua la scelta (enqueue (e), dequeue (d), traveral (t), f (fine)): e
Elemento da introdurre = 3
Effettua la scelta (enqueue (e), dequeue (d), traveral (t), f (fine)): t
pTail -> 3 -> 1 -> 2 -> pTail
Effettua la scelta (enqueue (e), dequeue (d), traveral (t), f (fine)): e
Elemento da introdurre = 4
Effettua la scelta (enqueue (e), dequeue (d), traveral (t), f (fine)): t
pTail -> 4 -> 1 -> 2 -> 3 -> pTail
Effettua la scelta (enqueue (e), dequeue (d), traveral (t), f (fine)):

Come ho detto sono un dilettante sulle code, e quindi potrei essere io a non aver capito.
Il fatto che ci sia un puntatore al primo elemento della coda pTail, immagino sia normale no? Però perchè ogni volta che inserisco un elemento nuovo, perchè viene messo all'inizio della coda, e poi dopo che ne inserisco un altro, quello precendente diventa l'ultimo e il nuovo diventa il primo? Spero di essere stato chiaro.
Grazie per l'aiuto.

DanieleC88
31-05-2008, 01:04
Però perchè ogni volta che inserisco un elemento nuovo, perchè viene messo all'inizio della coda, e poi dopo che ne inserisco un altro, quello precendente diventa l'ultimo e il nuovo diventa il primo?
Per questo:
if (pTail == NULL)
{
pTail = pNew;
pTail->next = pTail;
}
else
{
pNew->next = pTail->next;
pTail->next = pNew;
pTail = pNew;
}

return (pTail);

O scorri tutta la lista e aggiungi in coda, o altrimenti aggiungi in testa come fai lì. Altrimenti puoi usare un po' di ricorsione, ti allego un file di esempio.

VICIUS
31-05-2008, 08:07
Chiuso.
http://www.hwupgrade.it/forum/showthread.php?t=1649196