#c #pointers #warnings
#c #указатели #предупреждения
Вопрос:
/*Implementation of Binary Tree*/
#include <stdio.h>
#include <ncurses.h>
#include <malloc.h>
#include <stdlib.h>
struct bin_tree
{
int INFO;
struct node *LEFT, *RIGHT;
};
typedef struct bin_tree node;
node *insert(node *,int); /*Function prototype for insering a new node*/
void display(node *); /*Function prototype fpr displaying the tree nodes*/
int count=1; /*counter for ascertaining left or right position for the new node*/
int main()
{
struct node *root = NULL;
int element, choice;
clear();
/*Displaying a menu of choices*/
while(1)
{
clear();
printf("n Select an optionn");
printf("n1 - Insert");
printf("n2 - Display");
printf("n3 - Exit");
printf("nnEnter your choice: ");
scanf("%d",amp;choice);
switch(choice)
{
case 1:
{
printf("nn Enter the node value: ");
scanf("%d", amp;element);
root = insert(root, element); /*calling the insert function for inserting a new element into the tree*/
getch();
break;
}
case 2:
{
display(root); /*calling the display function for printing the node values*/
getch();
break;
}
case 3:
{
exit(1);
break;
}
default:
{
printf("n incorrect choice.Please try again.");
getch();
break;
}
}
}
}
node *insert(node *r, int n)
{
if(r==NULL)
{
r=(node*)malloc(sizeof(node));
r->LEFT = r->RIGHT = NULL;
r->INFO = n;
count = count 1;
}
else
{
if(count%2==0)
r->LEFT = insert(r->LEFT,n);
else
r->RIGHT = insert(r->RIGHT,n);
}
return(r);
}
void display(node *r)
{
if(r->LEFT!=NULL)
display(r->LEFT);
printf("%dn",r->INFO);
if(r->RIGHT!=NULL)
display(r->RIGHT);
}
gcc -Wall -c "BinaryTree.c" (in directory: /home/dere/IGNOUPROGRAMS/C)
BinaryTree.c: In function ‘main’:
BinaryTree.c:46:5: warning: passing argument 1 of ‘insert’ from incompatible pointer type [enabled by default]
BinaryTree.c:16:7: note: expected ‘struct node *’ but argument is of type ‘struct node *’
BinaryTree.c:46:10: warning: assignment from incompatible pointer type [enabled by default]
BinaryTree.c:53:5: warning: passing argument 1 of ‘display’ from incompatible pointer type [enabled by default]
BinaryTree.c:17:6: note: expected ‘struct node *’ but argument is of type ‘struct node *’
BinaryTree.c: In function ‘insert’:
BinaryTree.c:86:3: warning: passing argument 1 of ‘insert’ from incompatible pointer type [enabled by default]
BinaryTree.c:74:7: note: expected ‘struct node *’ but argument is of type ‘struct node *’
BinaryTree.c:86:11: warning: assignment from incompatible pointer type [enabled by default]
BinaryTree.c:88:3: warning: passing argument 1 of ‘insert’ from incompatible pointer type [enabled by default]
BinaryTree.c:74:7: note: expected ‘struct node *’ but argument is of type ‘struct node *’
BinaryTree.c:88:12: warning: assignment from incompatible pointer type [enabled by default]
BinaryTree.c: In function ‘display’:
BinaryTree.c:96:2: warning: passing argument 1 of ‘display’ from incompatible pointer type [enabled by default]
BinaryTree.c:93:6: note: expected ‘struct node *’ but argument is of type ‘struct node *’
BinaryTree.c:99:2: warning: passing argument 1 of ‘display’ from incompatible pointer type [enabled by default]
BinaryTree.c:93:6: note: expected ‘struct node *’ but argument is of type ‘struct node *’
Compilation finished successfully.
Был бы признателен за любую помощь по этой ошибке.
Комментарии:
1. сначала вам нужно добавить прямое объявление узла структуры, который используется в struct bin_tree.
Ответ №1:
Объявляйте root
как тип самого node *
себя в main()
функции. Нет необходимости объявлять как struct node *
.
node *root = NULL;
Как root
есть typedef
для struct bin_tree
.
Предупреждение связано с несоответствием объявления. Поскольку insert()
функция определяется как node *insert(node *,int);
, но корневая переменная определяется как struct node *
и передается в качестве аргумента insert()
функции.
Ответ №2:
кажется, ваш код неверен, вероятно, попробуйте так.вам нужно передать адрес root, чтобы вставить указатель на функцию, как показано ниже:
root = insert(amp;root, element);
node *insert(node **r, int n)
{
struct node* temp = NULL;
struct node *q = NULL;
q = *r;
if(q==NULL)
{
temp=(node*)malloc(sizeof(node));
temp->LEFT = temp->RIGHT = NULL;
temp->INFO = n;
count = count 1;
}
else
{
if(count%2==0)
temp->LEFT = insert(temp->LEFT,n);
else
temp->RIGHT = insert(temp->RIGHT,n);
}
return(temp);
}