Linked list ...help!

di il
11 risposte

Linked list ...help!

Salve a tutti , sto cercando di fare una linked list con inserimento ordinato , ma sono incappato in qualche errore di segmentazione (ho poca dimestichezza con struct e puntatori).
grazie a tutti per l'aiuto

#include <stdio.h>
#include<stdlib.h>
typedef struct {
	int info;
	struct no *next;
                     }no;
no *node(int val){
	no 2*temp=(no*)malloc(sizeof(no));
	 temp->info=val;
	 temp->next=NULL;
	return temp;
}

  void lista(no *head , int val ){
	no *temp;
		temp=head;
	no *nodo=node(val);
	if (temp->next==NULL || (temp->info>=nodo->info)){
		nodo->next=temp;
		temp=nodo;
     	}else {	
     	        while(temp->next != NULL && (temp->next->info < nodo->info)  ){
		        temp=temp->next; 
				};
				nodo->next=temp->next ;
				temp->next=nodo;
     	  }
 }
 void stampalista(no *head){
	no *temp=NULL;
	temp=head;
	   while ( temp->next !=NULL){
           printf("%d ->",temp->info);
           temp=temp->next;		
	                                      };
}
int main(){
	int a=NULL;
	no *head=NULL;
	head=(no*)malloc(sizeof(no));
	head=
	do{
   	printf("1 inserisci \n2 visualizza\n 3 esci");
   	scanf("%d",&a);
   	if(a==1){int val=0;
   		printf("inserisci valore\n");
	   	scanf("%d",val);
	   	lista(head,val);
	   	}else if (a==2){
		   	stampalista(head);
   		}
   	}while(a!=3);
		
}

11 Risposte

  • Re: Linked list ...help!

    Dove? Hai fatto un po' di debugging?
  • Re: Linked list ...help!

    
    no 2*temp=(no*)malloc(sizeof(no));
    


    Ke è........????



    Comunque la cosa più sbagliata che balza subito all'occhio è:
    
    scanf("%d",val);
    

    deve essere
    
    scanf("%d",&val);
    

    Inoltre la struttura dovrebbe essere:
    
    typedef struct tag_no
    {
    	int info;
    	struct tag_no *next;
    } no;
    
  • Re: Linked list ...help!

    Grazie per le risposte
    Ho rivisto il codice, ricevo 4 warning uguali (assignment from incompatible pointer type)e 1 errore (deferencing pointer from incompatible type) alla riga 58
    #include <stdio.h>
    #include <stdlib.h>
    typedef struct tag_no{
       int info;
       struct no *next;
                         }no;
    
    no *node(int val);
     void lista(no *head , int val );
     void stampalista(no *head);
    int main(){
       int a=NULL;
       no *head=NULL;
       head=(no*)malloc(sizeof(no));
       do{
          printf("1 inserisci \n2 visualizza\n 3 esci");
          scanf("%d",&a);
          if(a==1){int val=0;
             printf("inserisci valore\n");
             scanf("%d",&val);
             lista(head,val);
             }else if (a==2){
                stampalista(head);
             }
          }while(a!=3);
          
    }
    
     no *node(int val){
       no *temp=(no*)malloc(sizeof(no));
        temp->info=val;
        temp->next=NULL;
       return temp;
                    }
                    
     void lista(no *head , int val ){
       no *temp;
          temp=head;
       no *nodo=node(val);
       if (temp->next==NULL || (temp->info>=nodo->info)){
          nodo->next=temp;
          temp=nodo;
            }
    		else {   
                    while((temp->next != NULL )&& (temp->next->info < nodo->info)  ){
                  temp=temp->next; 
                };
                nodo->next=temp->next ;
                temp->next=nodo;
              }
     }
     
     
     void stampalista(no *head){
       no *temp=NULL;
       temp=head;
          while ( temp->next !=NULL){
               printf("%d ->",temp->info);
               temp=temp->next;      
                                             };
    } 
  • Re: Linked list ...help!

    E qual è la riga 58?
  • Re: Linked list ...help!

    Il problema è che delle mie "dritte" te ne sei persa una importante riguardo la struttura.
  • Re: Linked list ...help!

    Ho notato, che stupido che sono .
    il programma ora parte , riesco ad inserire il valore (anche se non so se viene inserito correttamente ),ma parte un loop infinito quando faccio partire il visualizza lista
  • Re: Linked list ...help!

    Diciamo che è un po' tutto un casino.

    Prima cosa, quando viene chiamata per la prima volta la funzione lista head ha valore NULL quindi l'if seguente fa BOOOM!! dereferenziando NULL->next.
    
    if (temp->next == NULL || (temp->info >= nodo->info))
    
    Inoltre tale funzione, così come è scritta, non modifica in alcun modo la variabile head passatale.

    facci una pensata...
  • Re: Linked list ...help!

    Allora riguardando il programma
      if (head==NULL || (head->info>=nodo->info)){
          nodo->next=head;
          head=nodo;
            }
    la riga l'ho modificata cosi .
    quando chiamo la funzione
     lista(head,val)
    dovrei passare l'indirizzo di head ,quindi devo usare la & per poi usare temp come puntatore a head per muovermi all'interno della lista,mi sbaglio?
  • Re: Linked list ...help!

    Se vuoi passare &head devi utilizzare un doppio puntatore nella dichiarazione della funzione.

    Fai molto piu veloce se lasci la funzione come è, ma le fai tornare sempre il valore di head in modo da aggiornare la variabile nel main.
  • Re: Linked list ...help!

    Intendi trasformare la funzione lista nel tipo *no e ritornare temp?
    facendo un po di debugging mi trovo un segmentation fault
     else {
                while((temp->next != NULL )&& (temp->next->info < nodo->info)  ){
                     temp=temp->next;
                };
                 nodo->next=temp->next ;
                 temp->next=nodo;
              } 
              [/code ]
              
    sembra che il programma entri nell'else quando head==NULL
    
    il codice 
    [code ]
    #include <stdio.h>
    #include <stdlib.h>
    typedef struct tag_no{
       int info;
       struct tag_no  *next;
                         }no;
    
     no *node(int val);
     void lista(no *head , int val );
     void stampalista(no *head);
    
    
    int main(void){
       int a=NULL;
       no *head=NULL;
    
       do{
          printf("1 inserisci \n2 visualizza\n 3 esci");
          scanf("%d",&a);
          if(a==1){int val=0;
             printf("inserisci valore\n");
             scanf("%d",&val);
             lista(&head,val);
             }else if (a==2){
                stampalista(head);
             }
          }while(a!=3);
          return 0;
    }
    
     no *node(int val){
       no *temp=(no*)malloc(sizeof(no));
        temp->info=val;
        temp->next=NULL;
       return temp;
                    }
    
     void lista(no *head , int val ){
       no *temp;
          temp=head;
       no *nodo=node(val);
       if (head==NULL || (head->info>=nodo->info)){
          nodo->next=head;
          head=nodo;
            }
          else {
                while((temp->next != NULL )&& (temp->next->info < nodo->info)  ){
                     temp=temp->next;
                };
                 nodo->next=temp->next ;
                 temp->next=nodo;
              }
     }
    
    
     void stampalista(no *head){
       no *temp=NULL;
       temp=head;
          while ( temp->next !=NULL){
               printf("%d ->",temp->info);
               temp=temp->next;
                                             };
    }
    [/code ]
  • Re: Linked list ...help!

    Si, quello che intendo è modificare la funzione in
    
    no *lista(no *head, int val)
    
    Alla fine della funzione puoi sempre sempre tornare head, in modo che, ogni modifica venga "riflessa" in main.
    Chiaramente la chiamata dal main, che adesso è sbagliata, sarà
    
    head = lista(head, val);
    
Devi accedere o registrarti per scrivere nel forum
11 risposte