Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [C]Problema nel cancellare nodo dalla lista (crivello di Eratostene)

    Ragazzi questo è il codice:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    typedef struct dati* numero;
    struct dati
    {
    	int numero;
    	numero next;
    };
    /* run this program using the console pauser or add your own getch, system("pause") or input loop */
    numero lsist_delete_node(numero x);
    void search_node(numero* n);
    void stampalista(numero n);
    int cercanumero(int m,int array[50]);
    numero lsist_insert_order(numero head,numero n);
    int main(int argc, char *argv[]) {
    	srand(time(NULL));
    	FILE* fp;
    	int x; int l;
    	fp=fopen("numericasuali.txt","w");
    	int array[51];
    	for (x=0;x<50;x++)
    	{
    		int s=2 + rand() %51;
    	    if (l=cercanumero(s,array)!=0)
    	    
    	    	array[x]=s;
    	    else x--;	
    	}
    	for (x=0;x<50;x++)
    	{
    	if(x==49)
    	fprintf(fp,"%d",array[x]);
    	else
    	fprintf(fp,"%d\n",array[x]);
    }
    
    fclose(fp);
    fp=fopen("numericasuali.txt","r");
    numero il=NULL; numero nodo=NULL;
    while(!feof(fp))
    {
    	nodo=malloc(sizeof(struct dati));
    	fscanf(fp,"%d\n",&nodo->numero);
    	nodo->next=NULL;
    	il=lsist_insert_order(il,nodo);
    	
    }
        fclose(fp);
        numero temp=il;
        while(temp!=NULL)
        {
        	
    		
    		int z=temp->numero;
       
        	if(temp->next->numero%z==0)
        	{
        		temp=lsist_delete_node(temp);
    			/*if(temp->next==NULL)
        		temp->next=NULL;
        		else{
    			numero tmp=temp->next;
        		temp->next=tmp->next;}*/
        		
        	}
        	temp=temp->next;
        }
        
        stampalista(il);
    	system ("PAUSE");
    	return 0;
    }
    
    
    /*void search_node(numero* n)
    {
      	int m=(*n)->numero;
      	while((*n)!=NULL)
      	{
      		if(m%(*n)->next->numero==0)
      		delete_node(&n);
      		
      	}
    }
    */
    int cercanumero(int m,int array[50])
    {
    	int x;int s;
    	for (x=0;x<50;x++)
    	{
    		if (array[x]==m ){
    		int s=0;
    		return s;}
    	}
    	int o=10;
    	return o;
    }
    
    numero lsist_insert_order(numero head,numero n){ 
      /*Se la lista è vuota deve mettere il nodo n in testa*/    
      if(head==NULL)  
        return n; /*ritorna n come testa della lista*/  
      numero t=head; /*t puntatore di appoggio per scorrere la lista*/ 
      /*Controlla se deve inserire il nodo n in testa alla lista*/
      if (n->numero < t->numero) { 
        n->next=t; /*sposta il puntatore del nodo successivo di n alla vecchia testa*/
        return n; /*ritorna n come testa della lista*/
      }  
     /*Scorre la lista */  
      while(t->next!=NULL) { /*si ferma all'ultimo nodo*/
        if (n->numero < t->next->numero) { /*confronta i campi item fra n e il nodo successivo a t*/
          n->next=t->next; /*inserisce il nodo n  */
          t->next=n;       /*     dopo il nodo t  */
          return head; /*ritorna la testa*/
        }
        t=t->next; /*sposta t al nodo successivo per scorrere la lista*/
      }    
      t->next=n; /*aggiunge n alla fine della lista*/
      return head; /*ritorna la testa*/
    }
    
    void stampalista(numero n)
    {
    	while(n!=NULL)
    	{
    		printf ("%d\n",n->numero);
    		n=n->next;
    	}
    }
    
    numero lsist_delete_node(numero x){
      if (x->next==NULL) return x;
      numero t=x->next;   /*salvo il puntatore al nodo da togliere in t  */
      x->next=t->next; /*tolgo il nodo t dalla lista */
      return x;
    }
    Ho messo in grassetto il punto dove mi crea problemi il codice. In pratica devo eliminare i multipli di ogni numero (crivello di Eratostene) e ho creato quell'agoritmo, solo che il programma mi crasha sia chiamando la funzione scritta alla fine e sia scrivendola direttamente nel while (l'ho messa tra commenti).
    Un aiutino?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma come l'hai compilato?

    Chiami

    numero

    il valore all'interno della struttura ma anche

    numero

    il tipo

    struct dati*

    Così al compilatore non piace ... per cominciare ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Sono diversi tipi di dati, non crea confusione il compilatore, infatti cambiando i nomi il risultato non cambia. Mi crasha sempre nella cancellazione del nodo...

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non dico che quella è la causa del crash ma che non riesco neanche a compilare ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Ti mando il codice corretto
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    typedef struct dati* lol;
    struct dati
    {
    	int numero;
    	lol next;
    };
    /* run this program using the console pauser or add your own getch, system("pause") or input loop */
    void lsist_delete_node(lol x);
    void search_node(lol* n);
    void stampalista(lol n);
    int cercanumero(int m,int array[50]);
    lol lsist_insert_order(lol head,lol n);
    int main(int argc, char *argv[]) {
    	srand(time(NULL));
    	FILE* fp;
    	int x; int l;
    	fp=fopen("numericasuali.txt","w");
    	int array[51];
    	for (x=0;x<50;x++)
    	{
    		int s=2 + rand() %51;
    	    if (l=cercanumero(s,array)!=0)
    	    
    	    	array[x]=s;
    	    else x--;	
    	}
    	for (x=0;x<50;x++)
    	{
    	if(x==49)
    	fprintf(fp,"%d",array[x]);
    	else
    	fprintf(fp,"%d\n",array[x]);
    }
    
    fclose(fp);
    fp=fopen("numericasuali.txt","r");
    lol il=NULL; lol nodo=NULL;
    while(!feof(fp))
    {
    	nodo=malloc(sizeof(struct dati));
    	fscanf(fp,"%d\n",&nodo->numero);
    	nodo->next=NULL;
    	il=lsist_insert_order(il,nodo);
    	
    }
        fclose(fp);
        int s;
        //printf("Digita il numero da cancellare\n"); scanf("%d",&s);
        //lol trp=il;
       /* while(trp!=NULL && trp->next->numero!=s)
        {
          trp=trp->next;}
        lsist_delete_node(trp);*/
        lol temp; lol asd=il;
        while(asd!=NULL)
        {
        	int z=asd->numero; printf("\n%dsd\n",z);
        	temp=il;
        	while(temp!=NULL){
        	if(temp->next->numero % z==0 && temp->next!=NULL){
        	
        		lsist_delete_node(temp);}
    		
        		temp=temp->next;}
       
        	asd=asd->next;
        }
        
        stampalista(il);
    	system ("PAUSE");
    	return 0;
    }
    
    
    /*void search_node(numero* n)
    {
      	int m=(*n)->numero;
      	while((*n)!=NULL)
      	{
      		if(m%(*n)->next->numero==0)
      		delete_node(&n);
      		
      	}
    }
    */
    int cercanumero(int m,int array[50])
    {
    	int x;int s;
    	for (x=0;x<50;x++)
    	{
    		if (array[x]==m ){
    		int s=0;
    		return s;}
    	}
    	int o=10;
    	return o;
    }
    
    lol lsist_insert_order(lol head,lol n){ 
      /*Se la lista è vuota deve mettere il nodo n in testa*/    
      if(head==NULL)  
        return n; /*ritorna n come testa della lista*/  
      lol t=head; /*t puntatore di appoggio per scorrere la lista*/ 
      /*Controlla se deve inserire il nodo n in testa alla lista*/
      if (n->numero < t->numero) { 
        n->next=t; /*sposta il puntatore del nodo successivo di n alla vecchia testa*/
        return n; /*ritorna n come testa della lista*/
      }  
     /*Scorre la lista */  
      while(t->next!=NULL) { /*si ferma all'ultimo nodo*/
        if (n->numero < t->next->numero) { /*confronta i campi item fra n e il nodo successivo a t*/
          n->next=t->next; /*inserisce il nodo n  */
          t->next=n;       /*     dopo il nodo t  */
          return head; /*ritorna la testa*/
        }
        t=t->next; /*sposta t al nodo successivo per scorrere la lista*/
      }    
      t->next=n; /*aggiunge n alla fine della lista*/
      return head; /*ritorna la testa*/
    }
    
    void stampalista(lol n)
    {
    	while(n!=NULL)
    	{
    		printf ("%d\n",n->numero);
    		n=n->next;
    	}
    }
    
    void lsist_delete_node(lol x){
      //if (x->next==NULL) return; /*ritorna NULL se non c'è nessun nodo dopo x*/
      lol t=x->next;   /*salvo il puntatore al nodo da togliere in t  */
      x->next=t->next;
      free(t); /*tolgo il nodo t dalla lista */
      /*ritorna il puntatore al nodo tolto dalla lista*/
    }

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    La causa sta in questa riga

    if(temp->next->numero%z==0)

    in quanto temp->next, ad un certo punto, è NULL
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Ci ho messo una "if(temp->next!=NULL)" e levato l'AND dall'if successivo ma la situazione non è migliorata di molto... come dovrei fare?

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Cioè? Adesso il codice com'è ?

    P.S. Comunque quando ti viene segnalato un problema in una linea non devi "mettere una pezza" con un controllo ma devi cercare di capire perché succede l'evento che genera l'errore.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Ti posto solo la parte del codice interessata senza ripostarti tutto:
    codice:
    lol temp; lol asd=il;
        while(asd!=NULL)
        {
        	int z=asd->numero; 
        	temp=il;
        	while(temp!=NULL){
            if(temp->next!=NULL){
        	if(temp->next->numero % z==0)
        	
        		lsist_delete_node(temp);}
    			
        		temp=temp->next;}
        
        	asd=asd->next;
        }
    Comunque il problema è che non riesco proprio a capire dove sia l'inghippo (tenendo conto che faccio esercizi da stamane ininterrottamente)

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Se l'esecuzione arriva a

    sist_delete_node(temp);

    subito dopo non devi continuare i cicli ma devi passare al codice seguente la prima while.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.