PDA

Visualizza la versione completa : [c] Problema lista collegata con puntatori


micius85
27-06-2010, 13:46
In un esercizio viene data una lista di numeri interi collegata con puntatori e un numero intero A. Io devo scrivere una funzione che, senza allocare e deallocare memoria, mi crei una nuova lista contenente i multipli di A che appartenevano alla lista originaria, mantenendo l'ordine in cui si presentavano. In pių questa funzione deve restituire il puntatore alla testa della nuova lista.
Ho provato cosė ma non funge (io l'ho fatta void per semplificarmi le cose e non sapevo dove infilare il return, ma č un problema minore mi sembra):

//la lista č cosė:

struct list {

int value;

struct list * next_ptr;
};

//la mia funzione sbagliata:

void newlist( struct list **ptrptr, int A, struct list ** dst_ptr) {

struct list *tmp;

while ( *ptrptr != NULL ) {

if( (*ptrptr)->value % A == 0) {

tmp = *ptrptr;

while (*dst_ptr != NULL) {

*dst_ptr = (*dst_ptr)->next_ptr;
}

dst_ptr = &tmp;

ptrptr = &(*ptrptr)->next_ptr;

}

else

*ptrptr = (*ptrptr)->next_ptr;
}

}

Qualche consiglio??? GRAZIE

simo_us
28-06-2010, 00:58
Se possibile posta il codice intero e come dice il Regolamento (http://forum.html.it/forum/showthread.php?s=&threadid=973887) al punto nē 6 usa i TAG CODE.

micius85
28-06-2010, 01:29
#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0

typedef int Boolean;


struct list {
int value;
struct list * next_ptr;
};

void init( struct list ** ptrptr );
void visit( struct list * ptr );
void pre_insert( struct list ** ptrptr, int value );

void newlist(struct list **ptr, int A, struct list **dst_ptr);

main()
{
Boolean itera = TRUE;

int value;
int scelta;
struct list * ptr, * dst_ptr;
int A;

// inizializzazione della lista
init( &ptr );
init ( &dst_ptr);


do {
// menų di scelta
printf( "\nScegli operazione:\n" );
printf( "1. inserisci un elemento nella lista 1\n" );
printf( "2. crea la lista dei multipli di A, rimuovendoli dalla lista 1\n");
printf( "3. visita la lista 1\n");
printf( "4. visita la lista dei multipli di A\n");
printf( "0. esci\n" );

// legge la scelta
scanf( "%d", &scelta );

// pulisce lo schermo
system("cls");

// chiamata delle funzioni sulla lista
switch ( scelta ) {
case 1: // inserimento lista 1
printf( "\ninserisci valore: " );
scanf( "%d", &value );
// funzione di inserimento prefisso nella lista
pre_insert( &ptr, value);
break;
case 2: // crea lista degli elementi divisibili per A, rimuovendoli dalla lista principale
printf( "\ninserisci il divisore: ");
scanf( "%d", &A);
newlist( &ptr, A, &dst_ptr);
break;
case 3: // visita la lista 1
printf( "\n\nlista 1: " );
visit( ptr );
break;
case 4: // visita la lista dei multipli di A
printf( "\n\nlista multipli di A: " );
visit( dst_ptr );
break;

case 0: itera = FALSE;
break;
default: // in ogni altro caso ripresenta il menų
printf( "\nscelta errata!" );
break;
}
} while ( itera );



system("PAUSE");
return 0;
}

void newlist( struct list **ptrptr, int A, struct list ** dst_ptr) {

struct list *tmp;

while ( *ptrptr != NULL ) {

if( (*ptrptr)->value % A == 0) {

tmp = *ptrptr;

while (*dst_ptr != NULL) {

*dst_ptr = (*dst_ptr)->next_ptr;
}

*dst_ptr = tmp;

ptrptr = &(*ptrptr)->next_ptr;

}

else

*ptrptr = (*ptrptr)->next_ptr;
}

}



void init( struct list ** ptrptr )
/* inizializzazione
*/
{
*ptrptr = NULL;
}

void visit( struct list * ptr )
/* visita della lista
*/
{
while ( ptr != NULL ) {
printf( "%d ", ptr->value );
ptr = ptr->next_ptr;
}
}


void pre_insert( struct list ** ptrptr, int value )
/* inserisce in testa
*/
{
struct list * tmp_ptr;

tmp_ptr = *ptrptr;
*ptrptr = (struct list *) malloc( sizeof(struct list));
(*ptrptr)->value = value;
(*ptrptr)->next_ptr = tmp_ptr;
}

Loading