Почему я получаю ошибки при передаче массива указателя на узел структуры функции createHa sh ()? - PullRequest
1 голос
/ 18 февраля 2020

Недавно я изучил отдельную технику цепочки хеширования и попыток написать программу C, которая будет печатать двоичное дерево в вертикальном порядке, когда я передаю массив ha sh, который является массивом указателей на struct node для createHa. sh () функция я получаю следующие ошибки. Спасибо заранее, чтобы сообщить мне, что на самом деле я делаю неправильно.

#include<stdio.h>
#include<stdlib.h>
struct node
{
    int data;
    struct node* next;
};
struct BTnode
{
    int data;
    struct BTnode* Lchild;
    struct BTnode* Rchild;
};
void findmin_max(struct BTnode* root,int *min,int *max,int hd)
{
    if(root==NULL)
    return;
    if(hd<*min) 
    {
        *min=hd;
    }
    else if(hd>*max) 
    {
        *max=hd;
    }
    findmin_max(root->Lchild,min,max,hd-1);
    findmin_max(root->Rchild,min,max,hd+1);
}   
struct BTnode* newNode(int data)
{
    struct BTnode* newnode=(struct BTnode*)malloc(sizeof(struct BTnode));
    newnode->data=data;
    newnode->Lchild=NULL;
    newnode->Rchild=NULL;
    return newnode;
}
struct node* insertnode(struct BTnode* root,int ln,int hd)
{
    if(root==NULL);
    return root;
        else if(hd==ln)
    {       
        struct node* nw=(struct node*)malloc(sizeof(struct node));
        nw->data=root->data;
        nw->next=NULL;
        return nw;
    }
    insertnode(root,ln,hd-1);
    insertnode(root,ln,hd+1);
}   
void createHash(struct BTnode* root,struct node* hash,int min,int max,int hd)
{       
    int key=0;
    for(int line_no=min;line_no<=max;line_no++)
    {        
         key=line_no+abs(min);
         if((hash[key])==NULL)
             (hash[key])=insertnode(root,line_no,0);
         else
         {
             struct node* temp=(hash[key]);
             while(temp->next!=NULL)
             {
                 temp=temp->next;
             }
             temp->next=insertnode(root,line_no,0);
         }
    }
}
int main()
{       
    struct BTnode* root;
    int min=0;
    int max=0;
        root = newNode(1); 
        root->Lchild = newNode(2); 
        root->Rchild = newNode(3); 
        root->Lchild->Rchild = newNode(4); 
        root->Lchild->Rchild = newNode(5); 
        root->Rchild->Lchild = newNode(6); 
        root->Rchild->Rchild = newNode(7); 
        root->Rchild->Lchild->Rchild = newNode(8); 
        root->Rchild->Rchild->Rchild = newNode(9); 
    findmin_max(root,&min,&max,0);
    int N=abs(min-max);

    struct node* hash[N];

        for(int i=0;i<N;i++)
        hash[i]=NULL;
    createHash(root,hash,min,max,0);
    return 0;
} 

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

Эти ошибки, которые я получаю при компиляции в Linux терминал.

BT_vertical.c: In function ‘insertnode’:
BT_vertical.c:40:9: warning: returning ‘struct BTnode *’ from a function with incompatible return type ‘struct node *’ [-Wincompatible-pointer-types]
  return root;
         ^~~~
BT_vertical.c:41:9: error: ‘else’ without a previous ‘if’
         else if(hd==ln)
         ^~~~
BT_vertical.c: In function ‘createHash’:
BT_vertical.c:57:18: error: invalid operands to binary == (have ‘struct node’ and ‘void *’)
    if((hash[key])==NULL)
       ~~~~~~~~~~~^~
BT_vertical.c:58:19: error: incompatible types when assigning to type ‘struct node’ from type ‘struct node *’
        (hash[key])=insertnode(root,line_no,0);
                   ^
BT_vertical.c:61:23: error: incompatible types when initializing type ‘struct node *’ using type ‘struct node’
     struct node* temp=(hash[key]);
                       ^
BT_vertical.c: In function ‘main’:
BT_vertical.c:91:18: warning: passing argument 2 of ‘createHash’ from incompatible pointer type [-Wincompatible-pointer-types]
  createHash(root,hash,min,max,0);
                  ^~~~
BT_vertical.c:51:50: note: expected ‘struct node *’ but argument is of type ‘struct node **’
 void createHash(struct BTnode* root,struct node* hash,int min,int max,int hd)
                                     ~~~~~~~~~~~~~^~~~

1 Ответ

0 голосов
/ 18 февраля 2020
  • struct node* insertnode(struct BTnode* root,int ln,int hd) возвращает значение типа struct node*, но return root; возвращает переменную типа struct BTnode* - так что вы можете просто изменить это значение на return NULL;
  • Также в пределах insertnode : Когда ни условие root == NULL, ни hd == ln не выполняется, возвращаемое значение для этой функции полностью отсутствует
  • Далее вы передаете hash (массив типа struct node*) в void createHash(struct BTnode* root,struct node* hash,int min,int max,int hd) - для того, чтобы он был скомпилирован, вам нужно изменить аргумент функции на struct node** hash или struct node* hash[]

Но вы должны действительно разобраться в том, что говорит вам компилятор, и попытаться понять, что вы сделали неправильно - эти сбои вполне очевидны

...