2016-03-29 6 views
-2

Ich versuche, eine doppelt verknüpfte Liste zu sortieren, aber ich habe einige Probleme. Ich bin ein Noob in C und ich denke, mein Problem ist mit Zeigern.C Bubblesort in LinkedList

Ich kann einfach nicht sehen, wie man zwei Positionen innerhalb der Liste und so ist vielleicht das ist das Problem.

Ich habe versucht, es mit Bubblesort zu sortieren, auch wenn ich weiß, dass die Komplexität nicht so gut ist, weil, wie ich noch lerne, ich dachte, dass es ein einfacher Start ist.

ich tryied auch einige Dinge über Leseelemente in einem LinkedList swaping und wie sie sortieren, aber ich bin wirklich mit diesem Problem stecken ...

PS: Ich begann die für mit dem m-> weiter weil meine Liste eine Überschrift hat (m).

PS2: Ich erhalte die Fehlermeldung „Anfrage Mitglied‚next‘in etwas keine Struktur oder Union“, und weiß nicht, wie es die Kommentare lesen zu beheben

struct segment { 
    int x, y; /// position 
    char c; // letter 
    struct segment* next; 
    struct segment* prev; 
}; 


void sortingSegments(struct segment* m) { 
    struct segment **j; struct segment **i; 

    for(i = &((m->next)->next); i !=NULL; i = i->next) { 
      for(j = &(m->next); j == i; j = j->next) { 
       if ((*j)->c > (*i)->c) { 
        struct segment **aux; 
        aux = i; 
        (*aux)->next = (*i)->next; 
        (*aux)->prev = (*i)->prev; 

        i = j; 
        (*i)->next = (*j)->next; 
        (*i)->prev = (*j)->prev; 

        j = aux; 
        (*j)->prev = (*aux)->prev; 
        (*j)->next = (*aux)->next; 
       } 
      } 
    } 
} 
+1

Ihr Problem ist mit Zeigern. Sie müssen die Adresse der Liste übergeben, nicht nur einen Zeiger darauf ("m"), um die Fälle zu behandeln, in denen der erste Knoten seine Position ändert und die Listenadresse sich ändert. Sie brauchen also 'sortingSegments (struct Segment ** m)', dann können Sie einfach 'segment * j, .. * i' verwenden und die verbleibende Indirektionsstufe anpassen. Für den Fall, dass der erste Knoten vertauscht wird, vergessen Sie nicht, '* m = new_first_node_address;' zu setzen oder Ihre Liste wird nach der Sortierung abgebrochen. –

Antwort

0

Bitte und versuchen die Verknüpfung von Knoten zu verstehen.

Es basiert auf der simple bubble sort described in wikipedia.

void sortingSegments(struct segment** m) { 
    struct segment *i, *tmp, *prev, *next; 
    int swapped = 1; 
    /* 
    * https://en.wikipedia.org/wiki/Bubble_sort#Pseudocode_implementation 
    * n = length(A) 
    * repeat 
    * swapped = false 
    * for i = 1 to n-1 inclusive do 
    *  //if this pair is out of order 
    *  if A[i - 1] > A[i] then 
    *  // swap them and remember something changed 
    *  swap(A[i - 1], A[i]) 
    *  swapped = true 
    *  end if 
    * end for 
    * until not swapped 
    */ 

    // looping until no more swaps left 
    while (swapped) { 
     swapped = 0; 
     // we begin from the second item at each iteration 
     for (i = (*m)->next; i; i = i->next) { 
      // we need to swap i with i->prev 
      if (i->prev->c > i->c) { 
       prev = i->prev; 
       next = i->next; 
       // swapping first and second elements, 
       // so update m to reflect the change made 
       // to the head of the list 
       if (prev == *m) { 
        *m = i; 
       } 
       // so there is a prev of prev, update that two links 
       else { 
        prev->prev->next = i; 
        i->prev = prev->prev; 
       } 
       // so there is a next, update that two links 
       if (next) { 
        next->prev = prev; 
        prev->next = next; 
       } 
       // no next element, mark the end of the list 
       else { 
        prev->next = NULL; 
       } 
       // this is obvious, prev now becomes i's next 
       prev->prev = i; 
       i->next = prev; 

       // this is needed to reflect the change in i 
       i = prev; 
       swapped = 1; 
      } 
     } 
    } 
}