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

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

  • Απαντ. 1,6k
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοσ.

Πιστεύω είναι απλό (αν δεν έχω λάθος στην malloc)

Βασικά αν είναι άδειο, αυτό θα γίνει πατέρας

>
if(node==NULL)
{
node=(struct node) malloc(sizeof(struct node));
node->data=data;
}

 

Την insert θα την καλείς πάντα με τον πατέρα (η NULL)

 

Και μετά όταν υπάρχει έναν δέντρο, και πρέπει να εισαχθεί σαν φύλλο ένας νέος κόμβος, πώς θα δείξει στον προηγούμενο;

Δημοσ.

Αναδρομικά node==NULL σημαίνει ότι το left η το right είναι NULL.

To left (right) του προηγούμενου θα δείχνει σ αυτόν. Όχι ανάποδα

 

Aλλά εσυ θα καλείς την insert με το parent , διαφορετικα θα τα προσθέτεις σε υποδεντρο του current node.

To parent θα το αποθηκεύσεις μετα την πρώτη φορά που θα την καλέσεις

Δημοσ.

Άρα; αντιγράφουμε απλά το αρχείο σε ένα δεύτερο και εξετάζουμε το δεύτερο; (για μένα πιο γρήγορα)

 

Αν μιλάς σε μένα, τότε όχι δεν είπα ποτέ κάτι τέτοιο. Δεν θα κερδίσεις κάτι με το να το αντιγράψεις σε δεύτερο.

 

 

Και μετά όταν υπάρχει έναν δέντρο, και πρέπει να εισαχθεί σαν φύλλο ένας νέος κόμβος, πώς θα δείξει στον προηγούμενο;

 

Μη νομίσεις ότι προσπαθώ να στην πω αλλά δίνε λίγες παραπάνω πληροφορίες όταν ρωτάς κάτι. Για παράδειγμα πως υλοποιείται η δομή node ? Έχουμε single linked list, double, circular, κτλ. Επίσης ακόμη και ο ίδιος τύπος λίστας μπορεί να υλοποιηθεί με 20 τρόπους. Χρησιμοποιείς head και tail ? Αν είναι απλή single λίστα γιατί θέλεις τον parent στην insert ?

Δημοσ.

 

Μη νομίσεις ότι προσπαθώ να στην πω αλλά δίνε λίγες παραπάνω πληροφορίες όταν ρωτάς κάτι. Για παράδειγμα πως υλοποιείται η δομή

node ? Έχουμε single linked list, double, circular, κτλ. Επίσης ακόμη και ο ίδιος τύπος λίστας μπορεί να υλοποιηθεί με 20 τρόπους. Χρησιμοποιείς head και tail ? Αν είναι απλή single λίστα γιατί θέλεις τον parent στην insert ?

 

όχι προς Θεού γιατι να πιστεύω οτι μου την λες;;

Λοιπόν...

 

>
typedef struct node{

 struct node *rc;
 struct node *lc;
 struct node *parent;
 int a;
}node;

struct node* insert(struct node* node, int data) {
if (node == NULL) {
 node = (struct node*) malloc( sizeof( struct node ) );
 node->a = data;
 node->lc = NULL;
 node->rc = NULL;
// σε αυτο το σημείο θέλω να φτιάξω και ενα δεικτη στον //προηγούμενο κόμβο
}
else {
if (data <= node->data) node->left = insert(node->left, data);
else node->right = insert(node->right, data);
return(node); // return the (unchanged) node pointer
}
}

και επίσης μιλάμε για δεντρο όχι για λίστα

Δημοσ.

Κάτι σαν double linked tree. Κατά την άποψη μου δεν χρειάζεσαι node* parent στην struct.

Θες να διασχίζεις το δεντρό προς τα πίσω ? ( από φύλο προς κορυφή)

Δημοσ.

 

 

όχι προς Θεού γιατι να πιστεύω οτι μου την λες;;

Λοιπόν...

 

>
typedef struct node{

    struct node *rc;
    struct node *lc;
    struct node *parent;
    int a;
}node;

struct node* insert(struct node* node, int data) {
if (node == NULL) {
    node = (struct node*) malloc( sizeof( struct node ) );
    node->a = data;
    node->lc = NULL;
    node->rc = NULL;
// σε αυτο το σημείο θέλω να φτιάξω και ενα δεικτη στον //προηγούμενο κόμβο
}
else {
if (data <= node->data) node->left = insert(node->left, data);
else node->right = insert(node->right, data);
return(node); // return the (unchanged) node pointer
}
}

και επίσης μιλάμε για δεντρο όχι για λίστα

Κάτι σαν double linked tree. Κατά την άποψη μου δεν χρειάζεσαι node* parent στην struct.

Θες να διασχίζεις το δεντρό προς τα πίσω ? ( από φύλο προς κορυφή)

 

Συμφωνώ με τον albNik. Δεν καταλαβαίνω γιατί χρειάζεσαι τον parent. Δικό σου θέμα όμως οπότε πάω παρακάτω. Η συνάρτηση insert δεν παίζει ασχέτως με τον parent. Έχεις πεδία lc, rc και μετά καλείς την insert με node->left. Τι είναι το left ?

 

>
struct node {
int val;
struct node *left;
struct node *right;
struct node *parent;
};

struct node *node_insert(struct node *node, int value, struct node *parent)
{
if (node == NULL) {
	node = malloc(sizeof(*node));    
	if (node == NULL)
		return NULL;
	node->val = value;
	node->left = node->right = NULL;
	node->parent = parent;
} else {
	if (node->val < value)
		node->right = node_insert(node->right, value, node);
	else
		node->left = node_insert(node->left, value, node);
}

return node;
}

 

Κάτι τέτοιο σου κάνει ?

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

Συμφωνώ με τον albNik. Δεν καταλαβαίνω γιατί χρειάζεσαι τον parent. Δικό σου θέμα όμως οπότε πάω παρακάτω. Η συνάρτηση insert δεν παίζει ασχέτως με τον parent. Έχεις πεδία lc, rc και μετά καλείς την insert με node->left. Τι είναι το left ?

 

>
struct node {
int val;
struct node *left;
struct node *right;
struct node *parent;
};

struct node *node_insert(struct node *node, int value, struct node *parent)
{
if (node == NULL) {
	node = malloc(sizeof(*node));
	if (node == NULL)
		return NULL;
	node->val = value;
	node->left = node->right = NULL;
	node->parent = parent;
} else {
	if (node->val < value)
		node->right = node_insert(node->right, value, node);
	else
		node->left = node_insert(node->left, value, node);
}

return node;
}

 

Κάτι τέτοιο σου κάνει ?

 

 

δεν μου κάνει! απλα ο parent pointer θα είναι βολικός στις διαγραφές....

Απλά αυτό που προσπαθώ να κάνω είναι για καθε κόμβο που εισάγω, να τον κάνω να δείχνει στον parent!

Επεξ/σία από nik324
Δημοσ.

Καλησπέρα.

 

Ειναι σωστό να πουμε οτι το \33 ή \033 ειναι ειναι μια numeric escape sequence σε οκταδική αναπαράσταση για τον ESC χαρακτήρα

για μια συγκεκριμενη πλατφορμα παντοτε.

Δημοσ.

To \033 είναι η οκταδική αναπαράσταση του ESC. Η δεκαδική του αναπαράσταση είναι το \27.

Ισχύει σε όλες τις πλατφόρμες που υποστηρίζουν ASCII table.

Δημοσ.

δεν μου κάνει! απλα ο parent pointer θα είναι βολικός στις διαγραφές....

Απλά αυτό που προσπαθώ να κάνω είναι για καθε κόμβο που εισάγω, να τον κάνω να δείχνει στον parent!

 

 

Άρα, θες να κάνεις ένα tree like structure που κάθε κόμβος να ξέρει και τα αδέρφια του;

 

Εάν ναι, ο parent θα είναι μοναδικός ή αναλόγως το επίπεδο που θα είναι κάθε κόμβος (δηλαδή, θα έχεις ένα επίπεδο ή πολλά στο tree σου) ;

Δημοσ.

To \033 είναι η οκταδική αναπαράσταση του ESC. Η δεκαδική του αναπαράσταση είναι το \27.

Ισχύει σε όλες τις πλατφόρμες που υποστηρίζουν ASCII table.

 

Nαι αλλα επειδη το ειδα και με 2 αλλες ονομασιες (numeric escape ... octal escape sequence) μπερδευτηκα.

 

Το οτι ενα string literal καταλαμβάνει n+1 bytes αν n ειναι το μήκος του δεν ισχυει στην περιπτωση που ο char

έχει πανω απο 1 byte μέγεθος. Εχει δει κανεις compiler που να καταλαμβανει πανω απο 1 byte o char ????

Δημοσ.

[γκρίνια]

Τις τελευταίες ημέρες δέχτηκα πολλά μηνύματα από παραπάνω του ενός άτομα για βοήθεια σε C "για να μην απασχολείται το φόρουμ". Δεν με ενοχλούν τα προσωπικά μηνύματα αλλά το καλύτερο είναι η ερώτηση να γίνεται εδώ. Αν η ερώτηση είναι απλή και δεν δικαιολογεί ξεχωριστό νήμα, για αυτό έχουμε το παρόν νήμα. Μη φοβάστε δεν θα πάθει τίποτα το φόρουμ αν ρωτήσετε. Ίσα ίσα τα φόρα, όπως και οι καρχαρίες, πρέπει να κινούνται.

 

Είναι σημαντικό να γίνονται ερωτήσεις εδώ και όχι με προσωπικά μηνύματα γιατί εκτός ότι εδώ μπορεί κάποιος άλλος να δώσει πιο σωστή απάντηση από εμένα, το νήμα σε αντίθεση με τα μηνύματα είναι προσβάσιμο σε όλους οπότε μπορεί στο μέλλον να βοηθηθεί κάποιος άλλος που έχει την ίδια απορία.

 

Επίσης δεν χρειάζεται να μου μιλάτε στον πληθυντικό. Μπορεί να έχω πολλά γένια αλλά δεν είμαι ούτε μητροπολίτης ούτε καθηγητής πανεπιστημίου ούτε τίποτα. Μπορείτε (και επιβάλλεται) να μου μιλάτε στον ενικό :P

 

Αυτά :P

[/γκρίνια]

  • Like 1
Δημοσ.

[γκρίνια]

Τις τελευταίες ημέρες δέχτηκα πολλά μηνύματα από παραπάνω του ενός άτομα για βοήθεια σε C "για να μην απασχολείται το φόρουμ". Δεν με ενοχλούν τα προσωπικά μηνύματα αλλά το καλύτερο είναι η ερώτηση να γίνεται εδώ. Αν η ερώτηση είναι απλή και δεν δικαιολογεί ξεχωριστό νήμα, για αυτό έχουμε το παρόν νήμα. Μη φοβάστε δεν θα πάθει τίποτα το φόρουμ αν ρωτήσετε. Ίσα ίσα τα φόρα, όπως και οι καρχαρίες, πρέπει να κινούνται.

 

Είναι σημαντικό να γίνονται ερωτήσεις εδώ και όχι με προσωπικά μηνύματα γιατί εκτός ότι εδώ μπορεί κάποιος άλλος να δώσει πιο σωστή απάντηση από εμένα, το νήμα σε αντίθεση με τα μηνύματα είναι προσβάσιμο σε όλους οπότε μπορεί στο μέλλον να βοηθηθεί κάποιος άλλος που έχει την ίδια απορία.

 

Επίσης δεν χρειάζεται να μου μιλάτε στον πληθυντικό. Μπορεί να έχω πολλά γένια αλλά δεν είμαι ούτε μητροπολίτης ούτε καθηγητής πανεπιστημίου ούτε τίποτα. Μπορείτε (και επιβάλλεται) να μου μιλάτε στον ενικό :P

 

Αυτά :P

[/γκρίνια]

 

Το ίδιο συμβαίνει και σε μένα. Συμφωνώ απόλυτα με τον imitheo, βάζετε τις ερωτήσεις σας στο φόρουμ. Είναι και για σας καλύτερα, αφού πιθανότατα θα πάρετε απάντηση πολύ νωρίτερα ;)

Επισκέπτης
Αυτό το θέμα είναι πλέον κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...