Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [C] ordinameto lista

  1. #1

    [C] ordinameto lista

    ho creato questa funzioncina
    è una bozza dato che ordina in ordine crescente solo il primo elemento, in teoria con un altro for che faccia scorrere tutta la lista dovrei ordinarla, invece va in segmentation...come posso fare? nn mi serve una cosa efficiente ma basta che sia molto chiara

    codice:
    hello *ordina(hello *p)
    {
    	int el, i, j, aus;
    	hello *paus;
    	paus = p;
    	
    	el = contael(p);
    	
    
    	for(i = 0; i < el; i++) 
    	{
    		if(paus->n > p->next->n) 
    			{
    			aus = p->next->n;
    			p->next->n = p->n;
    			p->n = aus;
    			}
    		paus = paus->next;	
    	}
    	return p;
    }
    live free or die

  2. #2
    Non capisco l'uso del for, se la lista è fatta così:

    el1 -> el2 -> el3 -> 0

    avrei messo una cosa tipo

    codice:
    while(paus != 0) {
        ...
    }
    La luce è più veloce del suono,ecco xchè alcune persone sembrano brillanti fino a quando non parlano


  3. #3
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Va in segmentation fault perche ripeti il cilo for el volte (dove el rappresenta il numero degli elementi); invece lo devi ripetere (el - 1) volte; questo perchè quando arrivi all'ultimo elemento della lista, non puoi fare

    paus -> next -> n

    perchè paus a quel punto è già l'ultimo elemento e quindi l'elemento next è NULL e non puoi accedere al suo campo n.

    Io sotituirei

    for(i = 0; i < el; i++)

    con

    while(paus -> next != NULL)


  4. #4
    ok scusate la cavolata, ordinare il primo è facile, ma gli altri nn ci riesco...
    live free or die

  5. #5
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352

    Re: [C] ordinameto lista

    Ecco un modo di ordinare in senso decrescente la lista con 2 cicli for annidati; fissato l'elemento corrente p1, il secondo cilo for fa scorrere p2 su tutti gli elementi che seguono p1, e se l'elemento corrente puntato da p2 ha il campo n maggiore rispetto a quello puntato da p1, i due valori vengono scambiati.

    codice:
    hello *ordina(hello *p){
     	hello *p1, *p2;
    	for(p1 = p; p1 != NULL; p1 = p1 -> next){
    		for(p2 = p1 -> next; p2 != NULL; p2 = p2 -> next){
    			if((p2 -> n) > (p1 -> n)){
    				int tmp = p1 -> n;
    				p1 -> n = p2 -> n;
    				p2 -> n = tmp;
    			}
    		}
    	}
     	return p;
    }

  6. #6
    denghiu

    live free or die

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.