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

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

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

Δημοσίευσηαπό Garrus » 22 Απρ 2011, 14:56

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


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

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

typedef struct node{
int x,y; //coordinates
struct node * next; // for list manipulation
struct node * parent; //parent node
} node;

και κατασκευαζονται απο:

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


node * makenode(int x, int y){ //args = coordinates
node * n;
n=(node *)malloc(sizeof(node));
n->x=x; n->y=y;
n->parent=NULL; n->next=NULL; //all pointers initialized to NULL
return n;

}


και εισερχονται σε μια λιστα με:

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



void enlist(node * n, list * L){
if(isempty(L)){

L->head = n; // list head element
L->len ++; //list size
L->head->next = NULL;
}
else{
n->next = L->head;
L->head = n;
L->len++;

}
}



what's wrong?
1 Γνώσεις Linux: Ελπίζω τουλ. μέτρια ┃ Προγραμματισμού: Καλή ┃ Αγγλικών: Very best englands
2 Ubuntu 15.10 wily 64bit (en_US.UTF-8),
3 Intel Core i5-3210M CPU @ 2.50GHz ‖ RAM 3843 MiB ‖ SAMSUNG ELECTRONICS CO., LTD. NP350E5C-S03GR [...]
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] (rev 09) ⋮ [AMD/ATI] Thames [Radeon HD 7500M/7600M Series] [1002:6840] (rev ff)
5 enp2s0: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 09) ⋮ wlp3s0: Qualcomm Atheros AR9485 Wireless Network Adapter [168c:0032] (rev 01)
Garrus
punkTUX
punkTUX
 
Δημοσιεύσεις: 179
Εγγραφή: 26 Ιαν 2011, 03:23
Εκτύπωση

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

Δημοσίευσηαπό linuxs » 31 Μάιος 2011, 19:16

Λοιπόν, το next είναι ένα πεδίο στο struct σου σωστά? Στην συνθήκη όμως το χρησιμοποιείς ως:
Κώδικας: Επιλογή όλων
p->next

ενώ το έχεις ορίσει ως "node"! Αυτό έχει ως αποτέλεσμα να μην γίνεται ποτέ null...
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 21 Ιουν 2011, 03:59

linuxs έγραψε:Λοιπόν, το next είναι ένα πεδίο στο struct σου σωστά? Στην συνθήκη όμως το χρησιμοποιείς ως:
Κώδικας: Επιλογή όλων
p->next

ενώ το έχεις ορίσει ως "node"! Αυτό έχει ως αποτέλεσμα να μην γίνεται ποτέ null...


βασικα αν καταλαβα καλα εκεινο που θελει να κανει ειναι να βρει
που ακριβως ο δείκτης p->next γίνεται NULL. Εκει που γινεται NULL
τελειώνει και η λίστα. Απλα δεν διατρέχει σωστα τους κομβους νομιζω
Πολυ βολικο οταν εργαζεσαι με λίστες , στοίβες ουρές και άλλες δομές δεδομένων
ειναι να χεις δίπλα σου τον ψευδοκώδικα διοτι θα χαθείς μεσα στους δείκτες.

ας κοιταξει και εδω
http://students.ceid.upatras.gr/~perisi ... /index.htm
Γνώσεις ⇛ 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: Συνδεδεμενες λιστες και ελεγχος τελευταιου στοιχειου

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

Αχ, πόσες φορές χάθηκα εγώ...αλλα βρήκα της "έξοδο" ;) ...απλά παράτησα το πρόγραμμα :}
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 21 Ιουν 2011, 16:05

linuxs έγραψε:Αχ, πόσες φορές χάθηκα εγώ...αλλα βρήκα της "έξοδο" ;) ...απλά παράτησα το πρόγραμμα :}


hahahahahhahaha !! Α ετσι ε???? χαχαχαχχα
Γνώσεις ⇛ 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: Συνδεδεμενες λιστες και ελεγχος τελευταιου στοιχειου

Δημοσίευσηαπό Star_Light » 21 Ιουν 2011, 16:26

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

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

Κώδικας: Επιλογή όλων
1.#include <stdlib.h>
2.#include <stdio.h>


3.struct s_list {
4.int val;
5.struct s_list *next;
6.};

7.main()
8.{
9.struct s_list *head, *p; /* OI deiktes deixnoun se tipous dedomenwn domis */
10.int n;

11.head = NULL; /*metavliti deikti head (to onoma tis metavlitis pou dilwnetai) */
/* NULL einai mia eidiki timi pou dilwnetai otan enas deiktis deixnei se mi egkuri dieuthinsi */

12.{
13.p = (struct s_list *)malloc(sizeof(struct s_list)); /*Vima 1o*/
14.p->val = n; /*Vima 1o*/
15.p->next = head;/*Vima 2o deixnontas stin idia thesi mnimis */
16.head = p; /* Vima 3o */
17.}



18.return 0;
19.}


στην γραμμη 15 ρε παιδι μου οκ με αυτη την εντολη η κεφαλη και ο νεος κομβος δειχνουν στο ιδιο σημειο
Γιατι ομως???? θελω να πω πρωτα δεν υποτιθεται πως πρεπει να δωσεις τιμες- διευθυνσεις σε 2 μεταβλητες δεικτων ωστε
μετα αν τους βαλεις σε μια ισοτητα πλεον θα δειχνουν στην ιδια θεση μνημης? ΕΔω δεν το βλεπω να γινεται. Η γινεται με πολυ συμπαγη τροπο.
Γνώσεις ⇛ 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: Συνδεδεμενες λιστες και ελεγχος τελευταιου στοιχειου

Δημοσίευσηαπό linuxs » 21 Ιουν 2011, 19:41

το πρέπει γιατί το λες? το ίδιο δεν είναι? είτε δώσεις τιμές πρώτα είτε τις δώσεις μετά....
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

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

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

Linus ενω εκανα καποιες τροποποιησεις στον κωδικα.

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


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

struct s_list {
int data;
struct s_list *next;
};


int main()
{
struct s_list *head, *p; /* OI deiktes deixnoun se tipous dedomenwn domis */
int n;
printf("Dwste ta data: ");
scanf("%d",&p->data);
head = NULL; /*metavliti deikti head (to onoma tis metavlitis pou dilwnetai) */
/* NULL einai mia eidiki timi pou dilwnetai otan enas deiktis deixnei se mi egkuri dieuthinsi */
for(p=head; p; p=p->next)
{
p = (struct s_list *)malloc(sizeof(struct s_list)); /*Vima 1o*/
p->data = n; /*Vima 1o*/
p->next = head;/*Vima 2o deixnontas stin idia thesi mnimis */
head = p; /* Vima 3o */
}
for(p=head; p; p=p->next)
{
printf("%d ->" , p->data);
}



return 0;
}



Γιατι ενω μου βγαζει να δωσω τα Data... Μετα δεν μου εμφανιζει κατι???? Παρα μου βγαζει ενα Segmentation fault? :/
Γνώσεις ⇛ 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: Συνδεδεμενες λιστες και ελεγχος τελευταιου στοιχειου

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

Star_Light έγραψε:Linus ενω εκανα καποιες τροποποιησεις στον κωδικα.

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


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

struct s_list {
int data;
struct s_list *next;
};


int main()
{
struct s_list *head, *p; /* OI deiktes deixnoun se tipous dedomenwn domis */
int n;
printf("Dwste ta data: ");
scanf("%d",&p->data);
head = NULL; /*metavliti deikti head (to onoma tis metavlitis pou dilwnetai) */
/* NULL einai mia eidiki timi pou dilwnetai otan enas deiktis deixnei se mi egkuri dieuthinsi */
for(p=head; p; p=p->next)
{
p = (struct s_list *)malloc(sizeof(struct s_list)); /*Vima 1o*/
p->data = n; /*Vima 1o*/
p->next = head;/*Vima 2o deixnontas stin idia thesi mnimis */
head = p; /* Vima 3o */
}
for(p=head; p; p=p->next)
{
printf("%d ->" , p->data);
}



return 0;
}



Γιατι ενω μου βγαζει να δωσω τα Data... Μετα δεν μου εμφανιζει κατι???? Παρα μου βγαζει ενα Segmentation fault? :/


δεν έχω Linux αυτή τη στιγμή. Προσπάθησε να κάνεις debag στην χειρότερη περίπτωση με printf...δες που ακριβώς κολλάει. :/
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

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

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

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

Επόμενο

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