несовместимое неявное объявление функции - PullRequest
1 голос
/ 23 февраля 2012

Я пытаюсь написать реализацию HashTable на C и получаю сообщение об ошибке «несовместимое неявное объявление функции insertnode», «здесь было предыдущее объявление). Я не могу понять, что может быть не такв этом коде.

Что-то ломается, когда я вызываю метод insertnode из метода "put".

#include<stdlib.h>
#include<stdio.h>
typedef struct list{
  int data;
  struct list *next;
  struct list * prev;
}list;
typedef struct hash_table{
  int size;
  struct  list ** table;
}hash_table;
int main(){
  int hash(int);
  list* insertnode(list*,int);
  void put(hash_table* ,int);
  list* findnode(list*,int);
  list* get(hash_table*,int);
  hash_table* ht = (hash_table *)malloc(sizeof(hash_table));
  ht->table = (list **)malloc(sizeof(list *)*10);
  int a[]={12,22,33,45,56,12,23,444,44,56,23};
  int i=0;
  for(i=0;i<10;i++)
    ht->table[i]=(list *)malloc(sizeof(list));
  for(i=0;i<11;i++){
    list * node=get(ht,a[i]);
    if(node!=NULL)
    put(ht,a[i]);
    else
      printf("DUPLICATE %d",node->data);
  }
}
void put(hash_table* ht,int data){
int index =  hash(data);
//insert at head of ht->table[index]
 (ht->table)[index]=(list *) insertnode((ht->table)[index],data);
}

list* insertnode(list * head,int data){
  list * newhead = (list *)malloc(sizeof(list));
  newhead->data = data;
  newhead->next = head;
  head->prev = newhead;
  newhead->prev = NULL;
    return newhead;
}

int hash(int data){
  return data%10;
}

list* get(hash_table* ht,int data){
  int index = hash(data);
  list *node=findnode((ht->table)[index],data);
  return node;
}

list* findnode(list* head,int data){
  while(head!=NULL){
    if(head->data==data)
      return head;
    head = head->next;
  }
  return NULL;
}

1 Ответ

2 голосов
/ 23 февраля 2012

Вы объявляете insertnode внутри вашей функции main. Эта декларация не видна снаружи main.

Затем вы вызываете insertnode внутри вашей функции put. На данный момент нет видимого объявления insertnode. Начиная с C99, это нарушение ограничения.

Затем вы определяете insertnode после определения put.

Решение - сделать так, чтобы объявления для всех ваших функций были видимы при их вызове.

Редко имеет смысл объявлять функции внутри других функций. Для такой маленькой программы без рекурсии вы можете просто упорядочить свои определения, чтобы все было видно при вызове. Или вы можете поместить отдельные объявления вверху файла перед любым определением вашей функции. (В более крупной программе ваши объявления будут в заголовочном файле .h.)

Функция объявление выглядит примерно так:

list *insertnode(list*, int);

Это позволяет компилятору обрабатывать вызовы функции.

A Definition включает в себя блок { /* ... */ }, который определяет, что делает функция. Он также предоставляет декларацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...