Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 25
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156

    Inversione lista

    Sto cercando di scrivere una funzione che inverta una lista:
    codice:
    t_list inverti_lista(t_list lista)
    {
    	t_node*curr;
    	t_node*first;
    	curr=lista;
    	first=lista;
    	while((curr->link)!=NULL)
    	{
    		(curr->link)->link=curr->link;
    		curr=curr->link;
    	}
    	first->link=NULL;
    	lista=curr;
    	return lista;
    	
    	
    }
    ...il problema č che non so se funziona dal momento che inserendo questa nuova funzione non vā la funzione di stampa della lista La cosa mi sembra assurda dal momento che, essendo il main questo :
    codice:
    int main()
    {
    	int scelta=1;
    	t_list lista;
    	t_info inf;
    	lista=list_create();
    	while(scelta!=0)
    	{
    		inf=read_info();
    		lista=list_insert(lista,inf);
    		printf("Vuoi inserire un altro elemento? 1/0 \n");
    		scanf("%d",&scelta);
    	}
    	printf("La lista letta e' : \n");
    	print_list(lista);
    	printf("Inserire il nome da cancellare\n");
    	inf=read_info();
    	lista=node_delete(lista,inf);
    	printf("La lista dopo la cancellazione:\n");
    	print_list(lista);
    	lista=inverti_lista(lista);
    	printf("Lista invertita:\n");
    	print_list(lista);
        return EXIT_SUCCESS;
    }
    ..."lista_inverti" viene chiamata dopo la "print_lista". Se inserisco la chiamata della funzione invertente come un commento il programma fa quello deve fare, altrimenti non entra proprio nella print_list e sta ad aspettare come se dovessi inserire un carattere....qualche idea?

  2. #2
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    In che senso non va? C'č un segmentation fault o non ti stampa niente?
    Comunque č meglio se posti anche la definizione della struttura t_list.

  3. #3
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    nel while della funzione di inversione la prima istruzione fa puntare il link del nodo successivo a se stesso, e nella seconda istruzione passi al secondo nodo che ora punta a se stesso: sei in un ciclo infinito, benvenuto.

    la cosa l'avresti scoperta da te se avessi fatto un MINIMO di debug e tracing. il compilatore, il debugger, il linguaggio stesso sono strumenti li devi usare per impararli non bastano i libri. E ti conviene iniziare subito.

    non ti posto la soluzione, rivedi meglio il codice: hai bisogno oltre che del nodo corrente di DUE variabili temporanee una al nodo precedente e l'altra al nodo successivo. Con il while devi ciclare una "finestra" di tre nodi e modificare i link utilizzando le due variabili temporanee.

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156
    Originariamente inviato da rsdpzed
    la cosa l'avresti scoperta da te se avessi fatto un MINIMO di debug e tracing. il compilatore, il debugger, il linguaggio stesso sono strumenti li devi usare per impararli non bastano i libri. E ti conviene iniziare subito.
    ..il debug l'ho fatto, la funzione non l'ho analizzata perchč non viene proprio chiamata ( ho inserito una printf di controllo ). Piuttosto vorrei capire come mai la funzione di inversione mi crea problemi con la funzione di stampa che viene chiamata prima, quando il compilatore ancora non si accorge dell'esistenza di "inverti_lista"....

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156

    Re: Inversione lista

    Originariamente inviato da slashino
    non entra proprio nella print_list e sta ad aspettare come se dovessi inserire un carattere....qualche idea?
    Comunque
    codice:
    struct s_info
    {
    	char nome[15];
    };
    typedef struct s_info t_info;
    struct s_node
    {
    	t_info info;
    	struct s_node* link;
    };
    typedef struct s_node t_node;
    typedef t_node* t_list;

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Non siamo veggenti, non abbiamo il tuo codice per l'inserimento del testo dal prompt e dell'elemento nella lista, nč quello di print, nč quello di delete, solo la struttura l'inverti e il main.

    Potresti benissimo aver fatto un'errore in una di quelle funzioni per ciō che vediamo...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156
    ....se elimino la funzione di inversione funziona tutto correttamente....

  8. #8
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Se intendi che non ti stampa nulla, non c'č un'apparente motivo, se intendi che non ti stampa la lista invertita, beh allora il motivo ti č stato spiegato...
    Ritorno a dire che potrebbe esserci un'errore in una delle funzioni...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156
    Si ferma aspettando (apparentemente) qualcosa. Come quando una scanf aspetta un valore.
    L'intero codice č questo:
    codice:
     
    struct s_info
    {
    	char nome[15];
    };
    typedef struct s_info t_info;
    struct s_node
    {
    	t_info info;
    	struct s_node* link;
    };
    typedef struct s_node t_node;
    typedef t_node* t_list;
    t_info read_info();
    t_list list_insert(t_list,t_info);
    t_list list_create();
    t_node* node_create(t_info);
    bool greater(t_info,t_info);
    bool equal(t_info,t_info);
    t_list node_delete(t_list lista,t_info inf)
    {
    	t_node* prec=NULL;
    	t_node* curr=lista;
    	while((curr!=NULL) && greater(inf,curr->info))
    	{
    		prec=curr;
    		curr=curr->link;
    	}
    	if(curr!=NULL && equal(inf,curr->info))
    	{
                
    	    if(prec==NULL)
    		{
    			lista=curr->link;
    		}
    		else
    		{
    			prec->link=curr->link;
    		}
    		free(curr);
    		return lista;
    	}
    	return lista;
    	
    }
    void print_list(t_list);
    void print_info(t_info);
    //MAINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
    t_list inverti_lista(t_list);
    int main()
    {
    	int scelta=1;
    	t_list lista;
    	t_info inf;
    	lista=list_create();
    	while(scelta!=0)
    	{
    		inf=read_info();
    		lista=list_insert(lista,inf);
    		printf("Vuoi inserire un altro elemento? 1/0 \n");
    		scanf("%d",&scelta);
    	}
    	printf("La lista letta e' : \n");
    	print_list(lista);
    	printf("Inserire il nome da cancellare\n");
    	inf=read_info();
    	lista=node_delete(lista,inf);
    	printf("La lista dopo la cancellazione:\n");
    	print_list(lista);
    	lista=inverti_lista(lista);
    	printf("Lista invertita:\n");
    	print_list(lista);
        return EXIT_SUCCESS;
    }
    //FINE MAINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
    t_info read_info()
    {
    	t_info inf;
    	printf("Inserire il nome\n");
    	scanf("%s",inf.nome);
    	return inf;
    }
    t_list list_insert(t_list lista,t_info inf)
    {
    	t_node* new;
    	t_node* prec=NULL;
    	t_node* curr=lista;
    	while(curr!=NULL && greater(inf,curr->info))
    	{
    		prec=curr;
    		curr=curr->link;
    	}
    	new=node_create(inf);
    	if(new==NULL) exit(1);
    	if(prec==NULL)
    	{
    		new->link=lista;
    		return new; 
    	}
    	else
    	{
    		prec->link=new;
    		new->link=curr;
    		return lista;
    	}
    		
    	
    }
    t_list list_create()
    {
    	return NULL;
    }
    t_node* node_create(t_info inf)
    {
    	t_node* node;
    	node=(t_node*)malloc(sizeof(t_node));
    	if(node==NULL)
    	{
    		printf("Errore nell'inserimento del nodo\n");
    		return NULL;
    	}
    	else
    	{
    		node->info=inf;
    		node->link=NULL;
    		return node;
    	}
    }
    bool greater(t_info info1,t_info info2)
    {
    	if(strcmp(info1.nome,info2.nome)>0)
    	return true;
    	else
    	return false;
    }
    void print_list(t_list lista)
    {
    	printf("sono dentro");
    	t_node* curr=lista;
    	while(curr!=NULL)
    	{
    		print_info(curr->info);
    		curr=curr->link;
    	}
    }
    void print_info(t_info inf)
    {
    	printf("%s   ", inf.nome);
    }
    bool equal(t_info info1,t_info info2)
    {
    	if(strcmp(info1.nome,info2.nome)==0)
    	return true;
    	else
    	return false;
    }
    t_list inverti_lista(t_list lista)
    {
    	printf("sono dentro");
    	t_node*curr;
    	t_node*first;
    	curr=lista;
    	first=lista;
    	while((curr->link)!=NULL)
    	{
    		(curr->link)->link=curr->link;
    		curr=curr->link;
    	}
    	first->link=NULL;
    	lista=curr;
    	return lista;
    	
    	
    }
    Ogni aiuto č ben accetto, grazie a tutti a prescindere per l'interessamento

  10. #10
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Non ho ben capito l'algoritmo che usi per l'eliminazione O_o
    Il ciclo che usi sopprattutto...
    Io ti consiglierei di rivederne la logica
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.