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

Αρχειοθετημένο

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

  • 0
takis_tz

huffman σε C

Ερώτηση

ψαχνω για υλοποιηση της κωδικοποίησης Huffman σε κώδικα C. Έχει κανείς καμιά ιδέα για το που μπορώ να δω ανάλογους κώδικες; Έψαξα στο google αλλά δεν είδα κάτι σχετικό με αυτό που ψάχνω. Περιληπτικά αυτό που θέλω είναι ένα πρόγραμμα σε C, που θα κάνει τα πιο κάτω:

1-υπολογισμός πιθανοτήτων

2-δημιουργία δένδρου Huffman

3-κωδικοποίηση αρχείου

4-αποκωδικοποίηση αρχείου

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

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

Ναι φίλε μου και τώρα πιστεύεις ότι κατάλαβε;

Τον κώδικα το έχει "ταράξει τα typedef. Αντί να βάλει char, βάζει BYTE, αντι για FILE* βάζει USER_STREAM*. Μόνο το int του ¨ξέφυγε" και το άφησε το ίδιο.

 

UserStreamReadByte είναι η fgetc

MapGetPattern είναι πίνακας χαρακτήρων που περιέχει τους κωδικούς huffman

MapGetPatternCount είναι το μήκος του κάθε κωδικού (χάθηκε η strlen?)

UserStreamEOS είναι EOF.

 

Τι απέδειξα? Τιποτα

Τι απέδειξε ο bilco? Τίποτα?

Τι κέρδισα? Τίποτα, γιατί τον κώδικα τον καταλαβαίνω, αλλά την φιλοσοφία του όχι. Εχω κάπου 15 εκδόσεις του huffman σε C, αλλά δεν μπορώ να μπω στο νόημα. Μπορώ να κάνω μια "προσαρμογή" γα να φτιάξω τον κώδικα που χρειάζομαι αλλά αυτό δεν μου αρκει. Θέλω να καταλαβαίνω τι κάνω.

 

 

 

Τέλος πάντων, για να μην φανώ και αχάριστος, να ευχαριστήσω τον bilco.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
Το πρώτο αφορά έναν ακέραιο με τιμή 1 σε γκάμα -32768 έως +32768 ενώ το δεύτερο αφορά ένα θετικό ακέραιο αριθμό δηλαδή από 0 έως 32768.

Μήπως εννοείς από 0 έως 65536 ?

 

Δηλαδή, αν καταλαβαίνω, αν θεωρήσουμε οτι ο τύπος int είναι 4 byte (δηλαδή 32 bits), τότε οι 32άδες για το int i = 1; και unsigned int i = 1; είναι διαφορετικές?

 

Επίσης, εννοείς οτι δεν μπορούμε να γράψουμε unsigned int i = -1; σωστά?

 

Επόμενη ερώτηση:

 

#define GET_BIT(byte,at) (byte&(1<<at)?1:0)

 

#define SET_BIT(byte,at) (byte|=(1<<at))

 

Στα παραπάνω, τα byte και at τι τύπο έχουν, int, char ή δεν έχει σημασία? Μήπως ο τυπος οριζεται αργότερα στον κώδικα? Τι παιζει?

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Αυτό που λες αφορά την συνάρτηση uncompress που αποσυμπιέζει τον κώδικα με τα bits στα αντίστοιχα γράμματα, αυτό γίνεται ως εξής:

 

Κατασκεύαζοντας το huffman tree με τα γράμματα σύμβολα μαζί με τις συχνότητες τους να βρίσκονται πάντα σαν κόμβοι φύλλα στο δέντρο, τότε με βάση τον κανόνα που λέει ότι όποτε πάμε αριστερά βάζουμε μηδέν και όποτε πάμε δεξιά βάζουμε 1, παίρνουμε την ακολουθία μας και ξεκινόντας από το πρώτο bit συνεχίζουμε μέχρι να σταματήσουμε σε κόμβο φύλλο. Αν λοιπόν σταματήσουμε επιστρέφουμε το γράμμα που υπάρχει στον κόμβο φύλλο. Έτσι σχηματίζουμε την λέξη που παριστάνουν τα bits. Τώρα τι ακριβώς θέλεις γίνε λίγο περισσότερο ακριβής.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

 

PS: To να φτιάξεις αυτό το πρόγραμμα είναι αρκετά επίπονη διαδικασία, θέλει υψηλή προγραμματιστική ικανότητα και να υλοποιήσεις βασικές δομές όπως τα δυαδικά δέντρα, συναρτήσεις που να δημιουργούν, να καταστρέφουν, να κάνουν ευθύ και αντίστροφο traverse στο δέντρο, εισαγωγή κόμβου, κτλ, επίσης θα πρέπει να παίξουμε με τα bits δηλαδή να φτιάξουμε συναρτήσεις που να παίζουν με bits, πχ XOR, και ίσως και ουρές προτεραιότητας για τις συγχωνεύσεις. Δύσκολα τα πράγματα, σίγουρα δεν σας έχει δώσει κάποια άλλη πορεία;

Επειδή το θέμα ενδιαφέρει κι εμένα θα ήθελα κάποιες κατευθύνσεις

 

Εχω ένα αλφάβητο 7 χαρακτήρων και τους αντίστοιχους κωδικούς huffman όπως φαίνεται στον παρακάτω πίνακα.

 

Χαρακτήρας Κωδικός Huffman

a 00

b 0100

c 0101

d 011

e 10

f 110

g 111

 

Σύμφωνα με τους κωδικούς αυτούς, η λέξη bag κωδικοποιείται ως 010000111 (υποτίθεται οτι είναι ακολουθία από bits). Μια ιδέα που μου περνά από το μυαλό είναι να θεωρήσω οτι είναι ακολουθία χαρακτήρων (δηλαδή έχω 9 χαρακτήρες, δηλ 72bits) και από κάθε χαρακτήρα θέλω να "κρατήσω" μόνο ένα bit.

 

Η βασική μου ερώτηση είναι, πως θα χειριστούμε την παραπάνω ακολουθία;

Θεωρούμε οτι η ακολουθία αυτή είναι αποθηκευμένη σε αρχείο. Σε βιβλία έχω διαβάσει για masks , τελεστές bit κλπ, αλλά επειδή 1η φορά ασχολούμαι με χειρισμό bits, δεν ξέρω τι απ'ολα αυτά χρειάζομαι.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Τρόπος υπολογισμού της συχνότητας των γραμμάτων σε ένα κείμενο που δίνεται από τον χρήστη στη είσοδο:

 

>
TurboC++ with CodeGuard
Borland

 

 

>
//---------------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//---------------------------------------------------------------------------

/* Get a Text Buffer. */
char *GetBuffer(int TextSz)
{
char *BufText = NULL;
char *Getz = NULL;
BufText = malloc(TextSz * sizeof(char));
if(BufText)
{
	printf("Enter the text:\n");
	Getz = fgets(BufText, TextSz, stdin);
	if(Getz)
	{
		BufText[strlen(BufText)-1] = '\0';
		return BufText;
	}
	else
	{
		printf("ErrorReporter:Error during Reading Process.\n");
		return NULL;
	}
}
else
{
	printf("ErrorReporter:Error during Memory Access.\n");
	return NULL;
}
}

int GetBufferAlt(char **BufferText, int TextSz)
{
char *BuffText = malloc(TextSz * sizeof(char));
if(BuffText)
{
	printf("Enter the text:\n");
	fgets(BuffText, TextSz, stdin);
	BuffText[strlen(BuffText)-1] = '\0';
	*BufferText = BuffText;
	return 0;
}
else
{
	printf("ErrorReporter:Error during Memory Access.\n");
	return -1;
}
}
/* Store the Frequences of Each Character in Text. */
int* CountFreq(char *Text)
{
int i;
int TextSz = strlen(Text);
int *Freq = calloc(TextSz,sizeof(int));
if(Freq)
{
	for(i = 0; i < TextSz; i++)
		Freq[Text[i]]++;
	return Freq;
}
else
{
	printf("ErrorReporter:Error during Memory Access.\n");
	return NULL;
}
}
int main(int argc, char* argv[])
{
unsigned int i;
int *Fr = NULL;
char *Text = NULL;
Text = GetBuffer(1024);
Fr = CountFreq(Text);
for(i = 0; i < strlen(Text); i++)
	printf("Letter %c: Frequency in Text: %d\n", Text[i], Fr[Text[i]]);
printf("\n");
/* Free Memory. */
free(Fr);
free(Text);
printf("Hit the enter key to end the program....\n");
getchar();
return 0;
}
//---------------------------------------------------------------------------

 

Τυπωμένα Αποτελέσματα:

 

Enter the text:

Ares Mares Koykoynares!!

Letter A: Frequency in Text: 1

Letter r: Frequency in Text: 3

Letter e: Frequency in Text: 3

Letter s: Frequency in Text: 3

Letter : Frequency in Text: 2

Letter M: Frequency in Text: 1

Letter a: Frequency in Text: 2

Letter r: Frequency in Text: 3

Letter e: Frequency in Text: 3

Letter s: Frequency in Text: 3

Letter : Frequency in Text: 2

Letter K: Frequency in Text: 1

Letter o: Frequency in Text: 2

Letter y: Frequency in Text: 2

Letter k: Frequency in Text: 1

Letter o: Frequency in Text: 2

Letter y: Frequency in Text: 2

Letter n: Frequency in Text: 1

Letter a: Frequency in Text: 2

Letter r: Frequency in Text: 3

Letter e: Frequency in Text: 3

Letter s: Frequency in Text: 3

Letter !: Frequency in Text: 2

Letter !: Frequency in Text: 2

 

Hit the enter key to end the program....

 

Φιλικά,

>
Bokarinho

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
Τον κώδικα το έχει "ταράξει τα typedef. Αντί να βάλει char, βάζει BYTE, αντι για FILE* βάζει USER_STREAM*. Μόνο το int του ¨ξέφυγε" και το άφησε το ίδιο.

 

UserStreamReadByte είναι η fgetc

MapGetPattern είναι πίνακας χαρακτήρων που περιέχει τους κωδικούς huffman

MapGetPatternCount είναι το μήκος του κάθε κωδικού (χάθηκε η strlen?)

UserStreamEOS είναι EOF.

 

Τι απέδειξα? Τιποτα

Τι απέδειξε ο bilco? Τίποτα?

Τι κέρδισα? Τίποτα, γιατί τον κώδικα τον καταλαβαίνω, αλλά την φιλοσοφία του όχι. Εχω κάπου 15 εκδόσεις του huffman σε C, αλλά δεν μπορώ να μπω στο νόημα. Μπορώ να κάνω μια "προσαρμογή" γα να φτιάξω τον κώδικα που χρειάζομαι αλλά αυτό δεν μου αρκει. Θέλω να καταλαβαίνω τι κάνω.

 

Τέλος πάντων, για να μην φανώ και αχάριστος, να ευχαριστήσω τον bilco.

 

Καταρχήν BYTE είναι ο unsigned char. Το USER_STREAM είναι ένα ρεύμα γενικά και αόριστα. Ακόμα και στην περίπτωση που είναι ρεύμα σε αρχείο, δεν είναι το ίδιο το FILE αλλά ένα ενδιάμεσο που δεν γράφει και διαβάζει ένα byte τη φορά στο αρχείο, αλλά μεγαλύτερα chunks. Η strlen χάθηκε γιατί έχει κόστος. Καλύτερα να κρατάς το μέγεθος για το pattern χωρίς να χρειάζεται να το υπολογίζεις με την strlen κάθε φορά (και γλυτώνεις και το χαρακτήρα τερματισμού).

Όσον αφορά τη συνάρτηση encode, έβαλα τη μη optimal version που γράφει ένα bit τη φορά (μπορούμε και καλύτερα) επειδή είναι πιο εύκολο να καταλάβεις τι κάνει.

Πιο αναλυτικά λοιπόν:

Ο w είναι ο χαρακτήρας που γεμίζουμε με bits. Ο cw μετράει πόσα bits έχουμε γράψει στον w. Όταν ο w γεμίσει (if (++cw == 8)) τον γράφουμε στο ρεύμα εξόδου και 'αδειάζουμε' τον w (w = 0; cw = 0). Είναι απαραίτητο εδώ να μηδενίσουμε τον w και αυτό εξηγείται από τον τρόπο που γράφουμε τα bits:

if (src) SET_BIT(w,cw)

γράφω το i bit του κώδικα του χαρακτήρα r αν αυτό είναι 1. Αν είναι μηδέν δεν χρειάζεται να γράψω τίποτα στον w αφού το επόμενο κενό bit του (στη θέση cw) είναι ήδη 0.

Αν αφού διαβάσουμε όλο το stream o cw δεν είναι μηδεν σημαίνει ότι περιέχει bits που δεν έχουν γραφτεί στην έξοδο γιαυτό γράφω τον w τώρα. Αν είναι μηδέν τον βάζω ίσο με 8 γιατί η συνάρτηση encode επιστρέφει τον αριθμό των έγκυρων bits στο τελευταίο byte (κάτι που θα μου χρειαστεί στην decode)

Στην decode τώρα και μέσα στο loop διαβάζω πρώτα τον χαρακτήρα και μετά ελέγχω για το τέλος του ρεύματος, ώστε αν αυτό είναι το τελευταίο byte να μην αποκωδικοποιήσω και τα 8 bit αλλά μόνο τα έγκυρα. H TreeGetByte επιστρέφει ένα όταν φτάσει σε φύλλο του δέντρου και γράφει τον χαρακτήρα στον w, αλλιώς επιστρέφει 0. Μια πιθανή υλοποίηση είναι να κρατάμε στο tree ένα link στον τρέχοντα κόμβο ξεκινώντας από τη ρίζα. Ανάλογα με το τι έιναι το bit μετακινεί τον τρέχοντα κόμβο στο δεξιό ή αριστερό παιδί του. Αν φτάσει σε φύλλο επαναφέρει τον τρέχοντα κόμβο στη ρίζα.

 

Αυτά, α και εξήγησέ μου και εμένα σε παρακαλώ, κάτι που δεν κατάλαβα?

Τι απέδειξε ο bilco? Τίποτα?

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Με το

>#define GET_BIT(byte,at) (byte&(1<<at)?1:0)

διαβάζεις το bit στη θέση at του byte

ενώ με το

>#define SET_BIT(byte,at) (byte|=(1<<at))

το βάζεις ίσο με 1.

Αφού είπες ότι δεν θέλεις κώδικα, μην διαβάσεις τα παρακάτω

>
int encode(USER_STREAM* s_in, USER_STREAM* s_out, MAP* map)
{
BYTE r, w;
BYTE* src;
int cb_src, cw, i;
cw = 0; w = 0;	
while (!UserStreamEOS(s_in)) {
	UserStreamReadByte(s_in, &r);
	src = MapGetPattern(map, r);
	cb_src = MapGetPatternCount(map, r);
	for (i = 0; i < cb_src ; ++i) {	
		if (src[i]) SET_BIT(w,cw);		
		if (++cw == 8) { UserStreamWriteByte(s_out, w); cw = 0; w = 0; }
	}
}
if (cw) UserStreamWriteByte(s_out, w); else cw = 8;
return cw;
}

void decode(USER_STREAM* s_in, USER_STREAM* s_out, TREE* tree, int last_byte_bits)
{
BYTE r, w;  
int i;
while (1) {
	UserStreamReadByte(s_in, &r);
	if (UserStreamEOS(s_in)) break;
	for (i = 0; i < 8; ++i) 
		if (TreeGetByte(tree, GET_BIT(r,i), &w)
			UserStreamWriteByte(s_out, w);
}
for (i = 0; i < last_byte_bits; ++i)
	if (TreeGetByte(tree, GET_BIT(r,i), &w)
		UserStreamWriteByte(s_out, w);
}

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Να συμπληρώσω πως δεν θέλω "έτοιμο φαϊ", αλλά οδηγίες για να φτιάξω δικό μου κώδικα. Δεν θέλω να "σπαταλήσω" τον χρόνο που διαθέτω ώστε να κατανοήσω τον κώδικα που έγραψε κάποιος άλλος, θέλω να φτιάξω κάτι δικό μου. Ευχαριστώ.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
ΚΑΛΗΣΠΕΡΑ ΚΑΙ ΚΑΛΗ ΧΡΟΝΙΑ ΣΕ ΟΛΟΥΣ ΣΑΣ.

 

ΕΧΩ ΚΑΙ ΕΓΩ ΤΙ ΙΔΙΑ ΑΣΚΗΣΗ ΚΑΙ ΑΝΤΙΜΕΤΩΠΙΖΩ ΕΝΑ ΠΡΟΒΛΗΜΑ ΚΑΤΑ ΤΙ ΔΗΜΙΟΥΡΓΙΑ ΤΟΥ ΔΕΝΔΡΟΥ HUFFMAN.ΕΧΩ ΚΑΝΕΙ ΤΟ ΠΙΟ ΚΑΤΩ ΚΩΔΙΚΑ.ΔΕΝ ΕΙΝΑΙ ΟΜΩΣ ΚΑΙ ΤΟΣΟ ΚΑΛΟΣ ΚΑΙ ΘΑ ΗΘΕΛΑ ΤΗΝ ΒΟΗΘΕΙΑ ΣΑΣ.ΤΟ ΔΕΝΤΡΟ ΠΟΥ ΘΕΛΩ ΝΑ ΔΗΜΙΟΥΡΓΗΣΩ ΘΕΛΩ ΝΑ ΕΙΝΑΙ ΜΕ ΒΑΣΗ ΤΟ probfile.txt ΠΟΥ ΣΑΣ ΠΑΡΑΘΕΤΩ ΠΙΟ ΚΑΤΩ.

typedef struct _treenode treenode;

 

struct _treenode{

int freq; /* frequency is the priority for heap */

unsigned char ch; /* character,if any */

treenode *left; /* left child of huffman tree */

treenode *right; /* right child of huffman tree */

};

 

/* this is a priority queue implemented as a binary heap */

typedef struct _pq{

int heap_size;

treenode *A[TABLE_SIZE];

}PQ;

 

/* create an empty queue */

 

void create_pq(PQ *p){

p->heap_size=0;

};

 

/* this heap node's parent */

 

int parent(int i){

return (i-1)/2;

}

 

/* this heap node's left kid */

 

int letf(int i){

return i*2+1;

}

 

/* this heap node's right kid */

 

int right(int i){

return i*2+2;

}

 

ΣΑΣ ΕΥΧΑΡΙΣΤΩ ΕΚ ΤΩΝ ΠΡΟΤΕΡΩΝ!!

 

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
Αυτό που λες αφορά την συνάρτηση uncompress που αποσυμπιέζει τον κώδικα με τα bits στα αντίστοιχα γράμματα, αυτό γίνεται ως εξής:

 

Κατασκεύαζοντας το huffman tree με τα γράμματα σύμβολα μαζί με τις συχνότητες τους να βρίσκονται πάντα σαν κόμβοι φύλλα στο δέντρο, τότε με βάση τον κανόνα που λέει ότι όποτε πάμε αριστερά βάζουμε μηδέν και όποτε πάμε δεξιά βάζουμε 1, παίρνουμε την ακολουθία μας και ξεκινόντας από το πρώτο bit συνεχίζουμε μέχρι να σταματήσουμε σε κόμβο φύλλο. Αν λοιπόν σταματήσουμε επιστρέφουμε το γράμμα που υπάρχει στον κόμβο φύλλο. Έτσι σχηματίζουμε την λέξη που παριστάνουν τα bits.

Τον αλγόριθμο (σε αυτό το θεωρητικό επίπεδο) τον κατανοώ, στην υλοποίηση του κολλάω.

 

Τώρα τι ακριβώς θέλεις γίνε λίγο περισσότερο ακριβής.

Επισυνάπτω τα δεδομένα (προδιαγραφές) που έχω στη διάθεση μου.

Εχω "τελειώσει" τα 2 πρώτα θέματα και έχω τα άλλα 2. Αυτά αφορούν την συμπίεση και την αποσυμπίεση ενός αρχείου. Αντιλαμβάνομαι οτι πρέπει να κάνω bit manipulation και μάλιστα με χαρακτήρες μεταβλητού μήκους (το μέγιστο είναι περιπου 25 bits-γισ χαρακτήρες με μικρή συχνότητα εμφάνισης ).

 

Σημειώνω οτι 1η φορά βρίσκομαι μπροστά σε "χειρισμό bits", και θα ήθελα λίγη καθοδήγηση (όχι έτοιμο κώδικα, επαναλαμβάνω).

Υ.Γ. Εχω φτιάξει δένδρο huffman, άπό αυτό έχω φτιάξει τους κωδικούς για κάθε χαρακτήρα. Τις συχνότητες εμφάνισης του κάθε χαρακτήρα τις έχω αποθηκευμένες σε απλό μονοδιάστατο πίνακα.

Υ.Γ2 το αρχείο sample.txt που αναφέρεται στην εκφώνηση είναι πολύ μεγάλο και δεν "ανεβαίνει".

huffman.zip

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

bokarinho bravo !

 

πλάκα πλάκα, το Insomnia λειτουργεί και σαν ΕΑΠ !

 

ευχαριστούμε για το γρήγορο "μάθημα" !:-)

 

επικροτώ να γίνει sticky

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Αυτά, α και εξήγησέ μου και εμένα σε παρακαλώ, κάτι που δεν κατάλαβα?

Τι απέδειξε ο bilco? Τίποτα?

 

Μάλλον παρερμήνευσα (κακώς) τις προθέσεις σου, πάντως αυτά που δημοσίευσες ήταν πολύ περισσότερο απο αυτο που περιμενα (δηλαδή μια καθοδήγηση). Θα περίμενα κάτι σαν "πάρε την GET_BIT και την SET_BIT και πορεύσου", και μετά να σε "βομβάρδιζα" με ερωτήσεις (όχι ότι τώρα θα "γλυτώσεις" τις ερωτήσεις!).

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

προσπαθώ να κάνω το interface για τα δέντρα, αλλά έχω πολλά προβλήματα.

Ερώτηση:

Έχω ορίσει μια μεταβλητή root που είναι δείκτης σε μια ρίζα του δένδρου. Άρα ο τύπος της μεταβλητής είναι struct tree_node. Όμως η μεταβλητή αυτή αποτελεί πεδίο της δομής της συνδεδεμένης λίστας struct list_node.

struct list_node

{

long double probability;

struct list_node *next;

struct tree_node *root;

}*begin_list_node, *new_list_node;

Έβαλα long double probability γιατί ήταν ο μόνος τρόπος να τυπώσω την λίστα για να την δω.

Εάν θέλω κάπου στο πρόγραμμά μου να αναφερθώ σε αυτή την μεταβλητή root θα πρέπει να χρησιμοποιήσω

struct list_node->root και όχι struct tree_node->root σωστά;

Τώρα πως μπορεί αυτή η μεταβλητή να δείχνει στη ρίζα ενός δένδρου. Θέλουμε να δείχνει για παράδειγμα σε ένα χαρακτήρα;

Κάτι σαν new_list_node->root = ρίζα->chr_ASCII;

Προσπαθώ να καταλάβω τι είναι αυτή η ρίζα.

Και όλες αυτές τις ρίζες πως μπορούμε να τις χειριστούμε; Μήπως να φτιάξω έναν πίνακα με όλους αυτούς τους δείκτες προς τις ρίζες;

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

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

 

Αρχίζω "απαλά".

Γιατί χρησιμοποιούμε unsigned char και όχι char;

Και με ένα παράδειγμα: Ποιά είναι διαφορά του int i = 1; με το unsigned int = 1; ( το 1 είναι τυχαιος αριθμός).

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
×
×
  • Δημιουργία νέου...