Предупреждение о компиляции C: передача аргумента 1 ‘insert’ из несовместимого типа указателя [включено по умолчанию]

#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 typestruct 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 typestruct 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 typestruct 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 typestruct 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 typestruct 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 typestruct 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);
}