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

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

Δημοσ.

Εστω οτι το κανω με τον δικο μου τροπο. Μπορεις να με βοηθησεις λιγο με τον κωδικα διασυνδεσης?? Ο κωδικας θα γινει μεσα στη main ή οχι??

  • Απαντ. 33
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοφιλείς Ημέρες

Συχνή συμμετοχή στο θέμα

Δημοσιευμένες Εικόνες

Δημοσ.
struct s_stili {
	int stoixeio;
	struct s_stili *next;
};

struct s_grammi {
	struct s_stili stili;
	struct s_grammi *next;
};
Αν κατάλαβα καλά αυτό δεν είναι η δομή της φωτογραφίας ? Αυτό που σου έδωσε ο sonyxp (και που θα μπορούσες να δεις σε χιλιάδες sites στο internet) είναι έτοιμη η δομή αλλά για "μονή" λίστα. Από αυτό λοιπόν και από το σχηματικό σου δεν μπορούσες να φανταστείς πως θα ήταν η "διπλή" ?

 

 

για τι είναι?

Κάτσε, ίσως δεν κατάλαβα κάτι... νόμιζα ότι το παιδί μίλαγε για "Double Linked Lists".

 

Τοπικ Σταρτερ: αυτό στην εικόνα δεν είναι DLL (Διπλά συνδεδεμένη λίστα)

Δημοσ.

για τι είναι?

Κάτσε, ίσως δεν κατάλαβα κάτι... νόμιζα ότι το παιδί μίλαγε για "Double Linked Lists".

 

Τοπικ Σταρτερ: αυτό στην εικόνα δεν είναι DLL (Διπλά συνδεδεμένη λίστα)

Δεν εννοούσα singly και doubly linked list για αυτό έβαλα τα εισαγωγικά. Όπου διπλή εννοούσα τη λίστα του OP που τα δεδομένα της είναι και αυτά λίστα. Λάθος επιλογή όρων από μέρους μου για αυτό μπερδεύτηκες.

Δημοσ.

Δεν εννοούσα singly και doubly linked list για αυτό έβαλα τα εισαγωγικά. Όπου διπλή εννοούσα τη λίστα του OP που τα δεδομένα της είναι και αυτά λίστα. Λάθος επιλογή όρων από μέρους μου για αυτό μπερδεύτηκες.

 

It's ok!

Βασικά μπερδεύτηκα με τον topic starter, με το "διασυνδεμένες" κατάλαβα "DLL"

Δημοσ.

Εστω οτι το κανω με τον δικο μου τροπο. Μπορεις να με βοηθησεις λιγο με τον κωδικα διασυνδεσης?? Ο κωδικας θα γινει μεσα στη main ή οχι??

 

Τη διασύνδεση μπορείς να την κάνεις όπου θεωρείς εσύ πιο χρήσιμο. Σου έγραψα λίγο κώδικα που δημιουργεί μια λίστα από 4 GrammiNodes, με το κάθε node να περιέχει στο dataList filed του τυχαία παραγόμενες λίστες από DataNodes. Χρησιμοποιεί τις δομές που έιπες πως θέλεις να κρατήσεις.

 

Πιθανότατα να μου έχουν ξεφύγει τίποτα bugs, αλλά σου έβαλα αρκετά σχόλια (στα αγγλικά)...

 

 

 

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

#define DBG_ERROR( msg )	\
	fprintf( stderr, "*** %s|%s|%d: %s\n", __FILE__, __func__, __LINE__, (msg) )

typedef struct DataNode DataNode;
struct DataNode {
	int		stili;
	int		stoixeio;
	DataNode	*next;
};

typedef struct GrammiNode GrammiNode;
struct GrammiNode {
	int 		id;
	DataNode	*dataList;
	GrammiNode	*next;
};

/* -----------------------------------
 * Return a newly allocated DataNode containing the specified stili & stoixeio,
 * or return NULL on error.
 *
 * It is the caller's responsibility to free the node, when done using it.
 */
DataNode *make_data( int stili, int stoixeio )
{
	DataNode *ret = malloc( sizeof(DataNode) );
	if ( NULL == ret )
		return NULL;

	ret->stili	= stili;
	ret->stoixeio	= stoixeio;
	ret->next	= NULL;

	return ret;
}

/* -----------------------------------
 * Free all nodes in the list of DataNodes that starts at head.
 * head is passed by reference because it's set to NULL after completion.
 */
void dataList_free( DataNode **head )
{
	DataNode *temp = NULL;

	if ( !head || !*head )
		return;

	temp = *head;
	while ( (*head)->next )
	{
		temp = (*head)->next;
		free( *head );
		*head = temp;
	}

	*head = NULL;
}

/* -----------------------------------
 * Print the contents of all nodes in a list of DataNodes that starts at head.
 *
 * The title string is printed before anything else, unless it is passed as NULL.
 * The boolen indent controls whether priniting should be intended (1) or not (0).
 */
void dataList_print( const DataNode *head, const char *title, int indent )
{
	char c = indent ? '\t' : '\0';	/* prefix char for nested printout */

	if ( title ) {
		printf( "%c%s", c, title );
		fflush( stdout );
	}

	if ( !head ) {
		DBG_ERROR( "EINVAL (NULL pointer arg)" );
		return;
	}

	while ( head )
	{
		printf( "%cstili   : %d\n", c, head->stili );
		printf( "%cstoixeio: %d\n", c, head->stoixeio );
		printf( "%cnext    : @0x%X\n", c, (unsigned long)head->next );
		putchar( '\n' );
		head = head->next;
	}
}

/* -----------------------------------
 * Create a newly allocated DataNode containing the specified stili & stoixeio,
 * and prepend it before the head of a list of DataNodes.
 *
 * head which is passed by reference, represents the starting node in the list
 * of DataNodes. If its dereferneced value is NULL, then the list is created
 * with just the node allocated by this function.
 * It is the caller's responsibility to free this node when done using it.
 *
 * The function returns 1 (true) on success, 0 (false) otherwise.
 */
int dataList_prepend( DataNode **head, int stili, int stoixeio )
{
	DataNode *node = NULL;

	if ( !head ) {
		DBG_ERROR( "EINVAL (NULL pointer arg)" );
		return 0;		/* false */
	}

	node = make_data( stili, stoixeio );
	if ( NULL == node ) {
		DBG_ERROR( "ENOMEM (possible memory shortage)" );
		return 0;		/* false */
	}

	node->next = *head;
	*head = node;

	return 1;			/* true */
}

/* -----------------------------------
 * Create and return a list of nelems DataNodes, each one containing random
 * values for its stili & stoixeio fields (the values for stili are restriced
 * in the range [0, 255]).
 *
 * It is the caller's responsibility to free all nodes of the list, when done
 * using it.
 *
 * The function returns a pointer to the created list on success, NULL otherwise.
 */
DataNode *dataList_make_randomly( int nelems )
{
	int i = 0;
	DataNode *ret = NULL;

	if ( nelems < 1 ) {
		DBG_ERROR( "EINVAL (zero or negative value of nelems)" );
		return NULL;
	}

	for (i=0; i < nelems; i++ ) {
		int stili	= rand() % 256;
		int stoixeio	= rand();
		dataList_prepend( &ret, stili, stoixeio );
	}

	return ret;
}

/* -----------------------------------
 * Return a newly allocated GrammiNode containing the specified id.
 * or return NULL on error.
 *
 * It is the caller's responsibility to free the node, when done using it.
 */
GrammiNode *make_grammi( int id  )
{
	GrammiNode *ret = malloc( sizeof(GrammiNode) );
	if ( NULL == ret )
		return NULL;

	ret->id		= id;
	ret->dataList	= NULL;
	ret->next	= NULL;

	return ret;
}

/* -----------------------------------
 * Free all nodes in the list of GrammiNodes that starts at head.
 * head is passed by reference because it's set to NULL after completion.
 */
void grammiList_free( GrammiNode **head )
{
	GrammiNode *temp = NULL;

	if ( !head || !*head )
		return;

	temp = *head;
	while ( (*head)->next )
	{
		temp = (*head)->next;
		if ( (*head)->dataList )
			dataList_free( &(*head)->dataList );
		free( *head );
		*head = temp;
	}

	*head = NULL;
}

/* -----------------------------------
 * Print the contents of all nodes in a list of GrammiNodes that starts at head.
 * The title c-string is printed before anything else, unless it is passed as NULL.
 */
void grammiList_print( const GrammiNode *head, const char *title )
{
	if ( title ) {
		printf( "%s", title );
		fflush( stdout );
	}

	if ( !head ) {
		DBG_ERROR( "EINVAL (NULL pointer arg)" );
		return;
	}

	while ( head ) {
		printf( "id      : %d\n", head->id );

		printf( "dataList: @0x%X\n", (unsigned long)head->dataList );
		if ( head->dataList )
			dataList_print( head->dataList, "--- dataList ---\n", 1 );

		printf( "next    : @0x%X\n", (unsigned long)head->next );
		putchar( '\n' );

		head = head->next;
	}
}

/* -----------------------------------
 * Create a newly allocated GrammiNode containing the specified id and dataList,
 * and prepend it before the head of a list of GrammiNodes.
 *
 * head which is passed by reference, represents the starting node in the list
 * of GrammiNodes. If its dereferneced value is NULL, then the list is created
 * with just the node allocated by this function.
 * It is the caller's responsibility to free this node when done using it.
 *
 * The function returns 1 (true) on success, 0 (false) otherwise.
 */
int grammiList_prepend( GrammiNode **head, int id, DataNode *dataList )
{
	GrammiNode *node = NULL;

	if ( !head ) {
		DBG_ERROR( "EINVAL (NULL pointer arg)" );
		return 0;		/* false */
	}

	node = make_grammi( id );
	if ( NULL == node ) {
		DBG_ERROR( "ENOMEM (possible memory shortage)" );
		return 0;	/* false */
	}
	node->dataList = dataList;

	node->next = *head;
	*head = node;

	return 1;
}

/* -----------------------------------
 *
 */
GrammiNode *grammiList_lookup_id( const GrammiNode *head, int id )
{
	GrammiNode *walk = (GrammiNode *) head;

	if ( !head )
		return NULL;

	while ( walk ) {
		if ( walk->id == id )
			return walk;
	}

	return NULL;
}

/* -----------------------------------
 * Enrty point of the program
 */
int main( void )
{
	int i = 0;
	GrammiNode *grammiList = NULL;

	/* initialize seed for pseudo random generator */
	srand( time(NULL) );

	/*
	 * Create grammiList as a list of 4 GrammiNodes, each one having its
	 * dataList field set to a newly created list of DataNodes. Each one
	 * of those DataNodes lists is populated by a random number of nodes
	 * ranging from 1 to 5 (inclusive) via the function dataList_make_randomly().
	 * This function in turn, assign random values in the fields stili and
	 * stoixeio of every node.
	 */
	for (i=0; i < 4; i++) {
		DataNode *dataList = dataList_make_randomly( rand() % 5 + 1 );
		grammiList_prepend( &grammiList, i, dataList );
	}
	grammiList_print( grammiList, "--- CONTENTS OF grammiList ---\n\n" );
	grammiList_free( &grammiList );

	system( "pause" );		/* Windows only */
	return 0;
}

 

Ο κώδικας είναι σε C (και όχι σε C++) γιατί με αυτήν είμαι περισσότερο εξοικειωμένος οπότε μου βγαίνει πιο φυσικά (εννοώ πως δεν χρειάζεται να ανατρέχω συχνά σε τεκμηριώσεις).

 

Έξοδος:

 

 

--- CONTENTS OF grammiList ---

id      : 3
dataList: @0x3E2DF8
        --- dataList ---
        stili   : 250
        stoixeio: 23383
        next    : @0x3E2DE0

        stili   : 84
        stoixeio: 12452
        next    : @0x3E2DC8

        stili   : 237
        stoixeio: 2794
        next    : @0x3E2DB0

        stili   : 117
        stoixeio: 19264
        next    : @0x3E2D98

        stili   : 219
        stoixeio: 12106
        next    : @0x0

next    : @0x3E2D80

id      : 2
dataList: @0x3E2D68
        --- dataList ---
        stili   : 49
        stoixeio: 18424
        next    : @0x0

next    : @0x3E2D50

id      : 1
dataList: @0x3E2D38
        --- dataList ---
        stili   : 185
        stoixeio: 18973
        next    : @0x3E2D20

        stili   : 64
        stoixeio: 27495
        next    : @0x3E2D08

        stili   : 42
        stoixeio: 17495
        next    : @0x3E2CF0

        stili   : 170
        stoixeio: 21803
        next    : @0x3E2CD8

        stili   : 80
        stoixeio: 15575
        next    : @0x0

next    : @0x3E2CC0

id      : 0
dataList: @0x3E2CA8
        --- dataList ---
        stili   : 143
        stoixeio: 5869
        next    : @0x3E2C90

        stili   : 250
        stoixeio: 2560
        next    : @0x0

next    : @0x0

Press any key to continue . . .

 

Δημοσ.

Δεν ξέρω άμα σε ενδιαφέρει και αν σε βοηθάει αλλά στην C++ υπάρχει η βιβλιοθήκη boost, νομίζω ότι έχει κάτι σχετικό  "έτοιμο", nice timing πάντως γιατί και εγώ ψάχνομαι για το συγκεκριμένο θέμα (linked lists). Από αύριο θα αρχίσω την υλοποίηση σε C... άμα έχεις υπομονή...  :P Υπάρχει πάντως πάρα πολύ υλικό στο νετ! 

Δημοσ.

Ντε και καλά boost;

 

http://www.cplusplus.com/reference/list/list/

 

 

Έχει πολύ πιο πολλά πράγματα η C++ έτοιμα και εύκολα, από ό,τι μπορεί να φανταστεί κάποιος που δεν την έχει λιώσει καμία δεκαετία. 

(όχι, εγώ δεν είμαι αυτός... μιας και εγώ κάθε φορά που βρίσκω νέα πράγματα λέω "μα πόσο μ@μ@τη η C++, πόσο μ@μ@τη;" )



Και εάν θέλει κανείς single linked...

 

http://www.cplusplus.com/reference/forward_list/forward_list/

Δημοσ.

...

 

Και εάν θέλει κανείς single linked...

 

http://www.cplusplus.com/reference/forward_list/forward_list/

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

Δημοσ.

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

 

έτσι λοιπον έφτιαξα αυτές τις 2 δομές για αρχή:

 

 

struct columns{
        int columnumber;
        int value;
        columns* next;
    };
 
    struct line{
        int linenumber;
        line* next;
        columns* column;        
   };
 
Έπειτα όπως θα δείτε στον παρακάτω κώδικα , φτίαχνω κάποιους τυχαίους κόμβους , και πάω να τους εκτυπώσω, και μου βγαίνουν ένα σωρό σφαλματα.. 
 
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
/*
 * 
 */
int main(int argc, char** argv) {
 
  
    struct columns{
        int columnumber;
        int value;
        columns* next;
    };
 
    struct line{
        int linenumber;
        line* next;
        columns* column;        
    };
    
    line* ln,lh,lt,pr;
  columns* cc,cn,ch,ct,prc;
  
  ln=new line;
  ln->linenumber=1;
  lt=*ln;
  lh=*ln;
  
  cn=new columns;
  cn.columnumber=1;
  cn.value=11;
  lt.column=cn;
  ct=cn;
  
   cn=new columns;
  cn.columnumber=4;
  cn.value=14;
  ct.next=*cn;
  ct=*cn;
  
  ln=new line;
  ln->linenumber=3;
  lt.next=ln;
  lt=*ln;
  
  cn=new columns;
  cn.columnumber=1;
  cn.value=11;
  lt.column=*cn;
  ct=*cn;
  
   cn=new columns;
  cn.columnumber=4;
  cn.value=14;
  ct.next=*cn;
  ct=*cn;
    
  cout <<"H stili twn grammwn einai:";
          pr = lh;
  while(pr!=NULL){
      cout << pr.linenumber << " ";
      cout <<"H stili twn stilwn einai:";
          prc=cn;
  while(prc!=NULL){
      cout << prc.columnumber << " ";
    pr = prc.next;
  }
    pr = *pr.next;
    cout<<endl;
  }
  
  
    return 0;
}

  Και φυσικά θέλω βοήθεια!!

 
Δημοσ.

Φίλε Κωστή, αν θέλεις να μάθεις θα πρέπει να αντιμετωπίζεις τα σφάλματα στα ίσια μέχρι να τα δαμάσεις -- διαφορετικά, μια ζωή θα πασαλείβεις.

 

Ξεκίνα κάνοντας το πιο απλό:

  1. Βάλε σωστό formatting στον κώδικα που ποστάρεις. Επειδή ο editor στο insomnia είναι άθλιος, μπορείς ίσως να βάλεις τον κώδικα σε κάτι του στυλ pastebin.com και να δώσεις ένα link.
  2. Δεν έχουμε κρυστάλλινη σφαίρα. Αν θέλεις βοήθεια θα πρέπει να βοηθήσεις και συ. Κάνε copy/paste τα 3-4 πρώτα σφάλματα ακριβώς όπως στα δίνει ο compiler. Δεν έχει νόημα να τα ποστάρεις όλα αν είναι πολλά γιατί συνήθως, ειδικά στη c++, ένα λάθος προκαλεί χιονοστιβάδα μηνυμάτων οπότε μπορεί φτιάχοντας ένα πράγμα από 100 σφάλματα να πέσεις σε 10.
  3. Τα σφάλματα αναφέρουν αριθμούς γραμμών. Βεβαιώσου ότι στον κώδικα που πόσταρες είναι ξεκάθαρα σημειωμένο ποιά είναι κάθε γραμμή από αυτές που αναφέρονται στα σφάλματα. Βεβαιώσου ότι ο κώδικας που πόσταρες είναι 200% ίδιος με αυτόν που έκανες compile και σου έδωσε τα σφάλματα.
  4. Αν είναι δυνατόν, δώσε ένα SSCCE.
  5. Αν κάνεις τα παραπάνω σωστά σύντομα θα πάρεις απάντηση. Αφού την εφαρμόσεις, κάτσε κάτω και προσπάθησε να καταλάβεις ακριβώς ποιό ήταν το σφάλμα σου και για ποιό λόγο η λύση το διορθώνει. Αν δεν καταλαβαίνεις, ρώτα για λεπτομέρειες. Αν δεν το κάνεις αυτό, είσαι καταδικασμένος να κάνεις ξανά και ξανά τα ίδια λάθη.
  6. Go to 2.
Δημοσ.

Καλησπέρα και καλώς όρισες στο φόρουμ. Τον κώδικα που έχω δώσει τον είδες (είναι σε spoiler, μαζί με την έξοδό του); Δεν σε βοηθάει; Χρησιμοποιεί ακριβώς τις ίδιες δομές.

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

Δημοσ.

1η φορά και σας έβαλαν τέτοια εργασία; Πολύ κουφό μου ακούγεται! Σας επιτρέπουν τουλάχιστον να χρησιμοποιήσετε έτοιμες templates της C++ ή πρέπει να τα φτιάξετε μόνοι σας;

Δημοσ.

Γεια σου defacer!

 

Εδώ είναι το link για τον editor με το μικρότερο δυνατό κώδικα, κάποια απο τα σφάλματα και αριθμημένες τις γραμμές.

 

Ευχαριστώ για το χρόνο σας παιδιά



1η φορά και σας έβαλαν τέτοια εργασία; Πολύ κουφό μου ακούγεται! Σας επιτρέπουν τουλάχιστον να χρησιμοποιήσετε έτοιμες templates της C++ ή πρέπει να τα φτιάξετε μόνοι σας;

Ναι δεν υπάρχει πρρόβλημα.Αλλά μπαίνεις σε αυτή τη διαδικασία όταν μιλάμε για αυτές τις δομές και μάλιστα όταν δε το κατέχεις;;

Και να ήταν το μόνο κουφό που έχουμε συναντήσει καλα θα ήταν.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...