Dynamische Ringliste



  • movco schrieb:

    Also ich muss eine dynamische Ringliste in C implementieren.
    Wie würdet ihr das angehen? Ein simpler Pseudocode wäre hilfreich zu verstehen.

    Hier ein Ansatz, vielleicht hilft es ja:

    typedef struct element Element;
    typedef unsigned int uint;
    
    struct element { 
        char *data; 
        Element *next; 
    }; 
    
    Element* ring; // Ein beliebiges Element der Ringliste.
    uint n; // Anzahl der Elemente in der Ringliste.
    
    void free_ring() {
    	Element* curr = ring; uint i;
    
    	for ( i = 0; i < n; i++ )
    		curr = curr->next, free ( ring ), ring = curr;
    }
    
    void view_ring ( Element* start ) {
    	uint i;
    
    	if ( start == NULL ) return;
    	for ( i = 0; i < n; i++ )
    		puts(start->data), start = start->next;
    }
    
    Element* new_element() {
    	Element* _new = malloc ( sizeof *_new );
    
    	if ( _new == NULL ) 
    		puts ("Out of memory!");
    	else
    		_new->next = _new, _new->data = NULL;
    	return _new;
    }
    // a equal or greater b
    int a_eqgr_b ( Element* a, Element* b ) {
    	return strcmp ( a->data, b->data ) >= 0; 
    }
    
    int a_less_b ( Element* a, Element* b ) {
    	return strcmp ( a->data, b->data ) < 0;
    }
    
    Element* find_min() {
    	Element* min = ring; uint i;
    
    	for ( i = 0; i < n; i++ ) {
    		if ( a_less_b ( ring, min ) )
    			min = ring;
    		ring = ring->next;
    	}
    	return min;
    }
    
    Element* find_max() { // Such max  :D
    	Element* max = ring; uint i;
    
    	for ( i = 0; i < n; i++ ) {
    		if ( a_less_b ( max, ring ) )
    			max = ring;
    		ring = ring->next;
    	}
    	return max;
    }
    
    void insert ( Element* e ) {
    
    	uint i;
    	if ( e == NULL ) return;
    
    	if ( ring == NULL )
    	{
    		ring = e; // Das erste Element in der Liste ist e.
    	}
    	else
    	{
    		for ( i = 0; i < n; i++ )
    		{
    			if ( a_eqgr_b ( e, ring ) && a_less_b ( e, ring->next ) )
    				break;
    			ring = ring->next;
    		}
    		// Sind im Ring alle gleich, oder ist e größer als alle im Ring?
    		if ( i == n )
    			ring = find_max();  // Jepp.
    		e->next = ring->next, ring->next = e;
    	}
    	n++; // Die Anzahl der Elemente in der Ringliste ist um ein Element größer.
    }  
    
    int main() { 
    	Element* e = NULL;
    	char* data[] = { "jkl", "ghi", "mno", "def", "abc", NULL };
    	uint i = 0;
    
    	while ( data[i] != NULL ) {
    		if ( NULL == ( e = new_element()))
    			break;
    		e->data = data[i], insert ( e ), i++;
    	}
    	view_ring ( find_min() );
    	free_ring();
    	return 0;
    }
    

    Gruß,
    B.B.


Anmelden zum Antworten