Τα πάντα για την C

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 21 Ιούλ 2011, 20:40

stamatiou έγραψε:
[snip]
Ελπίζω επειδή δεν μπορώ να λύσω την άσκηση να μην χρειάζεται να ξαναδιαβάσω structs και pointers από την αρχή :!: :crazy: :crazy: :crazy: :crazy:

:lol: :lol: :lol:

Μάλλον θα χρειαστεί να τα ξαναδιαβάσεις. Αν όχι από την αρχή, τουλάχιστον να τα φρεσκάρεις.

To dummy->prev δεν υπάρχει, δεν δουλεύει αυτό (δεν υπάρχει πεδίο prev μέσα στον Node). Όταν σου είπα να χρησιμοποιήσεις έναν βοηθητικό δείκτη prev εννοούσα να ορίσεις έναν προσωρινό δείκτη μέσα στη συνάρτηση, όπως έκανες και με τον dummy. Και να προνοήσεις ώστε να είναι πάντα ένα βήμα πίσω από τον dummy κατά την εκτέλεση του loop.

Άσχετο, το: (*list).head που έχεις γράψει είναι σωστό! :) (μπορείς να το γράψεις και: list->head για πιο ευανάγνωστο κώδικα)

Λύση δεν θα δώσω ακόμα για τη διαγραφή, αφενός γιατί έχω δώσω ήδη πολύ έτοιμο κώδικα στα tutorials (ακόμα κι αυτό που λέω για τον prev παραπάνω, έχω παρουσιάσει ήδη παραπλήσιας λογικής κώδικα, π.χ. στην list_destroy() ) κι αφετέρου διότι αυτά τα πράγματα τα μαθαίνει κανείς μόνο αν γράψει κώδικα μόνος του και πειραματιστεί.

Όσα έχουμε αναλύσει ήδη στα tutorials είναι υπερ-αρκετά για να γραφτεί η συνάρτηση: list_del1st( List *list, int value)... αρκεί να έχουν γίνει όντως κατανοητά ;) Είναι μάλιστα από τις βασικές συναρτήσεις στις συνδεδεμένες λίστες.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό stamatiou » 21 Ιούλ 2011, 21:13

migf1 έγραψε:
stamatiou έγραψε:
[snip]
Ελπίζω επειδή δεν μπορώ να λύσω την άσκηση να μην χρειάζεται να ξαναδιαβάσω structs και pointers από την αρχή :!: :crazy: :crazy: :crazy: :crazy:

:lol: :lol: :lol:

Μάλλον θα χρειαστεί να τα ξαναδιαβάσεις. Αν όχι από την αρχή, τουλάχιστον να τα φρεσκάρεις.

To dummy->prev δεν υπάρχει, δεν δουλεύει αυτό (δεν υπάρχει πεδίο prev μέσα στον Node). Όταν σου είπα να χρησιμοποιήσεις έναν βοηθητικό δείκτη prev εννοούσα να ορίσεις έναν προσωρινό δείκτη μέσα στη συνάρτηση, όπως έκανες και με τον dummy. Και να προνοήσεις ώστε να είναι πάντα ένα βήμα πίσω από τον dummy κατά την εκτέλεση του loop.

Άσχετο, το: (*list).head που έχεις γράψει είναι σωστό! :) (μπορείς να το γράψεις και: list->head για πιο ευανάγνωστο κώδικα)

Λύση δεν θα δώσω ακόμα για τη διαγραφή, αφενός γιατί έχω δώσω ήδη πολύ έτοιμο κώδικα στα tutorials (ακόμα κι αυτό που λέω για τον prev παραπάνω, έχω παρουσιάσει ήδη παραπλήσιας λογικής κώδικα, π.χ. στην list_destroy() ) κι αφετέρου διότι αυτά τα πράγματα τα μαθαίνει κανείς μόνο αν γράψει κώδικα μόνος του και πειραματιστεί.

Όσα έχουμε αναλύσει ήδη στα tutorials είναι υπερ-αρκετά για να γραφτεί η συνάρτηση: list_del1st( List *list, int value)... αρκεί να έχουν γίνει όντως κατανοητά ;) Είναι μάλιστα από τις βασικές συναρτήσεις στις συνδεδεμένες λίστες.

Δεν ξέρω αν έχει σημασία λλά το 6ο μέρος δεν το έχω διαβάσει ακόμα...
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 21 Ιούλ 2011, 21:59

Όχι, δεν χρειάζεται το 6ο μέρος. Βασικά αυτό που χρειάζεται είναι να μη βιαστείς και να μην υποτιμήσεις τη συνάρτηση. Κάτσε κάποια στιγμή που θα έχεις χρόνο και καθαρό μυαλό, πάρε από δίπλα κι ένα τετραδιάκι και σχεδίασε τη λίστα σου για να δεις τι ακριβώς πρέπει να κάνεις για να διαγράψεις έναν κόμβο από τη μέση της.

Π.χ. κάτι σαν αυτό εδώ
Εικόνα

ή αν μιλάμε για τις δομές του 5ου και του 6ου μέρους, τότε κάτι σαν αυτό εδώ:
Εικόνα

Αν δυσκολεύεσαι πολύ, τότε σε αυτό εδώ το link μπορείς να διαβάσεις πλήρη ανάλυση του αλγορίθμου της συνάρτησης που συζητάμε, συμπεριλαμβανομένου και του hint που σου έδωσα να διαχειριστείς ξεχωριστά την περίπτωση που ο προς διαγραφή κόμβος είναι ο 1ος της λίστας.

Σου δίνει και κώδικα σε Java και C++, προσπάθησε τουλάχιστον να τον προσαρμόσεις στα ονόματα και τις δομές που έχουμε αναλύσει στα tutorials (κατά προτίμηση του 5ου μέρους).

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

Στον δικό μου κώδικα θα τα κάνουμε όλα σε μια συνάρτηση ;)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό stamatiou » 21 Ιούλ 2011, 22:59

Δεν ξέρω αν είναι σωστό το παρακάτω αλλά μου βγάζει κάτι errors και δεν ξέρω γιατί.
Ο κώδικας είναι:
Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
struct node *next;
int value;
}Node;

typedef struct list
{
Node *head,*tail;
int len;
}List;

int terminator(List *list,int value)
{
Node *dummy,*bdummy;

dummy = (*list).head;
if((*list)->head->value == value)
{
dummy = (*list)->head->next;
free(dummy);
list->head = dummy;
}else
{
bdummy = (*list)->head;
dummy = (*list)->head->next;
while(dummy->next != NULL)
{
if(dummy->value == value)
{
if(dummy!=(*list)->tail)
{
bdummy->next = dummy->next;
free(dummy);
}else
{
tail = bdummy;
free(dummy);
}
}
}
}
return 0;
}

και τα errors:
Κώδικας: Επιλογή όλων

delete_node_with_value_x.c: In function ‘terminator’:
delete_node_with_value_x.c:21:12: error: invalid type argument of ‘->’ (have ‘List’)
delete_node_with_value_x.c:23:18: error: invalid type argument of ‘->’ (have ‘List’)
delete_node_with_value_x.c:28:19: error: invalid type argument of ‘->’ (have ‘List’)
delete_node_with_value_x.c:29:19: error: invalid type argument of ‘->’ (have ‘List’)
delete_node_with_value_x.c:34:22: error: invalid type argument of ‘->’ (have ‘List’)
delete_node_with_value_x.c:40:6: error: ‘tail’ undeclared (first use in this function)
delete_node_with_value_x.c:40:6: note: each undeclared identifier is reported only once for each function it appears in

Αφού είναι pointer το list και το περνώ by reference γιατί βαράει αυτός ο compiler!
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 21 Ιούλ 2011, 23:23

Για τον αλγόριθμο, είμαι πολύ πτώμα τώρα για να τον δω. Για το error όμως χτυπάει γιατί ή πρέπει να γράψεις: (*list).head ή list->head... το (*list)->head που γράφεις τώρα είναι λάθος, αυτό σου λέει ο compiler.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό stamatiou » 21 Ιούλ 2011, 23:26

migf1 έγραψε:Για τον αλγόριθμο, είμαι πολύ πτώμα τώρα για να τον δω. Για το error όμως χτυπάει γιατί ή πρέπει να γράψεις: (*list).head ή list->head... το (*list)->head που γράφεις τώρα είναι λάθος, αυτό σου λέει ο compiler.

Μόλις το ξανάκανα compile και μου το έβγαλε σωστό! Μα καλά έχει τρελεθεί ο gcc και ο cc;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 21 Ιούλ 2011, 23:35

Δεν μπορώ να ξέρω τι ακριβώς κάνεις, αλλά το σίγουρο είναι πως το: (*list)-> είναι λάθος στην προκειμένη περίπτωση και δεν περνάει από το compilation με τίποτα.

Ή θα γράψεις: (*list). ή list->

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

dummy = (*list).head;
if((*list)->head->value == value)
{


Αν λοιπόν η λίστα είναι κενή, το list->head ισούται με NULL, άρα η συνθήκη μέσα στο if θα βαρέσει segmentation fault διότι...
list->NULL->value !!! BOOOM !!!
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό stamatiou » 21 Ιούλ 2011, 23:57

migf1 έγραψε:Δεν μπορώ να ξέρω τι ακριβώς κάνεις, αλλά το σίγουρο είναι πως το: (*list)-> είναι λάθος στην προκειμένη περίπτωση και δεν περνάει από το compilation με τίποτα.

Ή θα γράψεις: (*list). ή list->

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

dummy = (*list).head;
if((*list)->head->value == value)
{


Αν λοιπόν η λίστα είναι κενή, το list->head ισούται με NULL, άρα η συνθήκη μέσα στο if θα βαρέσει segmentation fault διότι...
list->NULL->value !!! BOOOM !!!

Οκ, νομίζω πως διώρθωσα μερικά. Πειράζει που θα το βάλω στο codepad; Απλά επειδή είναι μεγάλος ο κώδικας και δεν είναι εύκολο να διαβαστεί με το code tag.
http://codepad.org/7WBKEEzE Πάντως δεν μπορείς να πεις το όνομα είναι πολύ ωραίο! :lol: :lol:
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 22 Ιούλ 2011, 00:07

terminator... :lol: :lol: :lol:

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

Προφανώς δεν τον έγραψα τώρα, τον είχα ήδη γραμμένο :)

Ο προσωρινός δείκτης curr δείχνει στον τρέχων κόμβο κι ο προσωρινός δείκτης next δείχνει στον επόμενο (μην τον μπερδέψεις με τον εσωτερικό δείκτη next που βρίσκεται στο Node ως πεδίο του). Αντί δηλαδή να έχω dummy και prev, έχω curr και next.

Δεν τον βάζω ακόμα στο νήμα των tutorials, θα τον συμπεριλάβω όταν γράψω το 7ο μέρος.

http://codepad.org/56PbnZQP

ΥΓ. Στις επόμενες ασκήσεις δεν θα σας δώσω κώδικα παίδες, να γράψετε κι εσείς τίποτα που να τρέχει σωστά :)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό stamatiou » 22 Ιούλ 2011, 00:08

Οκ θα το τσεκάρω. Επίσης τι είναι hash table; Στο tutorial έχεις ένα λινκ στην wikipedia αλλά δεν κατάλαβα τίποτα. Επίσης πού υπάρχει κάνα tutorial για arrays από linked lists;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι