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

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

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

  • 0
MauriDalia

Linked LIST in C

Ερώτηση

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

 

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

 

>
#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 πεδια ειναι το πρωτο στοιχειο της λιστας μου..

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

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


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

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

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

 

>
typedef struct mail MAIL;
typedef MAIL *MAILPTR;

 

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

 

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

 

Θα είχε κάποια διαφορά αν το δήλωνες μέσα στη struct προηγουμένως, παραλείποντας έτσι το typedef 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 μικρό για να καταλάβεις. Αλλά δεν πάει καλά η άσκηση με τον τρόπο που γράφεις, θα προσπαθήσω να βοηθήσω.

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


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

 

>
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;

 

 

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

 

 

 

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;

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


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

Τελική μορφή και με την συνάρτηση που αφαιρεί κόμβο από την λίστα σου, καλή συνέχεια.

 

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

#define LOGIN_SIZE 15
#define BODY_SIZE 250

/* Structure to hold our List node. */
typedef struct _user{
char login[LOGIN_SIZE];
}User;

typedef struct mail{
User sender;
User reciever;
char body[bODY_SIZE];
struct mail *next;

}MAIL;

/* List. */

typedef struct _MailList{
MAIL *head;
MAIL *tail;
int size;
}MailList;

MailList *CreateMailList(int HowMany)
{
MailList *list = malloc(HowMany *sizeof(MailList));
if(!list)
{
	fprintf(stderr,"ErrorReporter:Error Memory Fault.\n");
	return NULL;
}
else
{
	/* Initialise List. */
	int i;
	for(i = 0; i < HowMany; i++)
	{
		list[i].head = NULL;
		list[i].tail = NULL;
		list[i].size = 0;
	/* Return List. */
	}
	if(i == HowMany)
		return list;
}
}
/* Insert a new mail after the element mail. */
int Insert_After_Element(MailList *list, MAIL *element)
{
if(!list)
{
	fprintf(stderr,"ErrorReporter:Error List NULL.\n");
	return -1;
}
else
{
	/* Create a new Node. */
	MAIL *newMail = malloc(sizeof(MAIL));
	if(!newMail)
	{
		fprintf(stderr,"ErrorReporter:Error Memory Fault.\n");
		return -2;

	}
	else
	{
		/* Init new Mail. */
		printf("Enter the New Mail's Data:\n");
		printf("Enter Sender Login:");
		fgets(newMail->sender.login, sizeof(newMail->sender.login), stdin);
		printf("Enter Reciever Login:");
		fgets(newMail->reciever.login, sizeof(newMail->reciever.login), stdin);
		printf("Enter Body Message:");
		fgets(newMail->body, sizeof(newMail->body), stdin);
		printf("\n");
		/* Point nowhere initially. */
		newMail->next = NULL;
		/* Should trim if you want from all the '\n' character of fgets. */
		if(!element)
		{
			if(list->size == 0)
			{
				list->tail = newMail;
				list->head = newMail;
				newMail->next = NULL;
			}
			else
			{
				newMail->next = list->head;
				list->head = newMail;
			}
		}
		else
		{
			if(element->next == NULL)
			{
				list->tail = newMail;
				newMail->next = NULL;
			}
			/* Otherwhise. */
			newMail->next = element->next;
			element->next = newMail;
		}
		/* Advance list size. */
		list->size++;
		/* Return with zero. */
		return 0;
	}
}
}

void DumpMailList(MailList *list)
{
if(list)
{
	MAIL *mailptr = NULL;
	printf("List Print:\n\n");
	for(mailptr = list->head; mailptr != NULL; mailptr = mailptr->next)
	{
		printf("SenderLogin:%sRecieverLogin:%sBodyText:%s\n", mailptr->sender.login, mailptr->reciever.login, mailptr->body);
	}
}
}

/* Remove A mail from List. */

int Remove_Mail(MailList *list, MAIL *element, MAIL **data)
{
if(!list)
{
	fprintf(stderr,"ErrorReporter:Error List NULL.\n");
	return -1;
}
else
{
	/* Pointer to the item to be Deleted from the list. */
	MAIL *mailtobeDeleted = NULL;
	if(list->size == 0)
	{
		printf("ErrorReporter:Error Empty List.\n");
		return -2;
	}
	else
	{

           /* Create a ptr to the item to be removed so to restore it. */
		   MAIL *ptr = malloc(sizeof(MAIL));

		if(element == NULL)
		{
		   /* Copy Struct. */
		   memcpy(ptr, list->head, sizeof(MAIL));
		   /* Return it. */
		   *data = ptr;
		   mailtobeDeleted = list->head;
		   list->head = list->head->next;
		   if(list->size == 1)
				list->tail = NULL;
		}
		else
		{
			if(element->next == NULL)
				return -3;
			/* Case not null. */
			memcpy(ptr, element->next, sizeof(MAIL));
			*data = ptr;
			mailtobeDeleted = element->next;
			/* Go to the next one. */
			element->next = element->next->next;
			if(element->next == NULL)
				list->tail = element;
		}
		/* Free the mail. */
		free(mailtobeDeleted);
		/* Minus the size list. */
		list->size--;
		/*Return with zero. */
		return 0;
	}
}

}

int main(int argc, char* argv[])
{
MAIL *removed = NULL;
MailList *theList = NULL;
/* Create A single List. */
theList = CreateMailList(1);
/* Insert in head always. */
Insert_After_Element(theList, NULL);
Insert_After_Element(theList, NULL);
Insert_After_Element(theList, NULL);
DumpMailList(theList);
/* Remove a mail from the head, the first mail. */
Remove_Mail(theList, NULL, &removed);
DumpMailList(theList);
printf("\n");
printf("Mail that was removed from list was:\n");
printf("SenderLogin:%sRecieverLogin:%sBodyText:%s\n", removed->sender.login, removed->reciever.login, removed->body);
printf("Hit enter to continue....");
getchar();
return 0;
}
//---------------------------------------------------------------------------

 

Εκτυπωμένα αποτελέσματα:

 

Enter the New Mail's Data:

Enter Sender Login:Kostas

Enter Reciever Login:Maria

Enter Body Message:Geia soy maria ti kaneis?

 

Enter the New Mail's Data:

Enter Sender Login:Maria

Enter Reciever Login:Kostas

Enter Body Message:Kala kwsta moy esy?

 

Enter the New Mail's Data:

Enter Sender Login:Kostas

Enter Reciever Login:Maria

Enter Body Message:Edw katse na sbisw to prwto minima!!!

 

List Print:

 

SenderLogin:Kostas

RecieverLogin:Maria

BodyText:Edw katse na sbisw to prwto minima!!!

 

SenderLogin:Maria

RecieverLogin:Kostas

BodyText:Kala kwsta moy esy?

 

SenderLogin:Kostas

RecieverLogin:Maria

BodyText:Geia soy maria ti kaneis?

 

List Print:

 

SenderLogin:Maria

RecieverLogin:Kostas

BodyText:Kala kwsta moy esy?

 

SenderLogin:Kostas

RecieverLogin:Maria

BodyText:Geia soy maria ti kaneis?

 

 

Mail that was removed from list was:

SenderLogin:Kostas

RecieverLogin:Maria

BodyText:Edw katse na sbisw to prwto minima!!!

 

Hit enter to continue....

 

Περιμένω σχόλια σου....

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


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

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

 

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

 

 

>
#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.Θα ηθελα να ρωτήσω αν είναι σωστο που τηνν καλώ και επστρέφει τον δείκτη κεφαλής?Και στην συνεχεια όταν εισάγω δεδομένα ,δεν μου τα εμφανίζει όπως περιμένω.Καμια ιδέα τι έχω κάνει λάθος στην συναρτηση προσθηκης στην λίστα??

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

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


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

:-D

 

Απιστευτο και το προγραμμα και οι παρατηρησεις σου!!!!Πηρες και χαρα απο τον ολυμπιακο!:mrgreen:

 

Εχασε βεβαια η ΑΕΚΑΡΑ:cry:

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


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

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

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


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

To struct mail *MAILPTR; γιατί το έγραψες και στη struct, και το ξαναδήλωσες μετά απο τον ορισμό της; πιο λιανά, γιατί το έγραψες 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 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;
}

}

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


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

Υπήρχαν αρκετά λάθει στην διαχείριση μνήμης και στην εισαγωγή δεδομένων, μάλιστα κάποια από αυτά θα έπρεπε να τα είχε πιάσει αυτόματα ο 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

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


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

Το 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;
}

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


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

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

 

>

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;

 

 

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

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


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