Συνδεδεμενες λιστες και ελεγχος τελευταιου στοιχειου

...ασύγχρονα μαθήματα γλώσσας C

Re: Συνδεδεμενες λιστες και ελεγχος τελευταιου στοιχειου

Δημοσίευσηαπό migf1 » 22 Ιουν 2011, 00:23

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

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

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

typedef enum { FALSE=0, TRUE } Bool;

typedef struct node {
int data;
struct node *next;
} List;

/* ------------------------------------------------------------------
* Insert 'data' as Last node of 'list'
*/
Bool list_insert( List **list, int data )
{
List *head = NULL, *dummy = NULL;
List *new = calloc(1, sizeof(struct node) );
if ( !new )
return FALSE;

new->data = data;
new->next = NULL;

if ( !*list ) {
*list = new;
return TRUE;
}

head = dummy = *list;
while ( head ) {
dummy = head;
head = head->next;
}
dummy->next = new;

return TRUE;
}

/* ------------------------------------------------------------------
* Print 'list' contents
*/
void list_print( List *list )
{
if ( !list )
return;

while ( list ) {
printf("%d ", list->data );
list = list->next;
}

return;
}
/* ------------------------------------------------------------------
* Free memory reserved for 'list'
*/
void list_destroy( List **list )
{
if ( !*list )
return;

List *dummy = NULL;
while ( *list ) {
dummy = *list;
*list = (*list)->next;
free( dummy );
}

return;
}

/* ------------------------------------------------------------------
*
*/
int main( void )
{
register int i=0;
List *list = NULL;


for (i=19; i>9; i--)
list_insert( &list, i);

list_print( list );
list_destroy( &list );

fflush(stdin); getchar();
exit(0);
}

Τελευταία επεξεργασία από migf1 και 22 Ιουν 2011, 00:38, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Συνδεδεμενες λιστες και ελεγχος τελευταιου στοιχειου

Δημοσίευσηαπό migf1 » 22 Ιουν 2011, 00:34

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

Re: Συνδεδεμενες λιστες και ελεγχος τελευταιου στοιχειου

Δημοσίευσηαπό migf1 » 22 Ιουν 2011, 10:27

θα μπορούσες να γίνεις λίγο πιο επεξηγηματικός στην απορία που εκφράζεις. Δεν καταλαβαίνω τι ακριβώς ρωτάς.

Star_Light έγραψε:εγω δεν μπορω να καταλαβω το εξης παντως 100%

εστω ο κωδικας

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

[snip]
15.p->next = head;/*Vima 2o deixnontas stin idia thesi mnimis */
[snip]


στην γραμμη 15 ρε παιδι μου οκ με αυτη την εντολη η κεφαλη και ο νεος κομβος δειχνουν στο ιδιο σημειο
Γιατι ομως???? θελω να πω πρωτα δεν υποτιθεται πως πρεπει να δωσεις τιμες- διευθυνσεις σε 2 μεταβλητες δεικτων ωστε
μετα αν τους βαλεις σε μια ισοτητα πλεον θα δειχνουν στην ιδια θεση μνημης? ΕΔω δεν το βλεπω να γινεται. Η γινεται με πολυ συμπαγη τροπο.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Συνδεδεμενες λιστες και ελεγχος τελευταιου στοιχειου

Δημοσίευσηαπό migf1 » 22 Ιουν 2011, 10:47

Όχι δεν είναι το ίδιο!

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

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

Re: Συνδεδεμενες λιστες και ελεγχος τελευταιου στοιχειου

Δημοσίευσηαπό migf1 » 22 Ιουν 2011, 11:06

Αν δεν δούμε ολοκληρωμένο τον κώδικα των συναρτήσεων, καθώς και τον τρόπο με τον οποίο τις διαχειρίζεσαι στο πρόγραμμά σου είναι πολύ δύσκολο να βγάλουμε άκρη. Αυτό το while-loop που παραθέτεις πάντως είναι τελείως... ξέμπαρκο (δεν ξέρουμε καν τι τιμές περιέχουν τα L και head σε εκείνο το σημείο).

Σίγουρα πάντως αν τρέξεις αυτόν τον κώδικα όταν είτε L == NULL (οπότε κρασάρει το: L->head) είτε όταν head == NULL (οπότε κρασάρει το: p->next στη συνθήκη του while ) έχεις πρόβλημα!

Garrus έγραψε:Εχω μια δομη απο nodes,και μια λιστα απο nodes, και θελω να ελεγξω ποτε τελειωνει η λιστα.
Το κανω με ελεγχο για while( node->next!=NULL) και καταληγω σε ατερμονο βροχο.
Κώδικας: Επιλογή όλων


node * p;
p=L->head;
while(p->next!=NULL){
//search and do stuff
p=p->next;
}

[snip]

what's wrong?
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Συνδεδεμενες λιστες και ελεγχος τελευταιου στοιχειου

Δημοσίευσηαπό Star_Light » 22 Ιουν 2011, 13:29

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

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

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

typedef enum { FALSE=0, TRUE } Bool;

typedef struct node {
int data;
struct node *next;
} List;

/* ------------------------------------------------------------------
* Insert 'data' as Last node of 'list'
*/
Bool list_insert( List **list, int data )
{
List *head = NULL, *dummy = NULL;
List *new = calloc(1, sizeof(struct node) );
if ( !new )
return FALSE;

new->data = data;
new->next = NULL;

if ( !*list ) {
*list = new;
return TRUE;
}

head = dummy = *list;
while ( head ) {
dummy = head;
head = head->next;
}
dummy->next = new;

return TRUE;
}

/* ------------------------------------------------------------------
* Print 'list' contents
*/
void list_print( List *list )
{
if ( !list )
return;

while ( list ) {
printf("%d ", list->data );
list = list->next;
}

return;
}
/* ------------------------------------------------------------------
* Free memory reserved for 'list'
*/
void list_destroy( List **list )
{
if ( !*list )
return;

List *dummy = NULL;
while ( *list ) {
dummy = *list;
*list = (*list)->next;
free( dummy );
}

return;
}

/* ------------------------------------------------------------------
*
*/
int main( void )
{
register int i=0;
List *list = NULL;


for (i=19; i>9; i--)
list_insert( &list, i);

list_print( list );
list_destroy( &list );

fflush(stdin); getchar();
exit(0);
}



πολυ καλος κωδικας. Εσυ τον εφτιαξες??? Θα τον κοιταξω. Και θα σου πω.
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Συνδεδεμενες λιστες και ελεγχος τελευταιου στοιχειου

Δημοσίευσηαπό migf1 » 22 Ιουν 2011, 13:47

Ναι, εγώ τον έφτιαξα... έχω προσωπική βιβλιοθήκη συναρτήσεων στη C για διάφορα πράγματα (strings, lists, stacks, queues, κλπ). Οκ ρίξε του μια ματιά και πες μου.

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

Re: Συνδεδεμενες λιστες και ελεγχος τελευταιου στοιχειου

Δημοσίευσηαπό simosx » 22 Ιουν 2011, 14:04

migf1 έγραψε:
ΥΓ. Αν ενδιαφέρει το φόρουμ μπορώ να σας δώσω και κώδικα π.χ. για ταξινομημένη εισαγωγή κόμβων στη λίστα (είτε σε αύξουσα είτε σε φθίνουσα σειρά). Ή για παράδειγμα, στο νήμα με το παιχνίδι της Ξερής έχω γράψει στο αρχείο: stack.c τις βασικές συναρτήσεις για τη διαχείριση στοίβας.


Μπορείς να το κάνεις όταν είσαι έτοιμος να χρησιμοποιήσεις κάποιο αποθετήριο πηγαίου κώδικα.
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Συνδεδεμενες λιστες και ελεγχος τελευταιου στοιχειου

Δημοσίευσηαπό migf1 » 22 Ιουν 2011, 14:21

Χεχε, είναι προ-απαιτούμενο δηλαδή;

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

simosx έγραψε:
migf1 έγραψε:
ΥΓ. Αν ενδιαφέρει το φόρουμ μπορώ να σας δώσω και κώδικα π.χ. για ταξινομημένη εισαγωγή κόμβων στη λίστα (είτε σε αύξουσα είτε σε φθίνουσα σειρά). Ή για παράδειγμα, στο νήμα με το παιχνίδι της Ξερής έχω γράψει στο αρχείο: stack.c τις βασικές συναρτήσεις για τη διαχείριση στοίβας.


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

Re: Συνδεδεμενες λιστες και ελεγχος τελευταιου στοιχειου

Δημοσίευσηαπό Star_Light » 22 Ιουν 2011, 15:04

migf1 έγραψε:Χεχε, είναι προ-απαιτούμενο δηλαδή;

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

simosx έγραψε:
migf1 έγραψε:
ΥΓ. Αν ενδιαφέρει το φόρουμ μπορώ να σας δώσω και κώδικα π.χ. για ταξινομημένη εισαγωγή κόμβων στη λίστα (είτε σε αύξουσα είτε σε φθίνουσα σειρά). Ή για παράδειγμα, στο νήμα με το παιχνίδι της Ξερής έχω γράψει στο αρχείο: stack.c τις βασικές συναρτήσεις για τη διαχείριση στοίβας.


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


Κοιτα πανω κατω το ιδιο ειναι. Ειτε το βαλεις εδω ειτε σε καποιο απωθετηριο.... εχω βαλει σχολια στον κωδικα πιο πολυ για να τον καταλαβω εγω και θα τον ανεβασω εδω. Σιμο ξαναπες πως τον βαζω στο αποθετηριο που ειχες φτιαξει γιατι εχω χαθει - ξεχαστει .

Π.Σ Συγχαρητηρια παντως για τον κωδικα migf1 ειναι τρομερος.
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

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

Επιστροφή στο Μαθήματα C