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

Linked LIST in C


MauriDalia

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

Καλησπέρα σας!

 

Στο παρακάτω πρόγραμμα προσπαθώ να προσθέσω ενα νεο στοιχειο(ΜΑΙΛ) στην συνδεδεμενη λιστα που θελω να δημιουργησω. Αλλα προφανως κάνω καποιο λάθος γιατι στο τέλος που θέλω να μου εμφανίσει τα μέλη του πρώτου στοιχειου δεν μου τα εμφανιζει...

 

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

#define LOGIN_SIZE 15 
#define TOT_USERS 3  
#define BODY_SIZE 250 

typedef struct user {
char login[LOGIN_SIZE];
} user;


/*Domi Mail*/
struct mail {
struct user sender; /*Apostoleas*/
struct user receiver;/*paralipths*/
char body[bODY_SIZE];/*To swma tou mail*/
struct mail * next; /*Deikths pou deixnei sto epomeno mail....*/
};



typedef struct mail MAIL;

typedef MAIL *MAILPTR;


struct mailbox{
MAILPTR head;
};

typedef struct mailbox MAILBOX;


int main(int argc, char *argv[] ){
char buf[15];
char buffer[250];
MAILBOX mailoxes;

mailboxes.head=NULL;
MAILPTR new=NULL;
MAILPTR current=NULL;



new=(MAILPTR)malloc(sizeof(MAIL));
new->next=mailboxes.head;


printf("Eisigage ton apostolea tou mail:\n");
fgets(buf,15,stdin);
strcpy(new->sender,buf);

new=new->next;
printf("Eisigage ton paralipth tou mail:\n");
fgets(buf,15,stdin);

strcpy(new->receiver,buf);
new=new->next;

printf("Eisigage ton periexomeno  tou mail:\n");
fgets(buffer,250,stdin);
strcpy(new->body,buffer);

mailboxes.head=new;

while(new!=NULL)
{

printf("%s\n"new->sender.login);
new=new->next;
}
printf("\n");
}

 

Δηλαδη θελω στο τελος να μου εμφανιζεται το πρωτο στοιχειο της λιστας μου το οποιο αποτελειται από το ονομα του αποστολεα του μαιλ,τον παραληπτη και το σωμα του μαιλ.Αυτα τα 3 πεδια ειναι το πρωτο στοιχειο της λιστας μου..

καμια βοηθεια??Ευχαριστω

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Υπήρχαν αρκετά λάθει στην διαχείριση μνήμης και στην εισαγωγή δεδομένων, μάλιστα κάποια από αυτά θα έπρεπε να τα είχε πιάσει αυτόματα ο Compiler σου (έστω warning), ρίξε μια ματιά στα σχόλια του κώδικα που αναρτώ.

 

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

#define LOGIN_SIZE 15 
#define TOT_USERS 3  
#define BODY_SIZE 250 

typedef struct user
{
   char login[LOGIN_SIZE];
} user;

/*Domi Mail*/
struct mail
{
   struct user sender; /*Apostoleas*/
   struct user receiver;/*paralipths*/
   char body[bODY_SIZE];/*To swma tou mail*/
   struct mail * next; /*Deikths pou deixnei sto epomeno mail....*/
};



typedef struct mail MAIL;
typedef MAIL *MAILPTR;
struct mailbox
{
   MAILPTR head;
};
typedef struct mailbox MAILBOX;

int main(int argc, char *argv[] )
{
   char buf[15];
char buffer[250];
   int nAutoList; /* Dx: My variable for stress-testing */
MAILBOX mailboxes;
MAILPTR newMailPtr=NULL; /* Dx: new was a poor-name, reminds C++ ;-) */ 
MAILPTR current=NULL;

   mailboxes.head=NULL;

   /* Dx: calloc automatically sets to zero (NULL) every struct member */
newMailPtr=(MAILPTR)calloc(1,sizeof(MAIL));
   /* (MAILPTR)malloc(sizeof(MAIL)); */
newMailPtr->next=mailboxes.head;

printf("Eisigage ton apostolea tou mail:\n");
fgets(buf,15,stdin);
strcpy(newMailPtr->sender.login,buf);

/*newMailPtr=newMailPtr->next;*/
printf("Eisigage ton paralipth tou mail:\n");
fgets(buf,15,stdin);

strcpy(newMailPtr->receiver.login,buf);
/*newMailPtr=newMailPtr->next;*/

printf("Eisigage ton periexomeno  tou mail:\n");
fgets(buffer,250,stdin);
strcpy(newMailPtr->body,buffer);

mailboxes.head=newMailPtr;

   /* Dx: Next struct etc... (stress-test) */
   for(nAutoList=0;nAutoList<100;nAutoList++)
    {
       static char szCounter[20];
       
       newMailPtr->next =  (MAILPTR)calloc(1,sizeof(MAIL));
       newMailPtr = newMailPtr->next;

       sprintf(szCounter,"Sender %.2d\n",nAutoList);
       strcpy(newMailPtr->sender.login,szCounter);
       sprintf(szCounter,"Receiver %.2d\n",nAutoList);
       strcpy(newMailPtr->receiver.login,szCounter);
       sprintf(szCounter,"Body %.2d\n",nAutoList);
       strcpy(newMailPtr->body,szCounter);
    }

   /* Dx: newMailPtr points to mailboxes.head (List-Head) before begin
    *     list-traverse.
    */ 
   newMailPtr = mailboxes.head;

while(newMailPtr!=NULL)
{
       static int nListIndex = 0; /* Dx: Struct/List Counter (N-1) */
       int nPrevStructAddr;
       printf(" List Index: %.2d\n",nListIndex++);

   	printf(" ->%s ->%s ->%s",newMailPtr->sender.login,
                                newMailPtr->receiver.login,
                                newMailPtr->body);

       /* Dx: Copy current MAILPTR address on nPrevStructAddr */
       nPrevStructAddr=(int)newMailPtr;
    newMailPtr=newMailPtr->next;

       /* Dx: Free memory (preparing for clean program exit) */
       free((void*)nPrevStructAddr);
}
printf("\n");

   /* Dx: End of program */
   printf("Please, press Enter to exit..");
   getchar();
   return  0;
}

 

Καλή συνέχεια.

 

Υ.Γ.

Ο κώδικας έχει γίνει compile σε CodeGear/Borland C++ Builder 6.0

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

:-) Ευχαριστω παρα πολυ για τις διευκρινισεις σας. Προσπαθώντας να επεκτείνω λίγο ακόμα πιο πέρα την προσπαθειά μου αρχισα να χρησιμοποιω και την δομή users με σκοπο να προσθέσω στο προγραμμα μου 3 χρήστες και στην δομή currentUser αποθηκευω τον αποστολέα του μαιλ.Εκει που δεν μπορω να καταλαβω γιατι υπαρχει προβλημα είναι οταν κάνω την συγκριση που φαινεται με εντονα γράμματα.Ενω κανονικα επρεπε να δλινει 0 η συναρτηση strcmp εκτελείται το κοματι της else.:(

Η σκεψη μου είναι να τοποθετω αναλογά με τον ποιον χρήστη έχω ,καποια μαιλσ στο mailbox του και μετα να τα εμφανιζω.

 

 

>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>	
#define LOGIN_SIZE 15 
#define TOT_USERS 3  
#define BODY_SIZE 250 

typedef struct user {
char login[LOGIN_SIZE];
} user;

/*Domi Mail*/
struct mail {
struct user sender; /*Apostoleas*/
struct user receiver;/*paralipths*/
char body[bODY_SIZE];/*To swma tou mail*/
struct mail * next; /*Deikths pou deixnei sto epomeno mail....*/
};

typedef struct mail MAIL;
typedef MAIL *MAILPTR;

struct mailbox{
MAILPTR head;
};

typedef struct mailbox MAILBOX;

int main(int argc, char *argv[] )
{
   char buf[15];
   char buffer[250];
   
   struct user users[TOT_USERS];
							 
strcpy(users[0].login,"papadop");
strcpy(users[1].login,"mpougioum");

strcpy(users[2].login,"hastel");

user currentUser;

   printf("Oi xrhstes tou susthmatos einai....:\n");
   for(int i=0;i<TOT_USERS;i++) {
   printf("%s\n", users[i].login);//emfanisi olwn twn xrhstwn tou sustimatos
}
   
   MAILBOX mailboxes[TOT_USERS]; /*3 listes osoi einai kai oi users*/
    for(int i=0;i<TOT_USERS;i++)
   {
           mailboxes[i].head=NULL;  /*Arxikopoiw me NULL tous deiktes kefalis kai twn 3 mailbox...*/
   }
   
   MAILPTR newMailPtr=NULL; /* Dx: new was a poor-name, reminds C++ ;-) */ 
   MAILPTR current=NULL;
   printf("Eisigage to login sou:\n");    /*Grafei sthn grammh edolwn to login tou*/

fgets(currentUser.login,LOGIN_SIZE,stdin); /*Pernei to login pou eisagoume apo to pliktrologio kai to kataxwrei 
										   sto pedio login ths struct currentUser*/
										   
printf("O xrhsths pou etoimazete na sundethei einai o %s\n",currentUser.login);  /*Emfanizei ton xrhsth pou ekane
																				 aithsh gia na sundethei*/
  
   
  	for(int k=0;k<TOT_USERS;k++)
	{
		if([b]strcmp(users[k].login,currentUser.login)==0)////<--------------------------------------[/b]
		{
             /* Dx: calloc automatically sets to zero (NULL) every struct member */
             newMailPtr=(MAILPTR)calloc(1,sizeof(MAIL));
             /* (MAILPTR)malloc(sizeof(MAIL)); */
             newMailPtr->next=mailboxes[k].head;
             strcpy(newMailPtr->sender.login,currentUser.login);
             /*newMailPtr=newMailPtr->next;*/
              printf("Eisigage ton paralipth tou mail:\n");
              fgets(buf,15,stdin);

              strcpy(newMailPtr->receiver.login,buf);
             /*newMailPtr=newMailPtr->next;*/
             printf("Eisigage ton periexomeno  tou mail:\n");
             fgets(buffer,250,stdin);
             strcpy(newMailPtr->body,buffer);
             mailboxes[k].head=newMailPtr;
           }
          else
              {
              printf("....\n");
              }
          
          }/*emd of for*/
   
   while(newMailPtr!=NULL)
   {
       static int nListIndex = 0; /* Dx: Struct/List Counter (N-1) */
       int nPrevStructAddr;
       printf(" List Index: %.2d\n",nListIndex++);

       printf(" ->%s ->%s ->%s",newMailPtr->sender.login,
                                newMailPtr->receiver.login,
                                newMailPtr->body);

       /* Dx: Copy current MAILPTR address on nPrevStructAddr */
       nPrevStructAddr=(int)newMailPtr;
       newMailPtr=newMailPtr->next;

       /* Dx: Free memory (preparing for clean program exit) */
       free((void*)nPrevStructAddr);
   }
   printf("\n");

   /* Dx: End of program */
   printf("Please, press Enter to exit..");
   getchar();
   return  0;
}  

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Συγκεκριμενα προσπαθησα να καταλαβω γιατι δεν παιρνω 0 και είδα πως παιρνω -1!!!Αλλα στην ουσια αφου καποια στιφμη συγκρινω 2 ιδια αλφαρηθμιτικα γιατι μπορει να βγάζει λάθος?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το strcmp επιστρέφει 1 διότι τα δυο συγκρινόμενα strings είναι διαφορετικά μεταξύ τους, επειδή το fgets(currentUser.login,LOGIN_SIZE,stdin); προσθέτει στο τέλος του currentUser.login το escape-sequency \n δηλαδή το Enter που πάτησες.

 

Συνεπώς για να δουλέψει σωστά το strcmp θα πρέπει να αφαιρέσουμε από το τέλος του string το \n:

 

>
   if(currentUser.login[strlen(currentUser.login)-1]=='\n')
       currentUser.login[strlen(currentUser.login)-1]='\0';

 

Συνολικά ο κώδικας:

>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>	
#define LOGIN_SIZE 15 
#define TOT_USERS 3  
#define BODY_SIZE 250 

typedef struct user {
char login[LOGIN_SIZE];
} user;

/*Domi Mail*/
struct mail {
struct user sender; /*Apostoleas*/
struct user receiver;/*paralipths*/
char body[bODY_SIZE];/*To swma tou mail*/
struct mail * next; /*Deikths pou deixnei sto epomeno mail....*/
};

typedef struct mail MAIL;
typedef MAIL *MAILPTR;

struct mailbox{
MAILPTR head;
};

typedef struct mailbox MAILBOX;

int main(int argc, char *argv[] )
{
   char buf[15];
   char buffer[250];
   struct user users[TOT_USERS];
   user currentUser;

strcpy(users[0].login,"papadop");
strcpy(users[1].login,"mpougioum");

strcpy(users[2].login,"hastel");


   printf("Oi xrhstes tou susthmatos einai....:\n");
   for(int i=0;i<TOT_USERS;i++) {
   printf("%s\n", users[i].login);//emfanisi olwn twn xrhstwn tou sustimatos
}
   
   MAILBOX mailboxes[TOT_USERS]; /*3 listes osoi einai kai oi users*/
    for(int i=0;i<TOT_USERS;i++)
   {
           mailboxes[i].head=NULL;  /*Arxikopoiw me NULL tous deiktes kefalis kai twn 3 mailbox...*/
   }
   
   MAILPTR newMailPtr=NULL; /* Dx: new was a poor-name, reminds C++ ;-) */ 
   MAILPTR current=NULL;
   printf("Eisigage to login sou:\n");    /*Grafei sthn grammh edolwn to login tou*/

fgets(currentUser.login,LOGIN_SIZE,stdin); /*Pernei to login pou eisagoume apo to pliktrologio kai to kataxwrei 
										   sto pedio login ths struct currentUser*/
										   
printf("O xrhsths pou etoimazete na sundethei einai o %s\n",currentUser.login);  /*Emfanizei ton xrhsth pou ekane
																				 aithsh gia na sundethei*/
  
   
   // Dx: fgets appends a new-line on the string (\n) - if so remove it!
   if(currentUser.login[strlen(currentUser.login)-1]=='\n')
       currentUser.login[strlen(currentUser.login)-1]='\0';

  	for(int k=0;k<TOT_USERS;k++)
	{ 		   	if(strcmp(users[k].login,currentUser.login)==0)////<--------------------------------------
		{
             /* Dx: calloc automatically sets to zero (NULL) every struct member */
             newMailPtr=(MAILPTR)calloc(1,sizeof(MAIL));
             /* (MAILPTR)malloc(sizeof(MAIL)); */
             newMailPtr->next=mailboxes[k].head;
             strcpy(newMailPtr->sender.login,currentUser.login);
             /*newMailPtr=newMailPtr->next;*/
              printf("Eisigage ton paralipth tou mail:\n");
              fgets(buf,15,stdin);

              strcpy(newMailPtr->receiver.login,buf);
             /*newMailPtr=newMailPtr->next;*/
             printf("Eisigage ton periexomeno  tou mail:\n");
             fgets(buffer,250,stdin);
             strcpy(newMailPtr->body,buffer);
             mailboxes[k].head=newMailPtr;
           }
          else
              {
              printf("....\n");
              }
          
          }/*emd of for*/
   
   while(newMailPtr!=NULL)
   {
       static int nListIndex = 0; /* Dx: Struct/List Counter (N-1) */
       int nPrevStructAddr;
       printf(" List Index: %.2d\n",nListIndex++);

       printf(" ->%s ->%s ->%s",newMailPtr->sender.login,
                                newMailPtr->receiver.login,
                                newMailPtr->body);

       /* Dx: Copy current MAILPTR address on nPrevStructAddr */
       nPrevStructAddr=(int)newMailPtr;
       newMailPtr=newMailPtr->next;

       /* Dx: Free memory (preparing for clean program exit) */
       free((void*)nPrevStructAddr);
   }
   printf("\n");

   /* Dx: End of program */
   printf("Please, press Enter to exit..");
   getchar();
   return  0;
}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ευχαριστω πάρα πολυ για την πολυτιμη βοηθεια γιατι με κάνει να ασχολούμαι και να ψάχνω ακόμα πιο πού και με ενδιαφερει να μάθω:-)

 

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

 

 

>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>	
#define LOGIN_SIZE 15 
#define TOT_USERS 3  
#define BODY_SIZE 250 

typedef struct user {
char login[LOGIN_SIZE];
} user;

/*Domi Mail*/
struct mail {
struct user sender; /*Apostoleas*/
struct user receiver;/*paralipths*/
char body[bODY_SIZE];/*To swma tou mail*/
struct mail *next; /*Deikths pou deixnei sto epomeno mail....*/
};

typedef struct mail MAIL;
typedef MAIL *MAILPTR;

struct mailbox{
MAILPTR head;
};

typedef struct mailbox MAILBOX;


MAILPTR add_to_list(MAILPTR);
void show_list(MAILPTR);
void free_memory_list(MAILPTR);


int main(int argc, char *argv[] )
{
   
   int ep=0;
   int i,j,k;
   struct user users[TOT_USERS];
							 
strcpy(users[0].login,"chiotie");
strcpy(users[1].login,"mourtzik");
strcpy(users[2].login,"ichatz");

user currentUser;

   printf("Oi xrhstes tou susthmatos einai....:\n");
   for(i=0;i<TOT_USERS;i++) {
   printf("%s\n", users[i].login);//emfanisi olwn twn xrhstwn tou sustimatos
}
   
   MAILBOX mailboxes[TOT_USERS]; /*3 listes osoi einai kai oi users*/
   
   for(j=0;j<TOT_USERS;j++)
   {
           mailboxes[j].head=NULL;  /*Arxikopoiw me NULL tous deiktes kefalis kai twn 3 mailbox...*/
   }
   //MAILPTR newMailPtr=NULL; 
   MAILPTR current=NULL;
   printf("Eisigage to login sou:\n");    /*Grafei sthn grammh edolwn to login tou*/

fgets(currentUser.login,LOGIN_SIZE,stdin); /*Pernei to login pou eisagoume apo to pliktrologio kai to kataxwrei 
										   sto pedio login ths struct currentUser*/
										   
printf("O xrhsths pou etoimazete na sundethei einai o %s\n",currentUser.login);  

   if(currentUser.login[strlen(currentUser.login)-1]=='\n')
       currentUser.login[strlen(currentUser.login)-1]='\0'; 			 
   int cp;
   int met;
  	for(k=0;k<TOT_USERS;k++)
{
        if(cp=strcmp(users[k].login,currentUser.login)==0)
		{
                 met=k;
                 printf("Dektos xrhsths\n");
                  
                 while(ep<2)
                 {                                                                           
                     [b][i][u] mailboxes[met].head=add_to_list(mailboxes[met].head);[/u][/i][/b]
                      ep++;
                 }//while
                     show_list(mailboxes[met].head);  
           }//if
           }
           free_memory_list(mailboxes[met].head);
           printf("Adeia lista\n");
          printf("XAXAXA!!!EKANES LATHOS LOGIN....\n");

  /* Dx: End of program */
 
} 

/**********FUNCTIONS IMPLEMENTATIONS*****************************/


[b][size="4"]MAILPTR add_to_list(MAILPTR first)[/size][/b]
{
   user currentUser;
    char buf[15];
    char buffer[250];   
    MAILPTR newMailPtr=NULL; 
    newMailPtr=(MAILPTR)calloc(1,sizeof(MAIL));
    
    newMailPtr->next=first;
    strcpy(newMailPtr->sender.login,currentUser.login);
    /*newMailPtr=newMailPtr->next;*/
    printf("Eisigage ton paralipth tou mail:\n");
    fgets(buf,15,stdin);
    strcpy(newMailPtr->receiver.login,buf);
    /*newMailPtr=newMailPtr->next;*/
    printf("Eisigage ton periexomeno  tou mail:\n");
    fgets(buffer,250,stdin);
    strcpy(newMailPtr->body,buffer);
    first=newMailPtr;
}
  
    
void show_list(MAILPTR first)
{
    MAILPTR newMailPtr;
    newMailPtr=first;
  
   while(newMailPtr!=NULL)
   {
   static int nListIndex = 0; /* Dx: Struct/List Counter (N-1) */
       int nPrevStructAddr;
       printf(" List Index: %.2d\n",nListIndex++);

       printf(" ->%s \n ->%s \n ->%s ",newMailPtr->sender.login,
                                newMailPtr->receiver.login,
                                newMailPtr->body);

       /* Dx: Copy current MAILPTR address on nPrevStructAddr */
       //nPrevStructAddr=(int)newMailPtr;
       newMailPtr=newMailPtr->next;
       
   }
}
    

void free_memory_list(MAILPTR first)   
{
    MAILPTR newMailPtr;
    MAILPTR next;
    newMailPtr=first;
    while(newMailPtr!=NULL)
    {
         next=newMailPtr->next;
         free(newMailPtr);
         newMailPtr=next;
    }
}

 

Εχω όμως κάποιο πρόβλημα με την συναρτηση add_to_list.Θα ηθελα να ρωτήσω αν είναι σωστο που τηνν καλώ και επστρέφει τον δείκτη κεφαλής?Και στην συνεχεια όταν εισάγω δεδομένα ,δεν μου τα εμφανίζει όπως περιμένω.Καμια ιδέα τι έχω κάνει λάθος στην συναρτηση προσθηκης στην λίστα??

Ευχαριστώ για κάθε βοήθεια:-)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ευχαριστω πάρα πολυ για την πολυτιμη βοηθεια γιατι με κάνει να ασχολούμαι και να ψάχνω ακόμα πιο πού και με ενδιαφερει να μάθω:-)

 

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

 

 

>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>	
#define LOGIN_SIZE 15 
#define TOT_USERS 3  
#define BODY_SIZE 250 

typedef struct user {
char login[LOGIN_SIZE];
} user;

/*Domi Mail*/
struct mail {
struct user sender; /*Apostoleas*/
struct user receiver;/*paralipths*/
char body[bODY_SIZE];/*To swma tou mail*/
struct mail *next; /*Deikths pou deixnei sto epomeno mail....*/
};

typedef struct mail MAIL;
typedef MAIL *MAILPTR;

struct mailbox{
MAILPTR head;
};

typedef struct mailbox MAILBOX;


MAILPTR add_to_list(MAILPTR);
void show_list(MAILPTR);
void free_memory_list(MAILPTR);


int main(int argc, char *argv[] )
{
   
   int ep=0;
   int i,j,k;
   struct user users[TOT_USERS];
							 
strcpy(users[0].login,"chiotie");
strcpy(users[1].login,"mourtzik");
strcpy(users[2].login,"ichatz");

user currentUser;

   printf("Oi xrhstes tou susthmatos einai....:\n");
   for(i=0;i<TOT_USERS;i++) {
   printf("%s\n", users[i].login);//emfanisi olwn twn xrhstwn tou sustimatos
}
   
   MAILBOX mailboxes[TOT_USERS]; /*3 listes osoi einai kai oi users*/
   
   for(j=0;j<TOT_USERS;j++)
   {
           mailboxes[j].head=NULL;  /*Arxikopoiw me NULL tous deiktes kefalis kai twn 3 mailbox...*/
   }
   //MAILPTR newMailPtr=NULL; 
   MAILPTR current=NULL;
   printf("Eisigage to login sou:\n");    /*Grafei sthn grammh edolwn to login tou*/

fgets(currentUser.login,LOGIN_SIZE,stdin); /*Pernei to login pou eisagoume apo to pliktrologio kai to kataxwrei 
										   sto pedio login ths struct currentUser*/
										   
printf("O xrhsths pou etoimazete na sundethei einai o %s\n",currentUser.login);  

   if(currentUser.login[strlen(currentUser.login)-1]=='\n')
       currentUser.login[strlen(currentUser.login)-1]='\0'; 			 
   int cp;
   int met;
  	for(k=0;k<TOT_USERS;k++)
{
        if(cp=strcmp(users[k].login,currentUser.login)==0)
		{
                 met=k;
                 printf("Dektos xrhsths\n");
                  
                 while(ep<2)
                 {                                                                           
                     [b][i][u] mailboxes[met].head=add_to_list(mailboxes[met].head);[/u][/i][/b]
                      ep++;
                 }//while
                     show_list(mailboxes[met].head);  
           }//if
           }
           free_memory_list(mailboxes[met].head);
           printf("Adeia lista\n");
          printf("XAXAXA!!!EKANES LATHOS LOGIN....\n");

  /* Dx: End of program */
 
} 

/**********FUNCTIONS IMPLEMENTATIONS*****************************/


[b][size="4"]MAILPTR add_to_list(MAILPTR first)[/size][/b]
{
   user currentUser;
    char buf[15];
    char buffer[250];   
    MAILPTR newMailPtr=NULL; 
    newMailPtr=(MAILPTR)calloc(1,sizeof(MAIL));
    
    newMailPtr->next=first;
    strcpy(newMailPtr->sender.login,currentUser.login);
    /*newMailPtr=newMailPtr->next;*/
    printf("Eisigage ton paralipth tou mail:\n");
    fgets(buf,15,stdin);
    strcpy(newMailPtr->receiver.login,buf);
    /*newMailPtr=newMailPtr->next;*/
    printf("Eisigage ton periexomeno  tou mail:\n");
    fgets(buffer,250,stdin);
    strcpy(newMailPtr->body,buffer);
    first=newMailPtr;
}
  
    
void show_list(MAILPTR first)
{
    MAILPTR newMailPtr;
    newMailPtr=first;
  
   while(newMailPtr!=NULL)
   {
   static int nListIndex = 0; /* Dx: Struct/List Counter (N-1) */
       int nPrevStructAddr;
       printf(" List Index: %.2d\n",nListIndex++);

       printf(" ->%s \n ->%s \n ->%s ",newMailPtr->sender.login,
                                newMailPtr->receiver.login,
                                newMailPtr->body);

       /* Dx: Copy current MAILPTR address on nPrevStructAddr */
       //nPrevStructAddr=(int)newMailPtr;
       newMailPtr=newMailPtr->next;
       
   }
}
    

void free_memory_list(MAILPTR first)   
{
    MAILPTR newMailPtr;
    MAILPTR next;
    newMailPtr=first;
    while(newMailPtr!=NULL)
    {
         next=newMailPtr->next;
         free(newMailPtr);
         newMailPtr=next;
    }
}

 

Εχω όμως κάποιο πρόβλημα με την συναρτηση add_to_list.Θα ηθελα να ρωτήσω αν είναι σωστο που τηνν καλώ και επστρέφει τον δείκτη κεφαλής?Και στην συνεχεια όταν εισάγω δεδομένα ,δεν μου τα εμφανίζει όπως περιμένω.Καμια ιδέα τι έχω κάνει λάθος στην συναρτηση προσθηκης στην λίστα??

Ευχαριστώ για κάθε βοήθεια:-)

 

Ο παρακάτω κώδικας είναι γραμμένος με μία πρόχειρη ματιά στον κώδικα σου, εννοώ στον ορισμό των δομών σου κτλ, δεν τον έχω δοκιμάσει με τον κωδικά σου να δω ότι τρέχει σίγουρα αλλά υποθέτω πως τρέχει αν τον προσθέσεις. Σου προσθέτω 2 συναρτήσεις, η πρώτη δημιουργεί πάντα ένα κόμβο με βάση τα στοιχεία που του δίνεις δηλαδή όταν θα την καλείς θα δίνεις:

>
CreateMailNode("Kostas", "Giannis", "This is a simple text in our mail");

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

>
strcpy(newMailPtr->sender.login,currentUser.login);

Δεν ξέρω μπορεί να μην έχω καταλάβει καλά την άσκηση σου αλλά το currentUser.login από που το παίρνει;Έιναι κάτι global και δεν το έχω δει; Θεωρώ πως τα έχεις μπλέξει λίγο γιατί μέσα στην συνάρτηση δεν θα το βλέπει, δεν ξέρω είναι και πρωί....

 

Τέλος πάντων ορίστε ο κώδικας:

 

>
MAILPTR CreateMailNode(const char *sender, const char *reciever, const char *body)
{
MAILPTR nMAil = calloc(1, sizeof(MAIL));
if(nMail == NULL)
{
	fprintf(stderr,"CreateMailNode():Memory Fault.\n");
	return NULL;
}
else
{
	if(sender)
		strcpy(nMail->sender.login, sender);
	if(reciever)
		strcpy(nMail->reciever.login, reciever);
	if(body)
		strcpy(nMail->body, body);
	/* Point to nowhere. */
	nMail->next = NULL;
	/* Return our pointer. */
	return nMail;
}
}

/* Add some elements into your list. */

int add_to_list(MAILBOX nList, const char *sender, const char *reciever, const char *body)
{
if(!nList)
	return -1;
else
{
	/* Create Our Node */
	MAILPTR nMail = CreateMailNode(sender, reciever, body);
	if(nList->head == NULL)
		nList->head = nMail;
	else
	{
		nMAil->next = nList->head;
		nList->head = nMail;
	}
	/*In Both cases return successfully. */
	return 0;
}

}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Φίλε αν σου είναι εύκολο, επειδή μου φαίνεται πολύ ενδιαφέρον αυτό που κάνεις, μπορείς να μου εξηγήσεις τον λόγο ύπαρξης του παρακάτω;

 

>
typedef struct mail MAIL;
typedef MAIL *MAILPTR;

 

Άν κατάλαβα καλά, δηλώνεις τον pointer *MAILPTR στη struct mail (την οποία έχεις ονομάσει μέσω της typedef MAIL);

 

Άν ναι, τότε αυτό γιατί δεν το έκανες προηγουμένος κατα την αρχική δήλωση της struct;

 

Θα είχε κάποια διαφορά αν το δήλωνες μέσα στη struct προηγουμένως, παραλείποντας έτσι το typedef MAIL *MAILPTR;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Φίλε αν σου είναι εύκολο, επειδή μου φαίνεται πολύ ενδιαφέρον αυτό που κάνεις, μπορείς να μου εξηγήσεις τον λόγο ύπαρξης του παρακάτω;

 

>
typedef struct mail MAIL;
typedef MAIL *MAILPTR;

 

Άν κατάλαβα καλά, δηλώνεις τον pointer *MAILPTR στη struct mail (την οποία έχεις ονομάσει μέσω της typedef MAIL);

 

Άν ναι, τότε αυτό γιατί δεν το έκανες προηγουμένος κατα την αρχική δήλωση της struct;

 

Θα είχε κάποια διαφορά αν το δήλωνες μέσα στη struct προηγουμένως, παραλείποντας έτσι το typedef MAIL *MAILPTR;

 

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

Δηλαδή κάνοντας:

 

typedef char* PtrChar;

 

κατεθείαν αν θέλεις να ορίσεις ένα δείκτη σε χαρακτήρα λες PtrChar ptr;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Βασικά εννοούσα το παρακάτω:

 

>

struct mail {
struct user sender; /*Apostoleas*/
struct user receiver;/*paralipths*/
char body[bODY_SIZE];/*To swma tou mail*/
struct mail *next; /*Deikths pou deixnei sto epomeno mail....*/
struct mail *MAILPTR;
};



typedef struct mail MAIL;

 

 

Το ίδιο δεν είναι;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Βασικά εννοούσα το παρακάτω:

 

>

struct mail {
struct user sender; /*Apostoleas*/
struct user receiver;/*paralipths*/
char body[bODY_SIZE];/*To swma tou mail*/
struct mail *next; /*Deikths pou deixnei sto epomeno mail....*/
struct mail *MAILPTR;
};



typedef struct mail MAIL;

 

 

Το ίδιο δεν είναι;

 

 

 

Adi na grapseis to parapanw mporeis na oriseis thn struct mail etsi

>
typedef struct mail {
struct user sender; /*Apostoleas*/
struct user receiver;/*paralipths*/
char body[bODY_SIZE];/*To swma tou mail*/
struct mail *next; /*Deikths pou deixnei sto epomeno mail....*/
struct mail *MAILPTR;
};MAIL
struct mail *MAILPTR;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

To struct mail *MAILPTR; γιατί το έγραψες και στη struct, και το ξαναδήλωσες μετά απο τον ορισμό της; πιο λιανά, γιατί το έγραψες 2 φορές;

 

 

Λάθος μου που το γραψα 2 φορες!

Συνεχίζοντας με υπομονή να προσπαθώ να φτίαξω την λίστα όπως την έχω σκεφτεί

>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>	
#define LOGIN_SIZE 15 
#define TOT_USERS 3  
#define BODY_SIZE 250 

typedef struct user {
char login[LOGIN_SIZE];
} user;

/*Domi Mail*/
struct mail {
struct user sender; /*Apostoleas*/
struct user receiver;/*paralipths*/
char body[bODY_SIZE];/*To swma tou mail*/
struct mail *next; /*Deikths pou deixnei sto epomeno mail....*/
};

typedef struct mail MAIL;
typedef MAIL *MAILPTR;

struct mailbox{
MAILPTR head;
};

typedef struct mailbox MAILBOX;

MAILPTR CreateMailNode(MAIL) ;
int add_to_list( MAIL,MAILPTR); 
void show_list(MAILPTR);
void free_memory_list(MAILPTR);


int main(int argc, char *argv[] )
{
   
   int ep=0;
   char buf[15];
    char buffer[250];   
   struct user users[TOT_USERS];
							 
strcpy(users[0].login,"chiotie");
strcpy(users[1].login,"mourtzik");
strcpy(users[2].login,"ichatz");

user currentUser;


   printf("Oi xrhstes tou susthmatos einai....:\n");
   for(int i=0;i<TOT_USERS;i++) {
   printf("%s\n", users[i].login);//emfanisi olwn twn xrhstwn tou sustimatos
}
   
   MAILBOX mailboxes[TOT_USERS]; /*3 listes osoi einai kai oi users*/
   
   for(int i=0;i<TOT_USERS;i++)
   {
           mailboxes[i].head=NULL;  /*Arxikopoiw me NULL tous deiktes kefalis kai twn 3 mailbox...*/
   }
   //MAILPTR newMailPtr=NULL; 
   //MAILPTR current=NULL;
   printf("Eisigage to login sou:\n");    /*Grafei sthn grammh edolwn to login tou*/

fgets(currentUser.login,LOGIN_SIZE,stdin); /*Pernei to login pou eisagoume apo to pliktrologio kai to kataxwrei 
										   sto pedio login ths struct currentUser*/
										   
printf("O xrhsths pou etoimazete na sundethei einai o %s\n",currentUser.login);  /*Emfanizei ton xrhsth pou ekane
																				 aithsh gia na sundethei*/
   int cp;
   int met;
  	for(int k=0;k<TOT_USERS;k++)
{
        if(cp=strncmp(users[k].login,currentUser.login,4)==0)
		{
                 met=k;
                 printf("Dektos xrhsths\n");
                  
                 while(ep<2)
                 {     
                        MAIL newmail;  
                        printf("Eisigage ton paralipth tou mail:\n"); 
                        fgets(buf,15,stdin);  
                        printf("Eisigage ton periexomeno  tou mail:\n");
                        fgets(buffer,250,stdin);                                                              
                        add_to_list(newmail,mailboxes[met].head);
                        ep++;
                 }//while
                  show_list(mailboxes[met].head);  
           }//if
           }
           free_memory_list(mailboxes[met].head);
           printf("Adeia lista\n");
          printf("XAXAXA!!!EKANES LATHOS LOGIN....\n");

  /* Dx: End of program */
 
} 

/**********FUNCTIONS IMPLEMENTATIONS*****************************/


MAILPTR CreateMailNode(MAIL newmail) 
{ 
   MAILPTR newMailPtr;
   user currentUser;
   char buf[15];
   char buffer[250]; 
   newMailPtr= (MAILPTR)calloc(1, sizeof(MAIL)); 
   if(newMailPtr == NULL) 
   { 
       fprintf(stderr,"CreateMailNode():Memory Fault.\n"); 
       return NULL; 
   } 
   else 
   {      strcpy(newMailPtr->sender.login,currentUser.login);
          
           printf("Eisigage ton paralipth tou mail:\n"); 
           fgets(buf,15,stdin);  
           strcpy(newMailPtr->receiver.login, buf);   
           printf("Eisigage ton periexomeno  tou mail:\n");
           fgets(buffer,250,stdin);   
          strcpy(newMailPtr->body, buffer); 
       /* Point to nowhere. */ 
       newMailPtr->next = NULL; 
       /* Return our pointer. */ 
       return newMailPtr; 
   } 
} 

/* Add some elements into your list. */ 

int add_to_list( MAIL newmail,MAILPTR head) 
{  
      MAILPTR newMailPtr ;
       /* Create Our Node */ 
      newMailPtr = CreateMailNode(newmail); 
       if(head->next == NULL) 
         head->next = newMailPtr; 
       else 
       { 
           newMailPtr->next = head->next; 
           head->next = newMailPtr; 
       } 
       /*In Both cases return successfully. */ 
       return 0; 

} 

void show_list(MAILPTR first)
{
    MAILPTR newMailPtr;
    newMailPtr=first;
  
   while(newMailPtr!=NULL)
   {
   static int nListIndex = 0; /* Dx: Struct/List Counter (N-1) */
       int nPrevStructAddr;
       printf(" List Index: %.2d\n",nListIndex++);

       printf(" ->%s \n ->%s \n ->%s ",newMailPtr->sender.login,
                                newMailPtr->receiver.login,
                                newMailPtr->body);

       /* Dx: Copy current MAILPTR address on nPrevStructAddr */
       //nPrevStructAddr=(int)newMailPtr;
       newMailPtr=newMailPtr->next;
       
   }
}
    

void free_memory_list(MAILPTR first)   
{
    MAILPTR newMailPtr;
    MAILPTR next;
    newMailPtr=first;
    while(newMailPtr!=NULL)
    {
         next=newMailPtr->next;
         free(newMailPtr);
         newMailPtr=next;
    }
}
    

Αλλαξα πάλι τις συναρτήσεις σου αλλα και πάλιιιιι δεν γίνετε εισαγωγή στην λίστα!

 

Μηπως μπορεί κάποιος να με βοηθήσει επισαπτωνατς ένα καλό tutorial???Να μάθω καλή C και να καταάβω επιτελους τι γίνετε με την λιστα:mad::rolleyes:

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Οφείλω να ομολογήσω ότι τα έχεις μπλέξει λίγο με τα ονόματα των δομών και λιστών.

 

Αρχικά ως MAILPTR ορίζεις τον κόμβο σου με δείκτη δηλαδή το MAIL*, αν έχω καταλάβει σωστά.

 

Μετά η λίστα σου είναι MAILBOX οπότε για να ορίσεις μια λίστα, θα κάνεις το εξής:

 

MAILBOX *CreateList();

 

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

MAIL newMail γιατί το βάζεις, νομίζω δεν το χρησιμοποιείς καν στην συνάρτηση σου.

Η συνάρτηση αυτή να αλλαχθεί σε MAILPTR CreateMailNode() και τα άλλα άστα ίδια.

Τι ίδια;

Στο σημείο που λες strcpy(newMailPtr->sender.login,currentUser.login); από που σκατά το παίρνει η συνάρτηση το currentUser.login, μία συνάρτηση δεν μπορεί να γνωρίζει τι κάνεις εσύ στην main() δηλαδή το currentUser που έχεις δημιουργήσει εσύ κάπου στην main() δεν μπορεί να το πάρει, δεν γνωρίζει την ύπαρξη του. Τελείως άκυρο. Σβήστο κάνε κάτι άλλο.

Μετά στην add_to_list, πρώτον δεν περνάς μέσα την λίστα σου ή δεν έχω καταλάβει ακριβώς πως την περνάς και γενικά είναι η συνάρτηση όλη λάθος και δεν μπορώ να μπω στην διαδικασία να αλλάζω όλα γιατί θα τα κάνω μπάχαλο, λογικό πάντως να μην δουλεύει καθόλου. Θα σου στείλω ένα κώδικα που θα γράψω για τις λίστες ένα tutorial μικρό για να καταλάβεις. Αλλά δεν πάει καλά η άσκηση με τον τρόπο που γράφεις, θα προσπαθήσω να βοηθήσω.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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