Δημοσιεύτηκε: 22 Ιουν 2011, 16:50
από Star_Light
ΛΟιπον εγω εκατσα και διαβασα τον κωδικα σου και εχω βαλει τα σχολια. Απλα σε καποια φαση οπως ειπες και παραπανω χρησιμοποιεις μεσα στην συναρτηση σαν ορισμα εναν δεικτη απο δεικτες **list αυτο νομιζω οτι το κανεις πιο πολυ για να διαγράψεις εναν κομβο. Επειδη οταν διαγραφουμε εναν κομβο απλα κανουμε τον δεικτη να δειχνει στον επομενο του επομενου και αφαιρουμε τον επομενο. A->B->C : B: next C : ο επομενος του τρεχοντα επομενου next->C.next οποτε εφοσον ο next ειναι ηδη δείκτης ουσιαστικα κανεις αυτο το κολπο επειδη παλι θες να δειξεις σε εναν δεικτη. Α->C Σε κατανοησα σωστα? Eπισης σε καποια σημεια χρησιμοποιεις και καποιον δεικτη ενδιαμεσα για να μην χασεις την τιμη ?

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

typedef enum { FALSE=0, TRUE } Bool; /*Orizetai metavliti tipou enwsis Bool h aparithmisi
ksekinaei apo to FALSE=0 opote kai to TRUE einai 1*/

typedef struct node {
int data; /*Ta dedomena tou komvou */
struct node *next; /*O deiktis pros ton epomeno komvo */
} 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; /* H calloc apetuxe */

new->data = data; /* O 1os komvos */
new->next = NULL; /* O epomenos deiktis einai NULL (mexri na dimiourgi8ei kainourgios komvos) */

if ( !*list ) { /*An o deiktis listas dn dinei egkuri dieuthinsi */
*list = new; /* 8ese ton list na deixnei ston new */
return TRUE; /* epestrepse TRUE */
}

head = dummy = *list;
while ( head ) {
dummy = head;
head = head->next; /* O HEAD deixnei ston A px kai o new pou prokeitai na bei ston A? */
}
dummy->next = new;

return TRUE;
}

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

while ( list ) { /* Oso o deiktis dinei mi mideniki timi */
printf("%d ", list->data ); /* Ektupwse ta data tou komvou */
list = list->next; /* Pleon o deiktis deixnei ston epomeno komvo */
}

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

List *dummy = NULL;
while ( *list ) {
dummy = *list; /* Estw A=B kai B=C free(A) opote menei B=C */
*list = (*list)->next; /*Thetw ton deikti na deixnei ston amesws epomeno (C) gia diagrafi tis listas */
free( dummy ); /*Apodesmeusi mnimis gia dummy <=> o dummy diagrafetai */
}

return;
}

/* ------------------------------------------------------------------
*
*/
int main( void )
{
register int i=0; /* DHlwsi i san kataxwriti gia taxutita ston kwdika */
List *list = NULL; /* Dilwsi deikti tupou Listas me timi NULL */


for (i=19; i>9; i--) /* 10 ektupwseis komvwn */
list_insert( &list, i); /* Kaleitai h sunartisi list_insert */

list_print( list ); /* Klhsh tis list_print me orisma list epeidi eine aplos deiktis */
list_destroy( &list ); /* Klhsh tis list_destroy me orisma &list epeidi einai deiktis apo deiktes */

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


σΤΑ ΣΗμεια που δεν εχω βαλει σχολια σε εχω χασει λιγο αλλα θα τα ξανακοιταξω πριν σε ρωτησω.