Προς το περιεχόμενο

ταξινομημενη καταχωρηση σε απλα συνδεδεμενη λιστα C


nickname2016

Προτεινόμενες αναρτήσεις

εχω φαει τρεις μερες σε μια ασκηση και την εχω φερει σε εναν βαθμο που νομιζω οτι δεν μπορω να κανω και πολλα. Το προγραμματιστικο κομματι ειναι ολοκληρωμενο και περναει το σταδιο του compile, ωστοσο υπαρχουν λογικα λαθη - κομματι στο οποιο, μετα απο πολυ γραψε-σχεδιασε- σβησε - κοψε-ραψε στο χαρτι - φαινεται οτι με φερνει σιγα σιγα σε αδιεξοδο.

**δεν θελω να postαρω κωδικα εδω γτ υποτιθεται ειναι εργασια. Το θεμα δεν ειναι ο βαθμος, αλλα να μαθω. Για τον λογο αυτο οποιος θελει μπορει να βοηθησει με pm.

υγ, μετα τις 12/5 ποσταρω και τη λυση για να το δουμε. 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Σε Link.png Site: αυτή την ανάρτηση έχω  μια ταξινόμηση που γίνεται σε συνδεδεμένη λίστα. Απλά η λίστα αυτή έχει ένα τρόπο να δείχνει τα στοιχεία της στο i σημείο, αλλά το pop γίνεται από ένα σημείο, και υπάρχει μια λειτουργία μετακίνησης όπου φέρνει πίσω σε συγκεκριμένη θέση τη κορυφή (αυτό που θα παίρναμε στο pop). Η εντολή Φέρε i φέρνει το ι στοιχείο στην κορυφή, η Φέρεπίσω i στέλνει τη κορυφή στη ι θέση στη λίστα. Η pop γίνεται με τη Διάβασε.  Η λίστα δεν φαίνεται (δεν έχει όνομα) γιατί είναι η λίστα τιμών που έχει το τμήμα που περιέχει τη ρουτίνα ταξινόμηση(). Η ρουτίνα είναι μια quicksort σε λίστα, γιατί κάνει το απλό πράγμα, να κάνει ταξινόμηση από ένα Ια έως ένα Ιβ στοιχείο, και να καλεί αναδρομικά τον εαυτό της χωρίζοντας την λίστα (ως Σωρός αναφέρεται στη Μ2000).

 

Δεν θα μάθεις τη Μ2000 εδώ αλλά ρίξε μια ματιά για να καταλάβεις τι παίζει, διότι σε μια λίστα μια μετάθεση δυο στοιχείων π.χ. του δέκατου και του δέκατου πέμπτου, θα άλλαζε την αρίθμηση, όταν π.χ. βγάλεις το δέκατο, το δέκατο πέμπτο θα είναι δέκατο τέταρτο, και μπορείς να το βάλεις πριν από το δέκατο τέταρτο ή μετά. Αν το βάλεις μετά τη θέση δεκατρία τότε πράγματι αυτό γίνεται δέκατο τέταρτο και το προηγούμενο δέκατο τέταρτο (που αρχικά ήταν το δέκατο πέμπτο) ξαναγίνεται δέκατο πέμπτο). Αν το βάλεις στη θέση μετά το δέκατο τέταρτο γίνεται δέκατο πέμπτο όπως θέλαμε αλλά το προηγούμενο δέκατο πέμπτο είναι στη θέση δεκατέσσερα, άρα πρέπει από κει να το αφαιρέσουμε και το γράψουμε μετά τη θέση εννιά, και τότε έχουμε κάνει την αλλαγή.

 

Στη Μ2000 δεν ασχολούμαστε με τους δείκτες. Αυτό το κάνουν οι Φέρε, ΦέρεΠίσω, Διάβασε και η ΤιμήΣωρού() που διαβάζει τιμή από τη θέση Ι.  Μπορείς όμως να φτιάξεις συναρτήσεις παρόμοιες και να κρύψεις την χρήση των δεικτών (όπως έχω κάνει και εγώ).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

**δεν θελω να postαρω κωδικα εδω γτ υποτιθεται ειναι εργασια. Το θεμα δεν ειναι ο βαθμος, αλλα να μαθω. Για τον λογο αυτο οποιος θελει μπορει να βοηθησει με pm.

Ειναι μια ασκηση που την κανουν ολοι οταν μπαινουν στο κομματι των δεικτων. Επισης η υλοποιηση πανω κατω ειναι ιδια. Δεν βλεπω γιατι να μην την ποσταρεις.
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Να και μια quicksort...σε c++

http://www.geeksforgeeks.org/quicksort-for-linked-list/

 

Υπάρχουν τα πάντα...

Στο τέλος οι ασκήσεις θα γίνονται πάνω στη ταχύτητα στη χρήση του google...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Να και μια quicksort...σε c++

http://www.geeksforgeeks.org/quicksort-for-linked-list/

 

Υπάρχουν τα πάντα...

Στο τέλος οι ασκήσεις θα γίνονται πάνω στη ταχύτητα στη χρήση του google...

 

Στο παράδειγμα σου ταξινομεί μια αταξινόμητη συνδεδεμένη λίστα.

Η άσκηση εδω λέει ότι έχουμε τη λίστα ταξινομημένη και ζητάει να εισάγουμε νέα στοιχεία παραμένοντας ταξινομημένη.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Έκανα στα γρήγορα μια υλοποίηση και με δύο τρία παραδείγματα που το δοκίμασα δουλεύει μια χαρά.

 

 

#include <stdio.h>
#include <stdlib.h>

typedef struct listnode{
    int entry;
    struct listnode* Link;
}ListNode;

void InsertSorted(int value,ListNode** L){
    ListNode* temp;
    temp = *L;
    ListNode* node;
    node = malloc(sizeof(ListNode));
    node->entry = value;
    node->Link = NULL;
    if (!temp){
        *L = node;
        node->Link = NULL;
        return;
    }
    while (temp->Link){
        if (node->entry < temp->Link->entry){
            node->Link = temp->Link;
            temp->Link = node;
            return;
        }
        temp = temp->Link;
    }
    if (!temp->Link){
        temp->Link = node;
        node->Link = NULL;
        return;
    }
}

 

 

 

Αν θέλεις προσπάθησε το λίγο ακόμα πριν ανοίξεις το spoiler!! :-)

 

Υ.Γ Δουλέυει μόνο για τέτοια ταξινόμηση θέλει μια αλλάγη στο τελευταίο if για την άλλη φορά που την ψάχνω :-D

Επεξ/σία από kaliakman
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...