У меня проблема с печатью и вставкой avl - PullRequest
0 голосов
/ 06 мая 2020

Я хочу напечатать avl вот так

    cccccc:1234567890

aaaaaaa:1234567891

    bbbbbb:1234567889
#include <string.h>
#include <stdlib.h>

struct data{
    char nim[15];
    char nama[95];
    int height;
    struct data *left, *right;
};

struct data *newData(char nim[], char nama[]){
    struct data *curr = (struct data *)malloc(sizeof(struct data));
    strcpy(curr -> nim, nim);
    strcpy(curr -> nama, nama);
    curr -> height = 1;
    curr -> left = NULL;
    curr -> right = NULL;
}

int max(int a, int b){
    if(a > b){
        return a;
    }
    else{
        return b;
    }
}

int getHeight(struct data *root){
    if(root == NULL){
        return 0;
    }
    return root -> height;
}

struct data *rotateLeft(struct data *root){
    struct data *x = root -> right;
    struct data *y = x -> left;

    x -> left = root;
    root -> right = y;
    root -> height = max(getHeight(root -> left), getHeight(root -> right)) + 1;
    x -> height = max(getHeight(root -> left), getHeight(root -> right)) + 1;
    return x;
}

struct data *rotateRight(struct data *root){
    struct data *x = root -> left;
    struct data *y = x -> right;

    x -> right = root;
    root -> left = y;
    root -> height = max(getHeight(root -> right), getHeight(root -> left)) + 1;
    x -> height = max(getHeight(root -> right), getHeight(root -> left)) + 1;
    return x;
}

struct data *insert(struct data *root, char nim[], char nama[]){
    struct data *curr = newData(nim, nama);
    if(root == NULL){
        return curr;
    }
    else if(strcmp(nim, root -> nim) > 0){
        root -> right = insert(root -> right, nim, nama);
    }
    else if(strcmp(nim, root -> nim) < 0){
        root -> left = insert(root -> left, nim, nama);
    }



    strcpy(curr -> nama, nama);

    root -> height = max(getHeight(root -> right), getHeight(root -> left)) + 1;

    int balanceFactor = getHeight(root -> left) - getHeight(root -> right);

    if(balanceFactor > 1 && strcmp(nim, root -> left -> nim) < 0){
        return rotateRight(root);
    }
    if(balanceFactor < -1 && strcmp(nim, root -> right -> nim) > 0){
        return rotateLeft(root);
    }
    if(balanceFactor > 1 && strcmp(nim, root -> left -> nim) > 0){
        root -> left = rotateLeft(root);
        return rotateRight(root);
    }
    if(balanceFactor < -1 && strcmp(nim, root -> right -> nim) < 0){
        root -> right = rotateRight(root);
        return rotateLeft(root);
    }


}

struct data *predesesor(struct data *root){
    while(root -> right != NULL){
        root = root -> right;
    }
    return root;
}

struct data *deletes(struct data *root, char nim[]){
    if(root == NULL){
        return NULL;
    }
    else if(strcmp(nim, root -> nim) < 0){
        root -> left = deletes(root -> left, nim);
    }
    else if(strcmp(nim, root -> nim) > 0){
        root -> right = deletes(root -> right, nim);
    }
    else{
        if(root -> left == NULL || root -> right == NULL){
            struct data *temp = root -> left;

            if(temp == NULL){
                temp = root -> right;
            }
            if(temp == NULL){
                temp = root;
                root = NULL;
            }
            else{
                *root = *temp;
            }
            free(temp);
        }
        else{
            struct data *temp = predesesor(root -> left);
            strcpy(root -> nim, temp -> nim);
            root -> left = deletes(root -> left, temp -> nim);
        }
    }
    if(root == NULL){
        return root;
    }

    root -> height = max(getHeight(root -> right), getHeight(root -> left)) + 1;

    int balanceFactor = getHeight(root -> left) - getHeight(root -> right);

    if(balanceFactor > 1 && strcmp(nim, root -> left -> nim) < 0){
        return rotateRight(root);
    }
    if(balanceFactor < -1 && strcmp(nim, root -> right -> nim) > 0){
        return rotateLeft(root);
    }
    if(balanceFactor > 1 && strcmp(nim, root -> left -> nim) > 0){
        root -> left = rotateLeft(root);
        return rotateRight(root);
    }
    if(balanceFactor < -1 && strcmp(nim, root -> right -> nim) < 0){
        root -> right = rotateRight(root);
        return rotateLeft(root);
    }


}

bool cariDuplikat(struct data* root, char nim[]){
    while(root != NULL){
        if(strcmp(nim, root -> nim) > 0){
            root = root -> right;
        }
        else if(strcmp(nim, root -> nim) < 0){
            root = root -> left;
        }
        else{
            return true;
        }
    }
    return false;
}

//void printAll(struct data *root){
//  if(root == NULL){
//      return;
//  }
//  int tab = getHeight(root);
//  for(int i = 0; i < tab - 1; i++){
//      printf("\t");
//  }
//  printf("%s: %s\n", root -> nim, root -> nama);
//  printAll(root -> left);
//  printAll(root -> right);
//}

void printAll(struct data *root){
    printf("test\n");
//    if(root == NULL){
//        return;
//        printf("test");
//    }
//    int tab = getHeight(root);
//    for(int i = 0; i < tab - 1; i++){
//        printf("\t");
//    }
//    printf("%s : %s", root -> nim, root -> nama);
//    printAll(root -> left);
//    printAll(root -> right);
    if(root != NULL)
    {
        int tab = getHeight(root);
        for(int i = 0; i < tab - 1; i++){
            printf("\t");
        }
        printf("%s : %s\n", root -> nim, root -> nama);
        printAll(root->left);
        printAll(root->right);
    }
    else
    {
        printf("root null");
    }
}

void mainmenu(){
    printf("\n  bisanara.co\n");
    printf("===============\n");
    printf("1. Insert\n");
    printf("2. View\n");
    printf("3. Delete\n");
    printf("4. Exit\n");
    printf(">> ");
}



int main(){
    int userInput;
    struct data *root = NULL;
    do{
        mainmenu();
        scanf("%d", &userInput); getchar();
        switch(userInput){
            case 1:{
                system("cls");
                char nama[95];
                char nim[15];
                int panjangNama = 0;
                int panjangNim = 0;

                for(int i = 0; i < 95; i++){
                    nama[i] = NULL;
                }
                for(int i = 0; i < 15; i++){
                    nim[i] = NULL;
                }

                do{
                    printf("Input name ( 5 - 90 characters ):\n");
                    scanf("%[^\n]", &nama); getchar();
                    panjangNama = strlen(nama);
                }while(panjangNama < 5 || panjangNama > 90);

                do{
                    printf("Input NIM ( 10 characters ):\n");
                    scanf("%s", &nim); getchar();
                    panjangNim = strlen(nim);
                }while(panjangNim < 10 || panjangNim > 10);

                bool valid = cariDuplikat(root, nim);

                if(valid == true){
                    printf("NIM already Present!\n");
                }
                else{
                    root = insert(root, nama, nim);
                    //printf("tes\n");
                    printf("Success insert!\n");
                }


                getchar();
                system("cls");

                break;
            }
            case 2:{
                system("cls");
                if(root == NULL){
                    printf("No data\n");
                    getchar();
                    system("cls");
                    break;
                }
                printf("awal");
                printAll(root);
                printf("akhir");
                getchar();
                system("cls");
                break;
            }
            case 3:{
                system("cls");
                char nim[15];
                int panjangNim = 0;

                do{
                    printf("Input NIM ( 10 characters ):\n");
                    scanf("%s", &nim); getchar();
                    panjangNim = strlen(nim);
                }while(panjangNim < 10 || panjangNim > 10);

                bool valid = cariDuplikat(root, nim);

                if(valid == true){
                    deletes(root, nim);
                }
                else{
                    printf("No such NIM!\n");
                }

                getchar();
                system("cls");
                break;
            }
        }
    }while(userInput != 4);

    printf("Thank you and Good Bye!\n");

    return 0;
}

это мой код, я уже меняю и пытаюсь выполнить поиск в inte rnet, но все равно ничего не работает. Я не уверен, что проблема в вставке или печати, потому что printAll ничего не возвращает, даже если там есть freepass printf. Я уже пытаюсь использовать указатель char, но все еще не работаю, затем я меняю его на обычный массив char, но печать все еще не печатается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...