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

2-3 δέντρα


morgankalamos

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

Δημοσ.

Γεια σας! πολυ συνοπτικα ενας καθηγητης μας στην σχολη μας εβαλε μια ασκηση για 2-3 δεντρα,χωρις να μας εχει δείξει κάποια βασικά βήματα για το τι είναι τα 2-3 δέντρα.... :S εχω καποιες βασικες γνωσεις πανω στα 2αδικα δεντρα αλλα τιποτα παραπανω... μηπως ξερεται να μου υποδειξεται καποια βιβλια για να διαβασω ή οτιδηποτε σημειωση στο internet με τα 2-3 δεντρα? ( στα ελληνικα να ειναι! )

  • 2 μήνες μετά...
Δημοσ.

μηπως θα μπορουσατε να μου πειτε που μπορω να βρω και κωδικα (C,C++,JAVA...).για το πως κανουμε εισαγωγή στοιχείων,διαγραφή,αναζήτηση,update και διαφορα αλλα μεσα σε 2-3 δεντρά?

Δημοσ.

εδω ειναι καποια κομματια που εχω κανει τα οποία χρειάζονται κάποιες διορθώσεις...

 

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

struct data {
   unsigned int am;
   int data_pointer;
};

struct mathitis {
   unsigned int am;
   char name[20];
   char lastname[20];
   char address[30];
   char eksamino_eggrafis[5];
   int mathimata;
};

struct deiktes {
   int entries;
   struct data small;
   struct data big;
   struct deiktes *left, *middle, *right, *parent;
};

struct deiktes *root = NULL;

void Update() {
   FILE *eggrafes;
   unsigned int key;
   struct deiktes * res;
   struct mathitis rec;
   eggrafes = fopen("mathitis_data.dat", "rb");
   printf("dwse arithmo mhtroou:");
   scanf("%d", &key);
   res = Search(root, key);
   fseek(eggrafes, res->small.data_pointer, SEEK_SET);
   fread(&rec, sizeof (struct mathitis), 1, eggrafes);
   printf("\nDwse kainouria stoixeia\n");
   printf("onoma: %s\n", rec.name);
   scanf("%s", &rec.name);
   printf("epitheto: %s\n", rec.lastname);
   scanf("%s", &rec.lastname);
   printf("diefthinsi: %s\n", rec.address);
   scanf("%s", &rec.address);
   printf("eksamino eggrafis: %s\n", rec.eksamino_eggrafis);
   scanf("%s", &rec.eksamino_eggrafis);
   printf("enapominanta mathimata: %d\n", rec.mathimata);
   scanf("%d", &rec.mathimata);
   fwrite(&rec, sizeof (struct mathitis), 1, eggrafes);
   fclose(eggrafes);

}

struct deiktes Open(void) {
   FILE *eggrafes, *deiktes;
   struct deiktes *k, *i;
   struct mathitis a;
   int meg;
   //struct deiktes *root;    
   unsigned int key;
   eggrafes = fopen("mathitis_data.dat", "rb");
   deiktes = fopen("mathitis_deiktes.dat", "rb");
   if (!eggrafes || !deiktes) {
       printf("Sfalma sto Anoigma Arxeion \n");
       fclose(eggrafes);
       fclose(deiktes);
       exit(1);
   }
   fread(&a, sizeof (struct mathitis), 1, deiktes);
   while (!feof(deiktes)) {
       i = Search(&root, key);
       //root = Insert(root, i,data);
       fread(&a, sizeof (struct mathitis), 1, deiktes);
   }

   fclose(deiktes);
}

void Create(void) {
   FILE *eggrafes, *deiktes;
   eggrafes = fopen("mathitis_data.dat", "wb");
   deiktes = fopen("mathitis_deiktes.dat", "wb");
   if (!eggrafes || !deiktes) {
       printf("Sfalma Dimiourgias Arxeion \n");
       fclose(eggrafes);
       fclose(deiktes);
       exit(1);
   }
}

void Close(struct deiktes *root) {
   FILE *pointer;
   pointer = fopen("mathitis_deiktes.ndx", "wb");
   if (!pointer) {
       printf("Sfalma sto Anoigma Arxeion \n");
       exit(1);
   }
   inOrder(root, pointer);
   fclose(pointer);
}

void inOrder(struct deiktes *n, FILE *f) {
   if (n->left != NULL) inOrder(n->left, f);
   if (n->small != NULL)
       fwrite(&n->small, sizeof (struct data), 1, f);
   if (n->middle != NULL) inOrder(n->middle, f);
   if (n->big != NULL) fwrite(&n->big, sizeof (struct data), 1, f);
   fwrite(&n->small, sizeof (struct data), 1, f);
   if (n->right != NULL) inOrder(n->right, f);
}

struct deiktes * Search(struct deiktes *current, unsigned int key) {
   while (current != NULL) {
       if (key == current->small.am)
           return current;
       else if (key < current->small.am)
           current = current->left;
       else if (key > current->small.am && current->entries == 1)
           current = current->right;
       else if (key > current->big.am && current->entries == 2)
           current = current->right;
       else if (key == current->big.am && current->entries == 2)
           return current;
       else
           current = current->middle;
   }
   return current;
}

void Emfanisi_eggrafis(struct deiktes *m, int temp) {
   FILE *pointer;
   struct mathitis math;
   pointer = fopen("mathitis_data.dat", "rb");
   if (m->small.am == temp) {
       fseek(pointer, m->small.data_pointer, SEEK_SET);
       fread(&math, sizeof (struct mathitis), 1, pointer);
       printf("\n======== record ========\n");
       printf("arithmos mitroou: %llu\n", math.am);
       printf("onoma: %s\n", math.name);
       printf("epitheto: %s\n", math.lastname);
       printf("diefthinsi: %s\n", math.address);
       printf("eksamino eggrafis: %s\n", math.eksamino_eggrafis);
       printf("enapominanta mathimata: %d\n", math.mathimata);
       printf("========================\n\n");
   } else {
       fseek(pointer, m->big.data_pointer, SEEK_SET);
       fread(&math, sizeof (struct mathitis), 1, pointer);
       printf("\n======== record ========\n");
       printf("arithmos mitroou: %llu\n", math.am);
       printf("onoma: %s\n", math.name);
       printf("epitheto: %s\n", math.lastname);
       printf("diefthinsi: %s\n", math.address);
       printf("eksamino eggrafis: %s\n", math.eksamino_eggrafis);
       printf("enapominanta mathimata: %d\n", math.mathimata);
       printf("========================\n\n");
   }
   fclose(pointer);
}

void Read() {
   unsigned long long key;
   struct deiktes *d;
   printf("dose arithmo mitroou: ");
   scanf("%d", key);
   d = Search(root, key);
   Emfanisi_eggrafis(d, key);
}

void menu()
{int epilogi;
    do {
         printf("1) Dimiourgia twn arxeiwn deiktwn kai eggrafwn\n");
         printf("2) Dimiourgia ths domhs deiktwn\n");
         printf("3) Apothikeush twn deiktwn ths domhs sto arxeio deiktwn\n");
         printf("4) Anazhthsh mia eggrafhs me vash ton arithmo mitrwou\n");
         printf("5) Diorthosi mias eggrafis\n");
         printf("0) Eksodos\n");
         printf("\nEpilogi: ");
         scanf("%d",&epilogi);
         switch (epilogi) {
              case 1:
                   Create();
                   break;
              case 2:
                   Open();
                   break;
              case 3:
                   Close(root);
                   break;
              case 4:
                   Read();
                   break;
              case 5:
                   Update();
                   break;
              case 0:
                    exit(0);
                   break;
              default:
                  printf("\nλαθος επιλογη\n");
         }
    } while (1);
}

int main(void) {
   menu();
   return 0;
}

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

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

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