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

Λιστες σε C


fonsde

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

Δημοσ.

Πως γραφουμε την συναρηση που Διαγράφει την λίστα των τηλεφώνων της επαφής και κατόπιν τον

τρέχοντα κόμβο επαφής.

 

>typedef struct NodeEpafis * ListaEpafwnPtr;
typedef struct NodeTilefonou *ListaTilefononPtr;

typedef struct NodeTilefonou {
ListaTilefononPtr Prev, Next;
ListaEpafwnPtr Epafes;
char type;
   char * PhoneNumber;
} NodeTilefonou;

typedef struct NodeEpafis {
ListaEpafwnPtr Prev, Next, Trexon;
char *name;
   ListaTilefononPtr Phones;
} NodeEpafis;

 

Εχουμε την λιστα επαφων οπου καθε επαφη εχει μια δικια της λιστα με τα τηλεφωνα της επαφης. Διπλα συνδεδεμενες- κυκλικες

Δημοσ.
>
typedef struct NodeTilefonouStruct {
   struct NodeTilefonouStruct *Prev, *Next;
   char type;
   char * PhoneNumber;
} NodeTilefonou;

typedef struct NodeEpafisStruct {
   struct NodeEpafisStruct *Prev, *Next;
   char *name;
   NodeTilefonou *Phones;
} NodeEpafis;

void deletePhone(NodeTilefonou *t) {
    if(t == NULL)
         return;
    
    deletePhone(t->Next);
    free(t);
}
    

void deleteContact(NodeEpafis *epafi) {
    deletePhone(epafi->Phones);
    if(epafi->Prev != NULL)
         epafi->Pref->Next = epafi->Next;
    
    if(epafi->Next != NULL)
         epafi->Next->Prev = epafi->Prev;
    free(epafi);
}

Δημοσ.

Ευχαριστω.

 

Κατι ακομα θελω συναρτηση που Δέχεται ένα όνομα και εισάγει νέο κόμβο επαφής στην σωστή θεση(ταξηνομημενα αλφαβητικα).

 

Αυτο που εχω γραπσει ειναι να εισαγει νεο κομβο επαφης αλλα οχι στην σωστη θεση

 

>void eisagwgi_komvou (ListaEpafwnPtr * const lista, char *stoixeio, ListaEpafwnPtr prodeiktis)
{	

ListaEpafwnPtr prosorinos; /*Points the new node that is going to be inserted*/
	if (prodeiktis != NULL) {
	prosorinos = malloc(sizeof(NodeEpafis));
	prosorinos->name = malloc( (strlen(stoixeio)+1)*sizeof(char));
	strcpy (prosorinos->name, stoixeio);
	
	prosorinos->Prev = prodeiktis;
	prosorinos->Next = prodeiktis->Next;
	prodeiktis->Next = prosorinos;
	if (prosorinos->Next!=NULL)  /*if it's not the last node*/
		prosorinos->Next->Prev = prosorinos;
	else (*lista)->Prev = prosorinos;
   
   }
else printf("list eisafwgi meta. Prodeiktis is NULL. Den egine eisafwgi\n");
}

Δημοσ.

Υπάρχουν αρκετοί αλγόριθμοι που μπορείς να χρησιμοποιήσεις, και δεν ξέρω αν σας έχουν πει να υλοποιήσετε κάποιον συγκεκριμένο, αν και δεν νομίζω αφού απ'ότι κατάλαβα τώρα μαθαίνετε δείκτες και λίστες. Ο πιο απλός τρόπος πάντως (όχι τόσο αποδοτικός βέβαια σε μεγάλες λίστες με πάρα πολλούς κόμβους) είναι η σειριακή αναζήτηση. Δηλαδή ξεκινάς από το πρώτο στοιχείο της λίστας και προχωράς μέχρι να βρεις το επιθυμητό (το σημείο που θέλεις να εισάγεις δηλαδή). Επειδή εσύ τα θέλεις αλφαβητικά ταξινομημένα, η σύγκριση θα γίνεται μέσω της strcmp()

int strcmp( const char *str1, const char *str2 );

 

>
ListaEpafwnPtr findPosition(ListaEpafwnPtr firstElement, char *newName) {

    ListaEpafwnPtr tempPtr = firstElement;

    while(tempPtr != NULL) {
         if(strcmp(newName, tempPtr->name) > 0)
              return tempPtr->Prev;
         if(tempPtr->Next == NULL)
              return tempPtr;
         tempPtr = tempPtr->Next;
    }
    return tempPtr;
}

 

Η παραπάνω συνάρτηση επιστρέφει τον 'prodeikti' σύμφωνα με τη δική σου υλοποίηση. Αν σου επιστρέψει NULL τότε το στοιχείο πρέπει να εισαχθεί στην αρχή της λίστας (είτε αυτή περιέχει άλλα στοιχεία είτε είναι άδεια). Αυτό πρέπει να το διορθώσεις και στη δική σου συνάρτηση εισαγωγής. Αν ο προδείκτης είναι NULL τότε είτε το στοιχείο εισάγεται πρώτο είτε δεν υπάρχουν άλλα στοιχεία στη λίστα, οπότε θα είναι το μοναδικό. Μιλάω για το else που έχεις στο οποίο κάνεις printf.

 

Ελπίζω να βοήθησα.

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

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

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