2015-05-29 3 views
0

Я пытаюсь напечатать все уникальные элементы заданного массива, используя двоичное дерево поиска.Печать всех уникальных элементов массива

Что я делаю:

  1. Входные все числа в массиве.
  2. Поиск для каждого элемента массива один за другим, в BST,
    • если (элемент не найден в BST)
      • его туда и распечатать его
    • еще
      • перейти к следующему элементу

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

struct node 
{ 
    int data; 
    struct node* left; 
    struct node* right; 
} *root = NULL; 

void insert(struct node *n, int value) 
{ 
    if (n == NULL) 
    { 
     n = (struct node*)malloc(sizeof(struct node)); 
     n->data = value; 
     n->left = NULL; 
     n->right = NULL; 
     printf("%d ", value); 
     return; 
    } 

    if ((n->data) == value) 
     return; 
    if ((n->data) > value) 
     insert(n->left, value); 
    else 
     insert(n->right, value); 
} 

int main() 
{ 
    int a[100], i, n; 
    printf("Enter the number of elements : "); 
    scanf("%d",&n); 
    for (i = 0; i < n; i++) 
     scanf("%d",&a[i]); 
    printf("After removal of duplicates, the new list is : \n"); 
    for (i = 0; i < n; i++) 
     insert(root, a[i]); 
    printf("\n"); 
    return 0; 
}  
+7

И каков ваш вопрос? – SBI

ответ

0

Ваш код имеет несколько ошибок, ваша функция вставки, должна возвращать структура узла *, иначе вы не сможете построить бинарное дерево поиска. В вашем исходном коде при вызове вставки вы всегда вызываете пустой узел.

Это то, что вы должны делать, с минимальными изменениями.

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

struct node 
{ 
    int data; 
    struct node* left; 
    struct node* right; 
} *root = NULL; 

struct node* insert(struct node *n, int value) 
{ 
    if (n == NULL){ 
     n = (struct node*)malloc(sizeof(struct node)); 
     n->data = value; 
     n->left = NULL; 
     n->right = NULL; 
     printf("inserted %d\n", value); 
     return n; 
    }else{ 
     if(value == n->data){ 
      printf("Duplicated Value %d\n", value); 
      return n; 
     } 
     if ((n->data) > value){ 
      n->left = insert(n->left, value); 
     }else{ 
      n->right = insert(n->right, value); 
     } 
     return n; 
    } 
} 

int main() 
{ 
    int a[100], i, n; 
    printf("Enter the number of elements : "); 
    scanf("%d",&n); 
    for (i = 0; i < n; i++) 
     scanf("%d",&a[i]); 
    printf("After removal of duplicates, the new list is : \n"); 
    for (i = 0; i < n; i++) 
     root = insert(root, a[i]); 
    printf("\n"); 
    return 0; 
} 

Кстати, this должен быть полезным и это тестирование example. ;)

Вы должны создать массив AFTER, вы знаете размер, иначе вы можете выделить слишком много памяти. И, конечно, вы должны дать пользователю возможность создать бинарное дерево с более чем 100 элементов

int i, n; 
printf("Enter the number of elements : "); 
scanf("%d",&n); 
int a[n]; 
0

Первое: Не возвращайте в аннулируются .. но если вы хотите, чтобы вам необходимо вернуть адрес дерево, потому что его изменение каждый раз, когда вы вызываете функцию! В ваших прошлом код, который вы должны отправить другое дерево каждый раз, когда узел не связан с его левым и правым ..

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

struct node 
{ 
    int data; 
    struct node* left; 
    struct node* right; 
} *root = NULL; 

struct node* insert(struct node *n, int value) 
{ 

    if (n == NULL){ 
     n = (struct node*)malloc(sizeof(struct node)); 
     n->data = value; 
     n->left = NULL; 
     n->right = NULL; 
     printf("%d ", value); 
     return n; 
    } 

    else if(value == n->data) 
       return n; 

    else if ((n->data) > value) 
       n->left = insert(n->left, value); 

     else 
      insert(n->right, value); 

     return n; 
    } 


int main() 
{ 
    int a[100], i, n; 
    printf("Enter the number of elements : "); 
    scanf("%d",&n); 
    for (i = 0; i < n; i++) 
     scanf("%d",&a[i]); 
    printf("After removal of duplicates, the new list is : \n"); 
    for (i = 0; i < n; i++) 
     root = insert(root, a[i]); 
    printf("\n"); 
    return 0; 
} 

Ps: парень там вам сказать:

int i, n; 
printf("Enter the number of elements : "); 
scanf("%d",&n); 
int a[n]; 

вы не можете сделать что в c !! вы должны знать размер стола, который не может сделать таблицу с длиной, является переменной! (для выделения размера, который нужно просто в C Применение связанный список)

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

    struct node 
{ 
    int data; 
    struct node* left; 
    struct node* right; 
} *root = NULL; 

struct node* insert(struct node *n, int value) 
{ 

    if (n == NULL){ 
    n = (struct node*)malloc(sizeof(struct node)); 
    n->data = value; 
    n->left = NULL; 
    n->right = NULL; 
    printf("%d ", value); 
    return n; 
} 

else if(value == n->data) 
      return n; 

else if ((n->data) > value) 
      n->left = insert(n->left, value); 

    else 
     insert(n->right, value); 

    return n; 
} 


int main() 
{ 
    int a[100], i, n; 
    printf("Enter the number of elements : "); 
    scanf("%d",&n); 
    for (i = 0; i < n; i++) 
    scanf("%d",&a[i]); 
    printf("After removal of duplicates, the new list is : \n"); 
    for (i = 0; i < n; i++) 
    root = insert(root, a[i]); 
    printf("\n"); 
    return 0; 
} 

Вы можете изменить код для динамического распределения.

int *a,n; 
scanf("%d",n); 
a = (int)malloc(n*sizeof(int)); 
Смежные вопросы