Я хочу напечатать 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, но печать все еще не печатается.