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

Απλή συνδεδεμένη λίστα σε C. (συνάρτηση εισαγωγής ταξινομημένων κόμβων)


pbp

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

Δημοσ.

Γεια σας,

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

Το θέμα είναι ότι ο πρώτος κόμβος δεν ταξινομείται ενώ όλοι οι υπόλοιποι ταξινομούνται. Μπορεί να βοηθήσει κάποιος? Ευχαριστώ.

>stoixeia *insert_node(char name[],char surname[],char mob[],char addr[],stoixeia *head)
{
        stoixeia *neos,*p=head;
        neos=(stoixeia*)malloc(sizeof(stoixeia));
        strcpy(neos->onoma,name);
        strcpy(neos->eponumo,surname);
        strcpy(neos->kinito,mob);
        strcpy(neos->dieuthinsi,addr);
        if(head==NULL)
        {
                      neos->next=head;
                      return neos;
        }
        else
        {
                      while (p->next!=NULL && strcmp(p->next->eponumo,surname)==-1)
                      {
                                 p=p->next;
                      }
                      neos->next=p->next;
                      p->next=neos;
                      return head;
        }
}

 

Η συνάρτηση καλείται στη main() με αυτόν τον τρόπο:

>head=insert_node(name,surname,mob,addr,head);

Δημοσ.

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

 

Θα χρειαστεί να το προσαρμόσεις στον δικό σου (π.χ. εγώ την περνάω και την διαχειρίζομαι by reference τη λίστα ή π.χ. εγώ επιστρέφω boolean τιμή αντί για την αρχή της λίστας) αλλά πιστεύω θα σε βοηθήσει στο θέμα τη λογικής ροής:

 

>
/* ------------------------------------------------------------------
* Ascending order Insertion of 'data' into 'list'
*/
Bool list_insascend( List **list, int data )
{
List *head = NULL, *prev = NULL;
List *new = calloc( 1, sizeof(struct node) );
if ( !new )
	return FALSE;

new->data = data;
new->next = NULL;

if ( !*list ) {
	*list = new;
	return TRUE;
}

head = prev = *list;
// find spot for the insertion
while ( head && head->data < data ) {	// change to <= data, to allow duplicates
	prev = head;			// save previous node
	head = head->next;
}
// insert BEFORE 1st node
if ( *list == head ) {					
	*list = new;
	new->next = head;
	return TRUE;
}
// insert AFTER 1st node
if ( !head || head->data != data ) {	
	prev->next = new;
	new->next = head;
}

return TRUE;
}

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

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

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