Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [C] aggiunta di un elemento nella lista

    ho un esercizio che dichiarato in input una lista e un vettore di n elementi,se il 1°elemento della lista è presente nel vettore allora deve creare un altro nodo contenente il valore 0 ed agganciare alla lista e restituire con la nuova testa.
    esempio: L è 3 -> 2 -> 7 > 8 -> 3 e V = [7, 3, 5]
    allora la funzione modifica la lista così 0 -> 3 -> 2 -> 7 -> 8 -> 3.

    ecco come ho provato a fare:

    codice:
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<ctype.h>
    
    struct _elem {
        int          info;
        struct _elem *next;
    };
    typedef struct _elem Elem;
    typedef Elem* List;
    
    Elem *crea_lista(int n_list);
    List inszero(List L, int V[], int n);
    void visualizza(List L);
    
    int main(){
    
    	int n_list,n,i;
    	int vett[100];
    	scanf("%d",&n);
    	 printf(" inserisci gli elementi nel vettore \n");
    	  for (i=0;i<n;i++){
    		scanf("%d",&vett[i]);
    	   }
    
    	printf("INSERISCI n_liste per definire gli elementi nella lista \n");
    	scanf("%d",&n_list);
    	
    	Elem *punta_lista;
    	punta_lista=malloc(sizeof(Elem));
    	printf("Inserisci gli elementi nella 1° lista: \n");
    	
    	*punta_lista=*crea_lista(n_list);
    	Elem *modifica;
    	modifica=malloc(sizeof(Elem));
    	modifica=inszero(punta_lista,vett,n);
    	
    	  visualizza(punta_lista);
    	
    
    	return 0;
    }
    
    Elem *crea_lista(int n_list){
    
    	Elem *p,*paus;
    	int i;
    	if (n_list<=0) 
    	p=NULL;
     else
          {
           // creazione del 1° nodo
    	p=malloc(sizeof(Elem));
    	printf("dammi l'informazine\n");
    	scanf("%d",&p->info);
    	paus=p;
    	
          }
    	for (i=1;i<n_list;i++){
    		
    	    paus->next=malloc(sizeof(Elem));
    	    paus=paus->next;
    	    printf("dammi l'informazine\n");
    	    scanf("%d",&paus->info);
    		
             }
    		
    	         paus->next=NULL;
    	        
    	    return p;
    }
    List inszero(List L, int V[], int n){
    
    	Elem *p=L,*tempPtr,*curr=L;
            int i;
    		
    				
    	   if (p!=NULL){
    		
    		tempPtr=malloc(sizeof(Elem));   // forze è qua l'errore?????
            	tempPtr->info=0;                        // forze è qua l'errore ?????? 
    		
    	
    
    		   for (i=0;i<n;i++){
    			if (V[i]==p->info){
    				
    				 // forze è qua l'errore?????
    			        curr=tempPtr;                  //curr punta a tempPtr
                                     // e tempPtr-> contiene l'indirizzo del prossimo elemento cioè p (primo elemento)
    				tempPtr->next=p;
    			}
    		}
    	   }
    		while (tempPtr!=NULL){
    			tempPtr=tempPtr->next;
    		}
    		
    		return curr; //restituisco la testa
    }	
    	
    
    void visualizza(List L){
    
    	List p;
    	p=L;
    	while (p!=NULL){
    		printf("%d",p->info);
    		printf("--->");
    		p=p->next;
             }
    }
    alla fine la lista non viene modificata?

  2. #2
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    ho dato un'occhiata al codice, e pare che sia corretto, apparte che quando fai la seconda chiamata alla funzione visualizza, devi passare come parametro il puntatore modifica! perchè la funzione inszero() ritorna il valore proprio a quel puntatore, quindi la nuova testa è quella! poi ci sono delle cose che non ho capito, tipo:
    codice:
    punta_lista=malloc(sizeof(Elem));
    modifica = malloc(sizeof(Elem));
    non c'è bisogno d allocare il punta_lista se poi nella funzione crea_lista gli assegni un altro valore! facendo così hai soltato allocato inutilmente 2 blocchi della lista che poi andranno persi! lo stesso vale per modifica!!
    e infine:
    codice:
    while (tempPtr!=NULL){
      tempPtr=tempPtr->next;
    Non ho capito bene lo scopo di questo while a fine funzione inszero() ?!?!?
    comunque il problema principale era quello di passare alla funzione visualizza il puntatore modifica! prova e fammi sapere se funziona! altrimenti scrivi i problemi
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

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.